[原创] 【R7F0C809】EX01-计数器功能(加一、减一、清零)

slotg   2015-10-31 20:43 楼主
官网提供的 an_r01an2006cc0110_r7f0c809_io.zip 是一个 R7F0C809 按键扫瞄配合4位8段数码管显示的例程,在熟悉其程序架构之后使用这个架构来设计一个计数器程序,利用板上的 3 个按键来实现加一、减一、清零的功能,按键的安排如下: K1:加一 K2:减一 K3:清零 在 key_scan.h 定义了:
  1. #define Key1 0x0e
  2. #define Key2 0x12
  3. #define Key3 0x1a
  4. #define Key4 0x2a
  5. #define Key5 0x05
  6. #define Key6 0x09
  7. #define Key7 0x11
  8. #define Key8 0x21
这些数据是怎么来的呢? P01.JPG 在 key_scan.c 里头:
  1. Key_NO = ComN+Key_scan0+Key_scan1*10; /* Calculate the key value*/
其中 ComN 是数码管与按键的扫描信号,其数据范围为: --0001-- (0x04) 负责 K1/K5 扫描 --0010-- (0x08) 负责 K2/K6 扫描 --0100-- (0x10) 负责 K3/K7 扫描 --1000-- (0x20) 负责 K4/K8 扫描 而 Key_scan0 是 K5/K6/K7/K8 的数据输入,其中任何一个键被按下时会产生 1 的状态。 而 Key_scan1 是 K1/K2/K3/K4 的数据输入,其中任何一个键被按下时会产生 1 的状态。 所以当 K5/K6/K7/K8 按下时数据为 0x01,而 K1/K2/K3/K4 按下时的数据为 0x0a。 所以依上面程序的计算每一个按键的数据值为: Key1 = 0x04 + 0x0a = 0x0e Key2 = 0x08 + 0x0a = 0x12 Key3 = 0x10 + 0x0a = 0x1a Key4 = 0x20 + 0x0a = 0x2a Key5 = 0x04 + 0x01 = 0x05 Key6 = 0x08 + 0x01 = 0x09 Key7 = 0x10 + 0x01 = 0x11 Key8 = 0x20 + 0x01 = 0x21 程序中宣告了一个计数器:
  1. uint16_t g_Counter;
并且建立一个 DS_7Seg() 函数用来将数据显示在数码管上:
  1. /* Display 7-Segment */
  2. void DS_7Seg(uint16_t dta)
  3. {
  4. uint8_t x;
  5. for(x=0;x<4;x++)
  6. {
  7. g_SegBuf[x] = dta%10;
  8. dta /= 10;
  9. }
  10. }
在 Key_Scan() 函数中判断按键并做相应的处理:
  1. if(s_Count == 3) /* Check press count whether equal set value*/
  2. {
  3. Key_NO = ComN+Key_scan0+Key_scan1*10; /* Calculate the key value*/
  4. switch(Key_NO)
  5. {
  6. case Key1: g_Counter++;
  7. DS_7Seg(g_Counter); /* Display 7-Segment */
  8. break;
  9. case Key2: if(g_Counter > 0)
  10. {
  11. g_Counter--;
  12. DS_7Seg(g_Counter); /* Display 7-Segment */
  13. }
  14. break;
  15. case Key3: g_Counter = 0;
  16. DS_7Seg(g_Counter); /* Display 7-Segment */
  17. break;
  18. default: break;
  19. }
  20. s_Count = 0; /* Press count clear */
  21. s_Flag = 1; /* Button has been handled flag set to 1. */
  22. }
main() 函数:
  1. void main(void)
  2. {
  3. System_Init(); /* Initializes some function moudle */
  4. TS0 |= 0x01; /* Start TAU00 timer */
  5. g_Counter = 0;
  6. DS_7Seg(g_Counter); /* Display 7-Segment */
  7. while(1)
  8. {
  9. while(TMIF00 != 1); /* Wait the TAU00 interrupt flag set to 1*/
  10. TMIF00 = 0; /* TAU00 interrupt flag clear*/
  11. LED_Display(); /* Executive the LED_Display function*/
  12. TS0 |= 0x02; /* TAU01 start*/
  13. while(TMIF01 != 1); /* Wait the TAU01 interrupt flag set to 1*/
  14. TT0 |= 0x02; /* TAU01 stop*/
  15. TMIF01 = 0; /* TAU01 interrupt flag clear*/
  16. Key_Scan(); /* Executive the Key_Scan function*/
  17. }
  18. }
上面的显示函数并没有做前置0 不显示的处理,所以当计数器为0 时数码管会显示 0000,假如希望前置0 不要显示,那么可以修改 DS_7Seg() 函数如下:
  1. /* Display 7-Segment */
  2. void DS_7Seg(uint16_t dta)
  3. {
  4. uint8_t x;
  5. for(x=0;x<4;x++)
  6. {
  7. g_SegBuf[x] = dta%10;
  8. dta /= 10;
  9. }
  10. // prefix-0 process
  11. for(x=3;x>0;x--)
  12. {
  13. if(g_SegBuf[x]!=00)
  14. {
  15. break;
  16. }
  17. else
  18. {
  19. g_SegBuf[x] = 0x0f;
  20. }
  21. }
  22. }
运行结果: P02.JPG 程序码:
EX01.rar (69.85 KB)
(下载次数: 5, 2015-10-31 20:40 上传)
演示视频: http://v.youku.com/v_show/id_XMTM3NDM0ODM0MA==.html 本帖最后由 slotg 于 2015-10-31 20:44 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复