[示例代码] 看了官方这个例子,我学到了不少写延时函数技能

[复制链接]
7633|30
 楼主| jiekou001 发表于 2021-4-25 15:19 | 显示全部楼层 |阅读模式
  1. /****************************************************************************************
  2. *
  3. * 文件名: main.c
  4. * 项目名: 14-LED_8x8
  5. * 版 本: v1.0
  6. * 日 期: 2016年05月31日 15时33分45秒
  7. * 作 者: Administrator
  8. * 程序说明:8X8LED模块循环显示Led_Power_Code[8]中的数据。
  9. * 适用芯片: KF8FXXX系列——KF8F2156、KF8F3156、KF8F4156
  10. *                         KF8TSXXXX系列——KF8TS2716、KF8TS2516(4x8LED)
  11. *                         KF8VXXX系列——KF8V327、KF8V427、KF8V429
  12. ****************************************************************************************/
  13. #include<KF8TS2716.h>
  14. //定义段码
  15. char const smg_arr[] =         {
  16.                                                                   0Xa0,  //0
  17.                                                           0Xbe,  //1
  18.                                                           0X62,  //2
  19.                                                           0X2a,  //3
  20.                                                           0X3c,  //4
  21.                                                           0X29,  //5
  22.                                                           0X21,  //6
  23.                                                           0Xba,  //7
  24.                                                           0X20,  //8
  25.                                                           0X28,  //9
  26.                                                           0xff,  //关
  27.                                                           0xdf,        //:
  28.                                                         };
  29. int const Led_Power_Code[8] =         {
  30.                                          0X00C8,  //200
  31.                                                                    0X0190,  //400
  32.                                                                    0X0320,  //800
  33.                                                                    0X03E8,  //1000
  34.                                                                    0X0514,  //1300
  35.                                                                    0X0640,  //1600
  36.                                                                    0X0708,  //1800
  37.                                                                    0X0834,  //2100
  38.                                                             };
  39. int display_data;
  40. unsigned int  temp_data;
  41. unsigned char unint,decade,hundred,thound;
  42. //;************************************************************************************
  43. //;* 函 数 名:  delay_ms
  44. //;* 函数功能: 延时函数
  45. //;* 入口参数: 无
  46. //;* 返    回:  无
  47. //;************************************************************************************
  48. void delay_ms(int ms_data)
  49. {
  50.         int j=0;
  51.         while(ms_data--)
  52.         {
  53.                 _CWDT();
  54.                 j=100;
  55.                 while(j--);
  56.         }
  57. }
  58. /****************************************************************************************
  59. * 函数名:   init_mcu
  60. * 函数功能:mcu初始化函数
  61. * 入口参数:无
  62. * 返回:       无
  63. ****************************************************************************************/
  64. void init_mcu()
  65. {
  66.         /***时钟初始化****/
  67.         OSCCTL = 0x60;          //设置为8M
  68.         /***端口初始化****/
  69.         TR0 = 0X04;            //P02设置为输入,其余口为输出
  70.         TR1 = 0x00;            //P1设置为输出
  71.         TR2 = 0X00;            //P2设置为输出
  72.         TR3 = 0X00;            //P3设置为输出

  73.     P0LR=0x00;                                //P0输出低
  74.     P1LR=0x00;              //P1输出低
  75.     P2LR=0x00;                                //P2输出低
  76.     P3LR=0x00;                                //P3输出低

  77.     P0=0x00;
  78.     P1=0x00;
  79.     P2=0x00;
  80.     P3=0x00;
  81. }
  82. /****************************************************************************************
  83. * 函数名:   init_led()
  84. * 函数功能:LED初始化函数
  85. * 入口参数:无
  86. * 返回:       无
  87. ****************************************************************************************/
  88. void init_led()
  89. {
  90.         LEDOMS0 = 0x00;    //推挽输出
  91.         LEDOMS1 = 0x00;    //推挽输出

  92.         LEDPRE = 0x60;     //LED时钟源选择1:64分频;LED预分频比选择1:1 500hz
  93.         LEDDATA0 = 0XFF;
  94.         LEDDATA2 = 0XFF;
  95.         LEDDATA3 = 0XFF;
  96.         LEDDATA4 = 0XFF;

  97.         LEDLUM = 0x05;         //设置辉度6:16
  98.         LEDCTL = 0x90;   //打开LED模块,开通LEDDAT0--LEDDAT4;选择共阴数码管
  99. }
  100. /****************************************************************************************
  101. * 函数名:   display_LED()
  102. * 函数功能:LED显示
  103. * 入口参数:无
  104. * 返回:       无
  105. ****************************************************************************************/
  106. void display_LED()
  107. {
  108.         DIVAH = display_data>>8;
  109.         DIVAL = display_data;
  110.         DIVB = 10;
  111.         DIVEN = 1;
  112.         while(!DIVOEN);
  113.         unint = DIVR;   //        取余数
  114.         temp_data = DIVQH;
  115.         temp_data = (temp_data<<8) + DIVQL;
  116.         DIVAH = temp_data>>8;
  117.         DIVAL = temp_data;
  118.         DIVB = 10;
  119.         DIVEN = 1;
  120.         while(!DIVOEN);
  121.         decade = DIVR;   //        取余数
  122.         temp_data = DIVQH;
  123.         temp_data = (temp_data<<8) + DIVQL;
  124.         DIVAH = temp_data>>8;
  125.         DIVAL = temp_data;
  126.         DIVB = 10;
  127.         DIVEN = 1;
  128.         while(!DIVOEN);
  129.         hundred = DIVR;
  130.         temp_data = DIVQH;
  131.         temp_data = (temp_data<<8) + DIVQL;
  132.         DIVAH = temp_data>>8;
  133.         DIVAL = temp_data;
  134.         DIVB = 10;
  135.         DIVEN = 1;
  136.         while(!DIVOEN);
  137.         thound = DIVR;
  138.         LEDDATA0 = smg_arr[thound];
  139.         LEDDATA2 = smg_arr[hundred];
  140.         LEDDATA3 = smg_arr[decade];
  141.         LEDDATA4 = smg_arr[unint];
  142. }
  143. //主函数
  144. void main()
  145. {
  146.         int i=0;
  147.         init_mcu();
  148.         init_led();
  149.         while(1)
  150.         {
  151.                 if(i<7)
  152.                 {
  153.                         i++;
  154.                 }
  155.                 else
  156.                 {
  157.                         i=0;
  158.                 }
  159.                 display_data = Led_Power_Code[i];
  160.                 delay_ms(2000);
  161.                 display_LED();
  162.         }
  163. }


