官网提供的 an_r01an2006cc0110_r7f0c809_io.zip 是一个 R7F0C809 按键扫瞄配合4位8段数码管显示的例程,在熟悉其程序架构之后使用这个架构来设计一个计数器程序,利用板上的 3 个按键来实现加一、减一、清零的功能,按键的安排如下:
K1:加一
K2:减一
K3:清零
在 key_scan.h 定义了:
- #define Key1 0x0e
- #define Key2 0x12
- #define Key3 0x1a
- #define Key4 0x2a
- #define Key5 0x05
- #define Key6 0x09
- #define Key7 0x11
- #define Key8 0x21
这些数据是怎么来的呢?
在 key_scan.c 里头:
- 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
程序中宣告了一个计数器:
并且建立一个 DS_7Seg() 函数用来将数据显示在数码管上:
- /* Display 7-Segment */
- void DS_7Seg(uint16_t dta)
- {
- uint8_t x;
-
- for(x=0;x<4;x++)
- {
- g_SegBuf[x] = dta%10;
- dta /= 10;
- }
- }
在 Key_Scan() 函数中判断按键并做相应的处理:
- if(s_Count == 3) /* Check press count whether equal set value*/
- {
- Key_NO = ComN+Key_scan0+Key_scan1*10; /* Calculate the key value*/
- switch(Key_NO)
- {
- case Key1: g_Counter++;
- DS_7Seg(g_Counter); /* Display 7-Segment */
- break;
- case Key2: if(g_Counter > 0)
- {
- g_Counter--;
- DS_7Seg(g_Counter); /* Display 7-Segment */
- }
- break;
- case Key3: g_Counter = 0;
- DS_7Seg(g_Counter); /* Display 7-Segment */
- break;
- default: break;
- }
- s_Count = 0; /* Press count clear */
- s_Flag = 1; /* Button has been handled flag set to 1. */
- }
main() 函数:
- void main(void)
- {
- System_Init(); /* Initializes some function moudle */
- TS0 |= 0x01; /* Start TAU00 timer */
-
- g_Counter = 0;
- DS_7Seg(g_Counter); /* Display 7-Segment */
-
- while(1)
- {
- while(TMIF00 != 1); /* Wait the TAU00 interrupt flag set to 1*/
- TMIF00 = 0; /* TAU00 interrupt flag clear*/
-
- LED_Display(); /* Executive the LED_Display function*/
-
- TS0 |= 0x02; /* TAU01 start*/
- while(TMIF01 != 1); /* Wait the TAU01 interrupt flag set to 1*/
- TT0 |= 0x02; /* TAU01 stop*/
- TMIF01 = 0; /* TAU01 interrupt flag clear*/
-
- Key_Scan(); /* Executive the Key_Scan function*/
- }
- }
上面的显示函数并没有做前置0 不显示的处理,所以当计数器为0 时数码管会显示 0000,假如希望前置0 不要显示,那么可以修改 DS_7Seg() 函数如下:
- /* Display 7-Segment */
- void DS_7Seg(uint16_t dta)
- {
- uint8_t x;
-
- for(x=0;x<4;x++)
- {
- g_SegBuf[x] = dta%10;
- dta /= 10;
- }
-
- // prefix-0 process
- for(x=3;x>0;x--)
- {
- if(g_SegBuf[x]!=00)
- {
- break;
- }
- else
- {
- g_SegBuf[x] = 0x0f;
- }
- }
- }
运行结果:
程序码:
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 编辑