📄 key_display.lst
字号:
C51 COMPILER V7.50 KEY_DISPLAY 09/17/2008 16:34:35 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE KEY_DISPLAY
OBJECT MODULE PLACED IN key_display.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key_display.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /******************************************************************************************************
2 File Name:key_display.c
3 Version:
4 Discription:显示和按键及消息的处理
5 Author:
6 Date:
7 *******************************************************************************************************/
8 #include "key_display.h"
9
10 typedef unsigned char BYTE;
11 extern unsigned char lcd_byte;//LC75823E的显示缓冲区中的byte计数
12 extern unsigned char lcd_bit;//LC75823E的显示缓冲区中一个byte的bit计数
13 extern BYTE disp_buff[]; //LC75823E显示缓冲区定义,20个字节
14 extern bit vfd_flag ;//更新显示标志
15
16
17 bit key_detect_en = 1; //是否允许按键检测
18 bit updata_disp = 0;
19
20 unsigned char screen;
21 unsigned char disp_buf[4] = {0xff,0xff,0xff,0xff};
22 bit led_blank_flag;
23
24 unsigned char key_bak = 0 , yKeyTimeTemp = 0; //按键扫描时用的中间变量
25 code unsigned char code lcd_segment[] = { LED_0,LED_1,LED_2,LED_3,LED_4,LED_5,LED_6,LED_7,LED_8,LED_9,LED
-_V,LED__, LED_P,LED_E};//数字0-9,V,-,P,E
26
27 #define Clr_bit(b) &= ~(1<<(b))
28 #define MAX_MSG_POOL 15 //最大信息池深度
29 unsigned char xdata msg_buf[MAX_MSG_POOL];
30 unsigned char data msg_read_counter = 0;
31 unsigned char data msg_write_counter = 0;
32 /*******************************************************************************************************
33 * 函数名称: put_msg()
34 * 功 能:消息池管理,把信息压入消息池中,消息池深度为0~15
35 * 输入参数: msg
36 * 输出参数:所需要的信息msg
37 * 说 明:*消息池深度为15层(0~15)
38 *在消息池工作过程中,会禁止中断的发生
39 ********************************************************************************************************/
40 #pragma NOAREGS
41 #pragma DISABLE
42 void put_msg(unsigned char msg)small //信息压入消息池
43 {
44 1 msg_buf[msg_write_counter] = msg;
45 1 msg_write_counter++;
46 1 if(msg_write_counter == MAX_MSG_POOL)
47 1 msg_write_counter = 0;
48 1 }
49 /*******************************************************************************************************
50 * 函数名称: get_msg()
51 * 功 能:把已经压入消息池中的信息读出来
52 * 输入参数: msg_temp
53 * 输出参数:所需要的信息msg
54 * 说 明:
C51 COMPILER V7.50 KEY_DISPLAY 09/17/2008 16:34:35 PAGE 2
55 *******************************************************************************************************/
56 #pragma DISABLE
57 unsigned char get_msg(void) small //从消息池中读出信息
58 {
59 1 unsigned char msg;
60 1 if(msg_read_counter == msg_write_counter)
61 1 {
62 2 return NO_MSG;
63 2 }
64 1 msg = msg_buf[msg_read_counter];
65 1 msg_read_counter++;
66 1 if(msg_read_counter == MAX_MSG_POOL)
67 1 msg_read_counter = 0;
68 1
69 1 return msg;
70 1 }
71 #pragma AREGS
72 /*******************************************************************************************************
73 * 函数名称: display()
74 * 功 能:LED(四位数码管、最高位为1)的显示管理(共阳)
75 * 输入参数: msg_temp
76 * 输出参数:
77 * 说 明:
78 *******************************************************************************************************/
79 void display()
80 {
81 1 if(led_blank_flag)
82 1 {
83 2 led_com1 = LED_HIGH;
84 2 led_com2 = LED_HIGH;
85 2 led_com3 = LED_HIGH;
86 2 led_com4 = LED_HIGH;
87 2 return;
88 2 }
89 1 if(screen == 0)
90 1 {
91 2 led_com1 = LED_HIGH;
92 2 led_com2 = LED_HIGH;
93 2 led_com3 = LED_HIGH;
94 2 led_com4 = LED_LOW;
95 2 led_seg = disp_buf[3]; // 最高位
96 2 }
97 1 else if(screen == 1)
98 1 {
99 2 led_com1 = LED_HIGH;
100 2 led_com2 = LED_HIGH;
101 2 led_com3 = LED_LOW;
102 2 led_com4 = LED_HIGH;
103 2 led_seg = disp_buf[2]; // 次高位
104 2 }
105 1 else if(screen == 2)
106 1 {
107 2 led_com1 = LED_HIGH;
108 2 led_com2 = LED_LOW;
109 2 led_com3 = LED_HIGH;
110 2 led_com4 = LED_HIGH;
111 2 led_seg = disp_buf[1]; // 次低位
112 2 }
113 1 else if(screen == 3)
114 1 {
115 2 led_com1 = LED_LOW;
116 2 led_com2 = LED_HIGH;
C51 COMPILER V7.50 KEY_DISPLAY 09/17/2008 16:34:35 PAGE 3
117 2 led_com3 = LED_HIGH;
118 2 led_com4 = LED_HIGH;
119 2 led_seg = disp_buf[0]; // 最低位
120 2 }
121 1 }
122 /********************************************************************************************************
123 * 函数名称:key_scan()
124 * 功 能:
125
126 * 输入参数:
127 * 输出参数:
128 * 说 明:
129 *********************************************************************************************************/
130 void key_scan(void)
131 {
132 1 unsigned char key_flag_start = 0,temp; //初始化为无按键按下
133 1 EA = 0;
134 1 CPUCFG |= 0x20; //选择EMI
135 1 temp = XBYTE[0x8000];//相当于读P6口的电压
136 1 CPUCFG = 0; //IRAM
137 1 EA = 1;
138 1 if ((temp & 0x01) == 0)key_flag_start = KEY_NEXT;//S0
139 1 else if ((temp & 0x02) == 0)key_flag_start = KEY_PREV;//S1
140 1 else if ((temp & 0x04) == 0)key_flag_start = KEY_P_P;//S2
141 1
142 1
143 1 if (key_flag_start)
144 1 {
145 2
146 2 if((key_bak != 0) && (key_bak != key_flag_start))
147 2 {
148 3 yKeyTimeTemp = 0;
149 3 }
150 2 key_bak = key_flag_start;
151 2 if (yKeyTimeTemp < 250)yKeyTimeTemp ++;
152 2 if(yKeyTimeTemp == 101) //长按
153 2 {
154 3 put_msg(key_bak | 0x10);
155 3 //put_msg(key_bak | 0x20);
156 3 }
157 2 else if((yKeyTimeTemp > 120)&&((key_bak==KEY_NEXT)||(key_bak==KEY_PREV))) //音量增加或减小
158 2 {
159 3 //flash_disp_mask = 1;
160 3 put_msg(key_bak | 0x10);
161 3 //put_msg(key_bak | 0x20);
162 3 yKeyTimeTemp -= 15; //2007-9-29 8:16 by juntham
163 3 //yKeyTimeTemp -= 30;
164 3 }
165 2
166 2 }
167 1 else
168 1 {
169 2 if((yKeyTimeTemp < 3)||(yKeyTimeTemp >100)) //长按或抖动
170 2 {
171 3 yKeyTimeTemp = 0;
172 3 }
173 2 else//((yKeyTimeTemp >= 3)&&(yKeyTimeTemp <= 200)) //短按
174 2 {
175 3
176 3 put_msg(key_bak);
177 3 yKeyTimeTemp = 0;
178 3 }
C51 COMPILER V7.50 KEY_DISPLAY 09/17/2008 16:34:35 PAGE 4
179 2 //flash_disp_mask = 0;
180 2 }
181 1 }
182 /********************************************************************************************************
183 * 函数名称: timer4_init()
184 * 功 能:Timer4的初始化程序,timer4 OSC(振荡器) input 12.288Mh,T4PR = 2.5 * 12288 / 128 = 240,
185 定时2.5ms;timer4的中断为低优先级.
186 * 输入参数: msg_temp
187 * 输出参数:
188 * 说 明:
189 ********************************************************************************************************/
190 void timer4_init(void)
191 {
192 1 INTFG0 Clr_bit(F_T4);
193 1 T4CON = 0x87; // 选择timer模式,OSC 12.288M为计数源,128预分频,compare mode
194 1 T4CNT = 0X00;
195 1 T4PR = (unsigned long)CRYSTAL * 2.5 / 128000; //T4PR_set; 2.5 for 12.288M
196 1 IP1 &= 0xFB; //关timer4的优先级
197 1 IEN1 |= 0x04; //开timer4中断
198 1 T4CON |= 0x10; //使能timer4
199 1 }
200 /********************************************************************************************************
201 * 函数名称: Timer_4_Isr()
202 * 功 能:timer4中断服务程序,每2.5ms产生一次中断,主要处理了扫描按键,
203 即每3*2.5ms调用一次键盘扫描函数。
204 * 输入参数: msg_temp
205 * 输出参数:
206 * 说 明:
207 *********************************************************************************************************/
208 void Timer_4_Isr() INT_TMR4
209 {
210 1 static unsigned char key_scan_flag = 0;
211 1
212 1 INTFG0 Clr_bit(F_T4); // timer4 pending bit
213 1 _push_(DPS);
214 1 DPCON = 0x0; //DPTR0
215 1 BANKSEL = 0;
216 1 key_scan_flag++;
217 1 if(key_scan_flag == 3)
218 1 {
219 2 if(key_detect_en)
220 2 {
221 3 key_scan_flag = 0;
222 3 key_scan(); // 扫描得到键值 待处理
223 3 }
224 2 }
225 1 screen++;
226 1 if(screen > 3)
227 1 screen = 0;
228 1 display();
229 1 _pop_(DPS);
230 1 }
231
232 /********************************************************************************************************
233 * 函数名称:
234 * 功 能:
235 * 输入参数:定时50MS
236 * 输出参数:
237 * 说 明:
238 ********************************************************************************************************/
239 void timer0_init(void)
240 {
C51 COMPILER V7.50 KEY_DISPLAY 09/17/2008 16:34:35 PAGE 5
241 1 TMOD = 0x01;//T0的工作模式,12分频,16位
242 1 TH0 = (65536-50000/3)/256;
243 1 TL0 = (65536-50000/3)%256;
244 1 IEN0 |= 0x02;//开t0中断
245 1 TCON |= 0x10;//使能t0
246 1 }
247 /********************************************************************************************************
248 * 函数名称:
249 * 功 能:中断服务程序,每50MS产生一次中断,定时0.25S
250 * 输入参数:
251 * 输出参数:
252 * 说 明:
253 ********************************************************************************************************/
254 void t0(void) interrupt 1 using 0
255 {
256 1 unsigned char tcont;
257 1 tcont++;
258 1 if(tcont==5)
259 1 {
260 2 tcont=0;
261 2 disp_buff[lcd_byte] &= ~(1<<lcd_bit);//熄灭当前字段
262 2 vfd_flag = !vfd_flag;//更新显示标志取反,闪烁显示
263 2 }
264 1 TH0 = (65536-50000/3)/256;
265 1 TL0 = (65536-50000/3)%256;
266 1 }
267 /********************************************************************************************************
268 * 函数名称:
269 * 功 能:
270 * 输入参数:
271 * 输出参数:
272 * 说 明:
273 ********************************************************************************************************/
274 void disp_number(unsigned char a,unsigned char b)
275 {
276 1 disp_buf[3] = lcd_segment[a%10];
277 1 disp_buf[2] = lcd_segment[b%10] LED_DOT;
278 1 disp_buf[1] = lcd_segment[((b%100)/10)];
279 1 if (b<100)disp_buf[0] = LED_BLANK;
280 1 else disp_buf[0] = LED_ALL_ON;
281 1 }
282
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 513 ----
CONSTANT SIZE = 14 ----
XDATA SIZE = 15 ----
PDATA SIZE = ---- ----
DATA SIZE = 10 1
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -