📄 global.lst
字号:
C51 COMPILER V7.50 GLOBAL 11/12/2006 10:31:38 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE GLOBAL
OBJECT MODULE PLACED IN Global.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE Global.c BROWSE DEBUG OBJECTEXTEND CODE
line level source
1 #include "Global.H"
2
3
4 //任务及菜单控制
5 //==============
6 UNCHAR TaskMode = 1;//任务模式。1.键盘测试 2.HELLO 3.时钟显示
7 bit TaskChangeFlag = 0;//请求切换任务标志
8 UNCHAR Menu1 = 1;//任务中的一级菜单控制变量
9 UNCHAR Menu2 = 1;//任务中的二级菜单控制变量
10 UNCHAR Menu3 = 1;//任务中的三级菜单控制变量
11
12 //数码管显示缓冲区。改变此缓冲区中的字型码,即改变相应数码管的显示内容。
13 //=====================================================================
14 UNCHAR DisplayBuffer[8];//数码管显示缓冲区,低字节为左边数码管,高字节为右边数码管
15
16 //键盘接口参数
17 //============
18 UNCHAR KeyDownFlag = 0;//有键按下标志。应用程序代码不能改变此变量的值,否则会影响键盘的正常工作。
19 UNCHAR KeyValue = 0;//按键值.有键按下置非0按键扫描码,应用程序读取按键扫描码后需清0.
20
21 UNCHAR MyKey = 0;//自定义的按键值。将系统的按键值转换成自定义的按键值,由函数KeyConvert()完成。
22 void KeyConvert(void);//完成系统按键值转换成自定义按键值的功能
23
24
25 /*
26 ;==============================================================================
27 ;|/
28 ; ----a----
29 ; | |
30 ; f b
31 ; | |
32 ; ----g---- 显示字符编码区
33 ; | |
34 ; e c
35 ; | |
36 ; ----d---- .dp
37 ;
38 ;显示字节:7(dp),6(g),5(f),4(e),3(d),2(c),1(b),0(a)
39 ;
40 ;带小数点显示时,只需将要显示的字符符号编码值或上0x80即可.
41 ;
42 */
43
44 //十六进制数码字符编码
45 //====================
46 UNCHAR code HexChar[]={
47 0x3F,//0: 00111111B
48 0x06,//1: 00000110B
49 0x5B,//2: 01011011B
50 0x4F,//3: 01001111B
51 0x66,//4: 01100110B
52 0x6D,//5: 01101101B
53 0x7D,//6: 01111101B
54 0x07,//7: 00000111B
55 0x7F,//8: 01111111B
C51 COMPILER V7.50 GLOBAL 11/12/2006 10:31:38 PAGE 2
56 0x6F,//9: 01101111B
57 0x77,//A: 01110111B
58 0x7C,//B: 01111100B
59 0x39,//C: 00111001B
60 0x5E,//D: 01011110B
61 0x79,//E: 01111001B
62 0x71 //F: 01110001B
63 };
64
65 //其它字符编码
66 //============
67 UNCHAR code Char_H = 0x76;//01110110B
68 UNCHAR code Char_L = 0x38;//00111000B
69 UNCHAR code Char_O = 0x3F;//00111111B
70 UNCHAR code Char_Colon = 0x09;//00001001B 冒号
71 UNCHAR code Char_SubSign = 0x40;//01000000B 减号
72
73
74
75
76 //显示控制程序内部使用的变量
77 //--------------------------
78 UNCHAR DisplayDigit = 0;//当前数码管显示位的编号,亦即显示数据在显示缓冲区中的偏移量
79 //键盘扫描程序内部使用的变量
80 //--------------------------
81 UNCHAR KeyValueTemp = 0;//临时按键值变量,用于进行20ms延时检测
82 UNCHAR Key20msDelay = 0;//有键按下时的20ms去抖动延时控制
83
84 //显示键盘控制程序。在Timer2中断服务程序中被调用。
85 //===============================================
86 void DisplayKeyboardControl(void) using 3
87 {
88 1 UNCHAR KeyTestCode;//扫描键盘时的扫描测试码
89 1 UNCHAR KeyScanCode;//按键扫描码,为0表示没有键按下
90 1 UNCHAR i;
91 1
92 1 UNCHAR Digit;//用于计算控制数码位显示的位数据,以便送入DisplayDigitSelect锁存器控制位显示
93 1
94 1 //停止所有数码位的显示
95 1 //====================
96 1 XBYTE[DisplayDigitSelect] = 0xFF;
97 1
98 1 //扫描键盘当前是否有键按下
99 1 //========================
100 1 KeyScanCode = 0x00 ;//初始化为未检测到有键按下
101 1 for(i=0;i<8;i++)
102 1 {
103 2 //计算本次扫描测试码
104 2 //------------------
105 2 KeyTestCode = 0x01;
106 2 KeyTestCode <<= i;
107 2 KeyTestCode = ~KeyTestCode;
108 2
109 2 //输出键盘扫描测试码
110 2 //------------------
111 2 XBYTE[DisplaySegmentSelect] = KeyTestCode;
112 2
113 2 //检查是否有按键按下
114 2 //------------------
115 2 if(!P1_0)
116 2 {//0路有键按下
117 3 KeyScanCode = 2*i + 1;//计算此按键的扫描码
C51 COMPILER V7.50 GLOBAL 11/12/2006 10:31:38 PAGE 3
118 3 break;//退出键盘扫描循环
119 3 }
120 2 else if(!P1_1)
121 2 {//1路有键按下
122 3 KeyScanCode = 2*i + 2;//计算此按键的扫描码
123 3 break;//退出键盘扫描循环
124 3 }
125 2 }
126 1
127 1 //确定按键是否稳定按下或已经抬起
128 1 //==============================
129 1 if(KeyScanCode)
130 1 {//本次中断有键按下.如果按键已经稳定按下(KeyDownFlag非0)了,则不做任何事,否则处理20ms去抖动延时.
131 2 if(!KeyDownFlag)
132 2 {//如果未确定按键已经稳定按下时,处理20ms延时
133 3 if(Key20msDelay)
134 3 {//在20ms延时处理中,继续20ms延时处理
135 4 Key20msDelay++;
136 4 if(Key20msDelay>8)
137 4 {//20ms延时时间到
138 5 if(KeyScanCode == KeyValueTemp)
139 5 {//本次按键扫描码与20ms延时开始时的按键扫描码相同,确定按键稳定按下
140 6 KeyDownFlag = 1;//标记按键稳定按下
141 6 KeyValue = KeyScanCode;//将按键扫描码送入按键缓冲区
142 6 Key20msDelay = 0;//结束20ms延时状态
143 6 }
144 5 else
145 5 {//20ms延时前后的扫描码不相同,以最后一次的扫描码来启动新的20ms去抖动延时
146 6 KeyValueTemp = KeyScanCode;//记下20ms延时开始时的按键扫描码
147 6 Key20msDelay = 1;//重新进入20ms延时处理
148 6 }
149 5 }
150 4 }
151 3 else
152 3 {//未进入20ms延时处理时,启动20ms延时处理
153 4 KeyValueTemp = KeyScanCode;//记下20ms延时开始时的按键扫描码
154 4 Key20msDelay = 1;//进入20ms延时处理
155 4 }
156 3 }
157 2 }
158 1 else
159 1 {//本次中断无键按下
160 2 if(Key20msDelay)
161 2 {//在20ms延时处理中,继续20ms延时处理
162 3 Key20msDelay++;
163 3 if(Key20msDelay>8)
164 3 {//20ms延时时间到,说明启动20ms延时的按键信号是干扰信号,直接结束20ms延时状态
165 4 Key20msDelay = 0;//结束20ms延时状态
166 4 }
167 3 }
168 2 else
169 2 {//未进入20ms延时处理时
170 3 KeyDownFlag = 0;//标记按键已经抬起
171 3 }
172 2 }
173 1
174 1 //显示下一个数码位
175 1 //================
176 1 DisplayDigit++;//指向新的要显示的数码管
177 1 if(DisplayDigit>=8) DisplayDigit = 0;
178 1
179 1 XBYTE[DisplaySegmentSelect] = DisplayBuffer[DisplayDigit];//送段显示数据,确定要显示的字型
C51 COMPILER V7.50 GLOBAL 11/12/2006 10:31:38 PAGE 4
180 1
181 1 //计算位显示锁存器数据
182 1 //--------------------
183 1 Digit = 0x01;//0000 0001
184 1 Digit <<= DisplayDigit;
185 1 Digit = ~Digit;
186 1
187 1 XBYTE[DisplayDigitSelect] = Digit;//送位显示数据,确定要显示的数码位
188 1 }
189
190 //完成系统按键值转换成自定义按键值的功能.在main()的主循环中被调用
191 //===============================================================
192 void KeyConvert(void)
193 {
194 1 if(KeyValue)
195 1 {
196 2 switch(KeyValue)
197 2 {
198 3 case 1: MyKey = 1; break;
199 3 case 2: MyKey = 2; break;
200 3 case 3: MyKey = 3; break;
201 3 case 4: MyKey = 4; break;
202 3 case 5: MyKey = 5; break;
203 3 case 6: MyKey = 6; break;
204 3 case 7: MyKey = 7; break;
205 3 case 8: MyKey = 8; break;
206 3 case 9: MyKey = 9; break;
207 3 case 10: MyKey = 10;break;
208 3 case 11: MyKey = 11;break;
209 3 case 12: MyKey = 12;break;
210 3 case 13: MyKey = 13;break;
211 3 case 14: MyKey = 14;break;
212 3 case 15: MyKey = 15;break;
213 3 case 16: MyKey = 16;break;
214 3 }
215 2
216 2 KeyValue = 0;
217 2 }
218 1 }
C51 COMPILER V7.50 GLOBAL 11/12/2006 10:31:38 PAGE 5
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION DisplayKeyboardControl (BEGIN)
0000 C0D0 PUSH PSW
0002 75D018 MOV PSW,#018H
; SOURCE LINE # 86
; SOURCE LINE # 96
0005 90FDFF MOV DPTR,#0FDFFH
0008 74FF MOV A,#0FFH
000A F0 MOVX @DPTR,A
; SOURCE LINE # 100
;---- Variable 'KeyScanCode' assigned to Register 'R7' ----
000B E4 CLR A
000C FF MOV R7,A
; SOURCE LINE # 101
;---- Variable 'i' assigned to Register 'R6' ----
000D FE MOV R6,A
000E ?C0001:
; SOURCE LINE # 102
; SOURCE LINE # 105
;---- Variable 'KeyTestCode' assigned to Register 'R5' ----
000E 7D01 MOV R5,#01H
; SOURCE LINE # 106
0010 ED MOV A,R5
0011 A81E MOV R0,AR6
0013 08 INC R0
0014 8002 SJMP ?C0040
0016 ?C0039:
0016 C3 CLR C
0017 33 RLC A
0018 ?C0040:
0018 D8FC DJNZ R0,?C0039
001A FD MOV R5,A
; SOURCE LINE # 107
001B 631DFF XRL AR5,#0FFH
; SOURCE LINE # 111
001E 90FEFF MOV DPTR,#0FEFFH
0021 ED MOV A,R5
0022 F0 MOVX @DPTR,A
; SOURCE LINE # 115
0023 209007 JB P1_0,?C0004
; SOURCE LINE # 116
; SOURCE LINE # 117
0026 EE MOV A,R6
0027 25E0 ADD A,ACC
0029 04 INC A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -