📄 key.lst
字号:
C51 COMPILER V8.08 KEY 11/02/2007 15:16:55 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN Key.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Driver\Key_Service\Key.c BROWSE DEBUG OBJECTEXTEND PRINT(.\Key.lst) OBJECT(
-Key.obj)
line level source
1 //========================================================================
2 // 文件名: Key.c
3 // 作 者: xinqiang Zhang(小丑) (email: xinqiang@Mzdesign.com.cn)
4 // 日 期: 2007/07/26
5 // 描 述: MzLH01-12864 LCD显示模块驱动V1.0版
6 // 基本功能接口函数集
7 //
8 // 参 考: 无
9 // 版 本:
10 // 2007/07/26 First version Mz Design
11 //========================================================================
12 #include ".\Driver\Key_Service\Key_config.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 char Key_Down_Counter_l=0; //长时按键计数器
28
29 unsigned char Key_Release_flag=0; //在有些按键中防止长按键时重复响应用的
30
31
32 void Key_Initial(void)
33 {
34 1 /* *Port_Key_Dir &= ~KEY_MASK;
35 1 *Port_Key_Attrib &= ~KEY_MASK;
36 1 *Port_Key_Buffer &= ~KEY_MASK; */
37 1 Port_Key_Data = KEY_MASK;
38 1 }
39
40 void KeyScan_Service(void)
41 {
42 1 Port_Key_Data = KEY_MASK;
43 1 Key_Sample1 = Port_Key_Data&KEY_MASK;
44 1 Key_Sample1 = Key_Sample1^KEY_MASK;
45 1 if(Key_Sample1==Key_Sample2)
46 1 { //连续两次扫描的键值相同,有效,则处理
47 2 if(Key_Sample1) //是否有键按下?如有则处理
48 2 {
49 3 if(Key_Down_flag==0) //如果键值还没有被消抖确认,则确认是否与之前的键值一至
50 3 {
51 4 if(Key_Sample1==Key_Scan_old)
52 4 {
53 5 Key_Down_Counter++;
54 5 if(Key_Down_Counter>=KEY_DOWN_COUNTER_S)
C51 COMPILER V8.08 KEY 11/02/2007 15:16:55 PAGE 2
55 5 {
56 6 Key_Down_Counter = 0;
57 6 Key_Down_Counter_l=KEY_DOWN_COUNTER_S;
58 6 Key_Down_flag = 1;
59 6 Key_Value = Key_Sample1; //将确认的键值载入缓存器中,供键抬起后处理用
60 6 }
61 5 }
62 4 else
63 4 {
64 5 Key_Down_Counter = 0; //重新计数,即重新消抖
65 5 Key_flag_long=0;
66 5 }
67 4 }
68 3 else //如已经过消抖,则判断是否有组合键按下?如无则直接退出处理
69 3 {
70 4 Key_Down_Counter_l++;//
71 4 if(Key_Down_Counter_l>=KEY_DOWN_COUNTER_L)
72 4 {
73 5 Key_flag_long=1;
74 5 Key_Down_Counter_l=KEY_DOWN_COUNTER_L-KEY_DOWN_COUNTER_M;
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_flag_long=0;
87 4 }
88 3 if(Key_Release_flag==1)
89 3 {
90 4 Key_Release_flag=0;
91 4 Key_flag = 0;
92 4 }
93 3 }
94 2 Key_Scan_old = Key_Sample1; //保存这次的有效键值
95 2 }
96 1 Key_Sample2 = Key_Sample1; //保存当次的值
97 1 }
98
99 unsigned char Key_Get(void)
100 {
101 1 unsigned char KK=0;
102 1 if(Key_Release_flag==1) return KK;
103 1 if(Key_flag_long==1)
104 1 {
105 2 Key_flag_long=0;
106 2 switch(Key_Value)
107 2 {
108 3 /* case 0x0001: KK = 1;break;
109 3 case 0x0002: KK = 2;break;
110 3 case 0x0004: KK = 3;break;
111 3 case 0x0008: KK = 4;break;
112 3 case 0x0020: KK = 5;break;
113 3 case 0x0040: KK = 6;break;
114 3 case 0x0024: KK = 12;Key_Release_flag = 1; break;
115 3 case 0x0080: KK = 0x17; Key_Release_flag =1; break;
116 3 case 0x0100: KK = 0x18; Key_Release_flag =1; break;
C51 COMPILER V8.08 KEY 11/02/2007 15:16:55 PAGE 3
117 3 case 0x0200: KK = 0x19; Key_Release_flag =1; break;
118 3 case 0x0400: KK = 0x1a; Key_Release_flag =1; break; */
119 3 default : KK=0;
120 3 }
121 2 if(KK!=0)
122 2 {
123 3 Key_flag=0;
124 3 return KK;
125 3 }
126 2 }
127 1 if(Key_flag!=0)
128 1 {
129 2 Key_flag=0;
130 2 Key_Down_Counter = 0;
131 2 Key_Down_flag = 0;
132 2 switch(Key_Data)
133 2 {
134 3 case 0x0001: KK = 1;break;
135 3 case 0x0002: KK = 2;break;
136 3 case 0x0004: KK = 3;break;
137 3 /* case 0x0008: KK = 4;break;
138 3 case 0x0020: KK = 5;break;
139 3 case 0x0040: KK = 6;break;
140 3 case 0x0080: KK = 7;break;
141 3 case 0x0100: KK = 8;break;
142 3 case 0x0200: KK = 9;break;
143 3 case 0x0400: KK = 10;break;
144 3 case 0x0800: KK = 11;break; */
145 3 default : break;
146 3 }
147 2 return KK;
148 2 }
149 1 else return 0;
150 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 213 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 ----
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 + -