65308608517d4a2e87.png
有没有发现,那个j=0;
而后面有个while(j--);
这非常好啊,j--是先使用,不管后面是个几,都进行了判断,但是什么都不再继续进行。
学了一个大招,这样也不用担心被优化了。
两只袜子 发表于 2021-4-27 16:14 | 显示全部楼层
楼主厉害
weifeng90 发表于 2021-5-7 19:18 来自手机 | 显示全部楼层
延时函数是考研软件攻城狮的能力
单片小菜 发表于 2021-5-7 22:46 | 显示全部楼层
感谢楼主的分享,不错的例子程序的。
嵌入小菜菜 发表于 2021-5-7 23:49 | 显示全部楼层
感谢楼主的分享,仔细的复习一下,也是好的。
yangxiaor520 发表于 2021-5-11 08:10 来自手机 | 显示全部楼层
延时函数很考验技能的
单片小菜 发表于 2021-5-12 11:55 | 显示全部楼层
记在小本本上,这样好一些。
weifeng90 发表于 2021-6-3 21:06 来自手机 | 显示全部楼层
多看看别人的代码能学到不少
sanfuzi 发表于 2021-6-4 11:54 | 显示全部楼层
一些经典的延时函数  
uiint 发表于 2021-6-4 11:54 | 显示全部楼层
可使用不同类型的变量来进行延时设计
hellosdc 发表于 2021-6-4 11:55 | 显示全部楼层
可以通过定位器来测量  
mituzu 发表于 2021-6-4 11:55 | 显示全部楼层
一种是硬件延时   
suzhanhua 发表于 2021-6-4 11:56 | 显示全部楼层
要用到定时器/计数器,这种方法可以提高CPU的工作效率
isseed 发表于 2021-6-4 11:56 | 显示全部楼层
使用定时器/计数器实现精确延时  
wangdezhi 发表于 2021-6-4 11:56 | 显示全部楼层
可由晶振频率算出延时时间  
biechedan 发表于 2021-6-4 11:57 | 显示全部楼层
最简单的定时器中断  
chenci2013 发表于 2021-6-4 11:57 | 显示全部楼层
怎么用C语言做单片机的精确延时  
gygp 发表于 2021-6-4 11:57 | 显示全部楼层
Delay()函数延时的时间是怎么计算的
suzhanhua 发表于 2021-6-4 11:58 | 显示全部楼层
主要采用循环体进行。   
isseed 发表于 2021-6-4 11:58 | 显示全部楼层
单片机的延时程序通过执行指令来达到延时效果  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

147

主题

1518

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部