📄 main.lst
字号:
C51 COMPILER V8.05a MAIN 07/29/2007 09:35:52 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE sources\main.c BROWSE INCDIR(.\include) DEBUG OBJECTEXTEND PRINT(.\main.lst
-) OBJECT(main.obj)
line level source
1 //*************************************************************************************************
2 //*************************************************************************************************
3 //**<程序名>:LED动态扫描显示及键盘输入扫描。 **
4 //**<功能>:将键盘输入转换成相应的输出并显示在LCD上,同时带有1s计数功能。 **
5 //**<版本说明>:此版是第二版beta2,在第一版的基础上增强防抖动功能,采用全新的防抖动算法,使得按 **
6 //** 键扫描更精确可靠。 **
7 //**<主要改动>:重新加入防抖动标志位,但与出版不同的是,防抖动标志改为首次有效,同时增加了防抖动 **
8 //** 清除标志位,通过T1定时300毫秒清除防抖动标志位,从而使得键盘扫描及处理更加可靠。 **
9 //**<作者>:程沛 **
10 //**<完成时间>:2007年7月28日 **
11 //**<联系方式>:superyongzhe@163.com **
12 //*************************************************************************************************
13 //*************************************************************************************************
14
15
16 //*************************************************************************************************
17 //* *
18 //* ******************************头文件及宏定义************************** *
19 //* *
20 //*************************************************************************************************
21 #include "includes.h"
22
23 #define TIME0H 0xFC
24 #define TIME0L 0x18 //定时器0溢出时间:5ms
25
26 #define TIME1H 0x44
27 #define TIME1L 0x80 //定时器1溢出时间:48ms
28
29
30 //*************************************************************************************************
31 //* *
32 //* ********************************全局变量****************************** *
33 //* *
34 //*************************************************************************************************
35
36 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0定时刷新LED计数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
37 unsigned char uc_DisCount=1;
38
39 unsigned long ul_Number=0; //LCD实时显示数字。
40
41
42 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1计数刷新定时(计时模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
43 unsigned char uc_TimeCount=0; //定时器1定时计数。
44
45 bit b_ClockStart=0; //定时器1显示计数标志位。
46
47
48 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
49
50 bit b_KeyShock=0; //键盘防抖动标志位。
51 //当按键中断产生时,首先判断此位。
52 //0--执行键盘扫描及键码处理程序;1--不执行。
53
54 bit b_KillShock=0; //防抖标志清除位:0--不清除;1--清除。
C51 COMPILER V8.05a MAIN 07/29/2007 09:35:52 PAGE 2
55
56 unsigned char uc_KillCount=1; //抖动标志清除计数,使用定时器1。
57
58
59 //*************************************************************************************************
60 //* *
61 //* ********************************主函数****************************** *
62 //* *
63 //*************************************************************************************************
64 void main()
65 {
66 1 P2=0x0F; //初始化键盘接口。
67 1
68 1 TMOD=0x11; //定时器0:模式一;定时器0:模式一.
69 1
70 1
71 1 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0,用于LCD刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
72 1 TH0=TIME0H;
73 1 TL0=TIME0L;
74 1 TR0=1; //开启定时器0
75 1 ET0=1; //开定时器0中断
76 1
77 1
78 1 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1,用于1s计时 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
79 1 TH1=TIME1H;
80 1 TL1=TIME1L;
81 1 TR1=1; //开启定时器1
82 1 ET1=1; //开定时器1中断
83 1
84 1
85 1 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于执行键盘扫描和键处理程序>>>>>>>>>>>>>>>>>>>>>>>>>>>
86 1 IT0=1; //外部中断0,中断方式:下降沿
87 1 EX0=1; //开启外部中断0
88 1
89 1 PT0=1;
90 1 PX0=0;
91 1
92 1 EA=1; //开启总中断
93 1
94 1 while(1);
95 1 }
96
97
98 //*************************************************************************************************
99 //* *
100 //* ***************************外部中断0,调用键盘扫描程序************************* *
101 //* *
102 //*************************************************************************************************
103 void vINT0(void) interrupt 0
104 {
105 1 EX0=0; //在键扫描处理时,关闭外部中断0,防抖动。
106 1
107 1 if(b_KeyShock==0)
108 1 {
109 2 vKeyProcess(ucKeyScan()); //当判断有按键按下时,扫描键盘,并把扫描结果进行处理。
110 2 }
111 1 else b_KeyShock=0; //如果有抖动则不执行键扫描,恢复防抖动标志。
112 1
113 1 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<设置防抖动清除标志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
114 1 if(b_KeyShock==1)
115 1 b_KillShock=1; //如果防抖动标志位开启则开启防抖动标志清除位,
116 1 //300ms后清除防抖动标志。
C51 COMPILER V8.05a MAIN 07/29/2007 09:35:52 PAGE 3
117 1
118 1 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复键扫描处理前初始状态 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
119 1 P2=0x0F; //恢复P2口。
120 1 EX0=1; //恢复按键中断。
121 1 }
122
123
124 //*************************************************************************************************
125 //* *
126 //* **********************定时器1中断,用于计时功能和防抖动标志清除************************ *
127 //* *
128 //*************************************************************************************************
129 void vTimer1(void) interrupt 3
130 {
131 1 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<计时模式计数刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
132 1 if(b_ClockStart==1) //当计时模式开启式,如计时处于运行状态则执行定时计数增加。
133 1 {
134 2 if(uc_TimeCount%21==0)
135 2 {
136 3 uc_TimeCount=1;
137 3 ul_Number++;
138 3 }
139 2 else uc_TimeCount++;
140 2 }
141 1
142 1 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
143 1 if(b_KillShock==1)
144 1 {
145 2 if(uc_KillCount%7==0) //当防抖动标志位为1时,计时300ms后清除抖动标志位。
146 2 {
147 3 b_KeyShock=0;
148 3 b_KillShock=0;
149 3 uc_KillCount=1;
150 3 }
151 2 else uc_KillCount++;
152 2 }
153 1
154 1 TH1=TIME1H;
155 1 TL1=TIME1L;
156 1
157 1 }
158
159
160 //*************************************************************************************************
161 //* *
162 //* ***************************定时器0,定时刷新LED************************* *
163 //* *
164 //*************************************************************************************************
165 void vTimer0(void) interrupt 1
166 {
167 1 vShowOneNum(*(pucLedNum(ul_Number)+uc_DisCount),6-uc_DisCount); //在LCD上显示1位数字。
168 1
169 1 if(uc_DisCount>=5)
170 1 uc_DisCount=0; //定时器0在每次被触发时,改变LCd显示。
171 1 else uc_DisCount++; //从第一位到第六位循环显示。
172 1
173 1 TH0=TIME0H; //恢复定时器0初始值。
174 1 TL0=TIME0L;
175 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
C51 COMPILER V8.05a MAIN 07/29/2007 09:35:52 PAGE 4
CODE SIZE = 312 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
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 + -