📄 key.lst
字号:
C51 COMPILER V8.08 KEY 07/28/2008 20:51:10 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN KEY.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE KEY.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*硬件连接:段选码P0.0~P0.7(a,b,c,d,e,f,g,h,dp),位选码P2.4~P2.7(低到高)
2 K1--P3.5;K2--P3.4;K3--P3.3;K4--P3.2*/
3
4 #include "reg52.h"
5 #include "intrins.h"
6 #define uchar unsigned char
7 #define uint unsigned int
8
9 #define Hidden 0x10; //消隐字符在字形码中的位置
10 uchar code BitTab[]={0xef,0xdf,0xbf,0x7f,0xef,0xdf};
11 uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF
-};
12 uchar DispBuf[6]; //6字节的显示缓冲区
13 bit Sec; //1s到的标记
14 bit Minute; //1m到的标记
15 bit Hour; //1h到的标记
16 bit H_up;
17 bit H_down;
18 bit M_up;
19 bit M_down;
20 sbit P30=P3^0; //周期测试位
21 sbit buzz=P2^3;
22 sbit P10=P1^0;
23 sbit P12=P1^2;
24 sbit P14=P1^4;
25 sbit P15=P1^5;
26 sbit P16=P1^6;
27 sbit P17=P1^7;
28 uchar SecValue; //秒计数
29 uchar MinuteValue; //分计数
30 uchar HourValue; //时计数
31
32 uchar code TH0Val=63075/256;
33 uchar code TL0Val=63075%256;//晶振为12M,定时2.5ms定时器初值(计算值为63036,校准值为63075)
34
35
36 void Timer0() interrupt 1
37 { uchar tmp;
38 1 static uchar dCount; //计数器,显示程序通过它得知现在显示那个数码管
39 1 static uint Count; //秒计数器
40 1 const uint CountNum=400; //预置值(400*2.5ms=1minute)
41 1 P10=~P10; //外部测试位,用于调整定时器初值
42 1 TH0=TH0Val;
43 1 TL0=TL0Val;
44 1 tmp=BitTab[dCount]; //根据当前的计数值取位值
45 1 P2=P2|0xf0; //P2与11110000相或,将位置1
46 1 P2=P2&tmp; //P2与取出的值相与,将某一位清0
47 1 tmp=DispBuf[dCount]; //根据当前的计数值,取显示缓冲区的待显示值
48 1 tmp=DispTab[tmp]; //取字形码
49 1 P0=tmp; //送出字形码
50 1 dCount++; //计数值加1
51 1 if(dCount==6) //如果计数值为6,归0
52 1 dCount=0;
53 1 //以下为秒计数
54 1 Count++; //计数值加1
C51 COMPILER V8.08 KEY 07/28/2008 20:51:10 PAGE 2
55 1 if(Count>=CountNum) //到达预置计数值
56 1 { Count=0; //清零
57 2 Sec=1;
58 2 buzz=~buzz; //置1秒到标志位
59 2 P12=~P12;
60 2 SecValue++; //秒值加1
61 2 if(SecValue>=60)
62 2 { SecValue=0;
63 3 Minute=1; //置1分到标志位
64 3 MinuteValue++; //分值加1
65 3 }
66 2 if(MinuteValue>=60)
67 2 { Hour=1; //置1小时到标志位
68 3 MinuteValue=0;
69 3 HourValue++; //小时值加1
70 3 }
71 2 }
72 1
73 1 }
74
75 void Init()
76 { TMOD=0x01;
77 1 TH0=TH0Val;
78 1 TL0=TL0Val;
79 1 ET0=1; //开T0中断
80 1 EA=1; //开总中断
81 1 TR0=1; //T0开始运行
82 1 }
83
84 void mDelay(unsigned int Delay) //延时程序,用于键盘消抖
85 { unsigned int i;
86 1 for(;Delay>0;Delay--)
87 1 { for(i=0;i<124;i++)
88 2 {;}
89 2 }
90 1 }
91
92 uchar Key() //键盘程序,获得键值
93 { uchar KValue;
94 1 uchar tmp;
95 1 P3|=0x3c; //将P3口接键盘的4位置1
96 1 KValue=P3;
97 1 KValue|=0xc3; //将未接的四位置1
98 1 if(KValue==0xff) //中间4位均为1,无键按下
99 1 return(0); //返回
100 1 mDelay(10); //延时10mS消抖
101 1 KValue=P3;
102 1 KValue|=0xc3; //再次读键盘
103 1 if(KValue==0xff)
104 1 return(0);
105 1 for(;;)
106 1 { tmp=P3;
107 2 if((tmp|0xc3)==0xff) //等待按键释放
108 2 break;
109 2 }
110 1 return(KValue);
111 1 }
112
113 void KProce(uchar KValue) //键值处理程序
114 { if((KValue&0x20)==0) //K1 第5 P3.5
115 1 H_up=1;
116 1 P17=~P17;
C51 COMPILER V8.08 KEY 07/28/2008 20:51:10 PAGE 3
117 1 if((KValue&0x10)==0) //K2 第4 P3.4
118 1 H_down=1;
119 1 P16=~P16;
120 1 if((KValue&0x08)==0) //K3 第3个 P3.3
121 1 M_up=1;
122 1 P15=~P15;
123 1 if((KValue&0x04)==0) //K4 第2个 P3.2
124 1 M_down=1;
125 1 P14=~P14;
126 1 }
127
128
129 void main()
130 { uchar KValue; //存放键值
131 1 Init(); //初始化
132 1 DispBuf[4]=SecValue/10;
133 1 DispBuf[5]=SecValue%10;
134 1
135 1 for(;;)
136 1 {
137 2 DispBuf[2]=MinuteValue/10;
138 2 DispBuf[3]=MinuteValue%10;
139 2 DispBuf[0]=HourValue/10;
140 2 DispBuf[1]=HourValue%10;
141 2
142 2 if(Sec) //1s时间到
143 2 { DispBuf[4]=SecValue/10;
144 3 DispBuf[5]=SecValue%10;
145 3
146 3 if(DispBuf[4]==0)
147 3 DispBuf[4]=Hidden; //高位0消隐
148 3 Sec=0; //清除1s到标志位
149 3 }
150 2
151 2 if(Minute)
152 2 { if(DispBuf[2]==0)
153 3 DispBuf[2]=Hidden; //高位0消隐
154 3 Minute=0; //清除1m到标志位
155 3 }
156 2
157 2 if(Hour)
158 2 { if(DispBuf[0]==0)
159 3 DispBuf[0]=Hidden; //高位0消隐
160 3 Hour=0; //清除1h到标志位
161 3 }
162 2
163 2 KValue=Key(); //调键盘程序获得键值
164 2 if(KValue) //该值不等于0
165 2 { KProce(KValue); //调键盘处理程序
166 3 }
167 2 if(H_up) //小时值调整
168 2 { HourValue++;
169 3 if(HourValue>=24)
170 3 { HourValue=0;
171 4 }
172 3 H_up=0;
173 3 }
174 2 if(H_down)
175 2 { HourValue--;
176 3 H_down=0;
177 3 }
178 2 if(M_up) //分值调整
C51 COMPILER V8.08 KEY 07/28/2008 20:51:10 PAGE 4
179 2 { MinuteValue++;
180 3 if(MinuteValue>=60)
181 3 {MinuteValue=0;
182 4 }
183 3 M_up=0;
184 3 }
185 2 if(M_down)
186 2 { MinuteValue--;
187 3 M_down=0;
188 3 }
189 2 }
190 1 }
191
192
193
194
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 441 ----
CONSTANT SIZE = 25 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 ----
IDATA SIZE = ---- ----
BIT SIZE = 7 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -