📄 key_service.lst
字号:
C51 COMPILER V8.16 KEY_SERVICE 02/18/2009 16:41:08 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE KEY_SERVICE
OBJECT MODULE PLACED IN ..\Output\Key_Service.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\UserCode\Key_Service.c BROWSE INCDIR(..\LCD_Driver;..\MzMenu_GUI;..\User
-Code) DEBUG OBJECTEXTEND PRINT(.\Key_Service.lst) OBJECT(..\Output\Key_Service.obj)
line level source
1 //========================================================================
2 // 文件名: Key_Service.c
3 // 作 者: xinqiang Zhang(小丑) (email: xinqiang@Mzdesign.com.cn)
4 // 日 期: 2007/06/29
5 // 描 述: 键盘服务程序,简单使用版
6 //
7 // 参 考: 无
8 // 版 本:
9 // 2007/06/29 First version Mz Design
10 //========================================================================
11
12 #include "REG52.H"
13
14 unsigned int Key_Sample1=0; //当前对按键采样的值
15 unsigned int Key_Sample2=0; //上一次对按键采样的值
16 unsigned int Key_Scan_old=0; //上一次有效的键值状态
17 //(必需连续两次的采样值相同时才能载入该变量中)
18 unsigned char Key_Down_flag=0; //键盘按下标识,注意是经过消抖后确认的按下标识
19 unsigned char Key_Down_Counter=0; //用于消抖
20
21 unsigned int Key_Value=0; //最终经过确认的键值
22
23 unsigned int Key_Data=0;
24 unsigned char Key_flag=0;
25
26 unsigned char Key_flag_long=0; //长时按键标识~
27 unsigned int Key_Down_Counter_l=0; //长时按键计数器
28
29 unsigned char Key_Release_flag=0; //在有些按键中防止长按键时重复响应用的
30
31
32 void Key_Initial(void)
33 {
34 1 P0 = 0x0f;
35 1 }
36
37 void KeyScan_Service(void)
38 {
39 1 unsigned int uiTemp;
40 1 // Key_Sample1 = (IOPIN0&0xfef00000)>>20;//
41 1 uiTemp = P0&0x0f;
42 1 Key_Sample1 = uiTemp;
43 1 Key_Sample1 ^=0x0f;
44 1 if(Key_Sample1==Key_Sample2)
45 1 { //连续两次扫描的键值相同,有效,则处理
46 2 if(Key_Sample1) //是否有键按下?如有则处理
47 2 {
48 3 if(Key_Down_flag==0) //如果键值还没有被消抖确认,则确认是否与之前的键值一至
49 3 {
50 4 if(Key_Sample1==Key_Scan_old)
51 4 {
52 5 Key_Down_Counter++;
53 5 if(Key_Down_Counter>=100)
54 5 {
C51 COMPILER V8.16 KEY_SERVICE 02/18/2009 16:41:08 PAGE 2
55 6 Key_Down_Counter = 0;
56 6 Key_Down_Counter_l=20;
57 6 Key_Down_flag = 1;
58 6 Key_Value = Key_Sample1; //将确认的键值载入缓存器中,供键抬起后处理用
59 6 }
60 5 }
61 4 else
62 4 {
63 5 Key_Down_Counter = 0; //重新计数,即重新消抖
64 5 Key_flag_long=0;
65 5 // Key_Down_Counter_l=0;
66 5 }
67 4 }
68 3 else //如已经过消抖,则判断是否有组合键按下?如无则直接退出处理
69 3 {
70 4 Key_Down_Counter_l++;//
71 4 if(Key_Down_Counter_l>=4000)
72 4 {
73 5 Key_flag_long=1;
74 5 Key_Down_Counter_l=150;
75 5 }
76 4 }
77 3 }
78 2 else //否则就处理之前是否有键是经过确认的
79 2 { //如果已经有键按下,并确认消抖后则处理键值
80 3 if(Key_Down_flag==1)
81 3 {
82 4 Key_Down_flag = 0;//
83 4 Key_Data = Key_Value;
84 4 Key_flag = 1;
85 4 Key_Down_Counter = 0;
86 4 // Key_Down_Counter_l=0;
87 4 Key_flag_long=0;
88 4 }
89 3 if(Key_Release_flag==1)
90 3 {
91 4 Key_Release_flag=0;
92 4 Key_flag = 0;
93 4 }
94 3 }
95 2 Key_Scan_old = Key_Sample1; //保存这次的有效键值
96 2 }
97 1 Key_Sample2 = Key_Sample1; //保存当次的值
98 1 }
99
100 unsigned char Key_Get(void)
101 {
102 1 unsigned char KK=0;
103 1 if(Key_Release_flag==1) return KK;
104 1 if(Key_flag_long==1)
105 1 {
106 2 Key_flag_long=0;
107 2 switch(Key_Value)
108 2 {
109 3 case 0x01: KK = 5;Key_Release_flag = 1;break;//
110 3 case 0x02: KK = 6;Key_Release_flag = 1;break;//
111 3 default : KK=0;
112 3 }
113 2 if(KK!=0)
114 2 {
115 3 Key_flag=0;
116 3 // Key_Down_Counter = 0;
C51 COMPILER V8.16 KEY_SERVICE 02/18/2009 16:41:08 PAGE 3
117 3 // Key_Down_flag = 0;
118 3 return KK;
119 3 }
120 2 }
121 1 if(Key_flag!=0)
122 1 {
123 2 Key_flag=0;
124 2 Key_Down_Counter = 0;
125 2 Key_Down_flag = 0;
126 2 switch(Key_Data)
127 2 {
128 3 case 0x01: KK = 1;break;
129 3 case 0x02: KK = 2;break;
130 3 case 0x04: KK = 3;break;
131 3 case 0x08: KK = 4;break;
132 3 // case 0x20: KK = 5;break;
133 3 // case 0x40: KK = 6;break;
134 3 default : break;
135 3 // case 0x0002: KK = 2;break;
136 3 }
137 2 return KK;
138 2 }
139 1 else return 0;
140 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 252 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 17 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -