📄 kb.lst
字号:
C51 COMPILER V7.09 KB 07/10/2008 01:17:34 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE KB
OBJECT MODULE PLACED IN kb.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE kb.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2
3
4 #include <reg52.h>
5
6 #define uchar unsigned char
7
8 sbit P10=P1^0;
9
10 unsigned char BUFF[8];
11
12 uchar key;
13
14
15
16 unsigned int C,D,E,F;
17
18 unsigned char i,j,k,Temp,PD,TX,TXL,ALS,ALSL;
19
20 //向串口输出一个字符(非中断方式)
21 void ComOutChar(unsigned char OutData)
22 {
23 1 SBUF = OutData; //输出字符
24 1 while(!TI); //空语句判断字符是否发完
25 1 TI = 0; //清TI
26 1 }
27
28
29 //串口初始化
30 void init_serialcomm(void)
31 {
32 1 SCON= 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
33 1 TMOD= 0x21; //TMOD: timer 1, mode 2, 8-bit reload
34 1 PCON= 0x80; //SMOD=1;
35 1 TH1=0xfa;
36 1 TL1=0xfa; //Baud:9600 fosc=11.0592MHz
37 1 ES=1;
38 1 TR1= 1; //timer 1 run
39 1 }
40
41 //10ms定时器初始化
42 void init_timer(void)
43 {
44 1 TMOD=0x21; //timer0:16bit unreload timer1:16bit unreload
45 1 TH0=-(9216/256); //load timer0 (10ms per interrupt 11.0592MHz)
46 1 TL0=-(9216%256);
47 1 ET0=1; //T/C0开中断
48 1 TR0=1; //启动定时器
49 1 }
50 //利用定时器0的方式1编程,采用中断方式
51 void timer0 (void) interrupt 1
52 {
53 1 TH0=-(9216/256); //load timer0 (10ms per interrupt 11.0593MHz)
54 1 TL0=-(9216%256);
55 1
C51 COMPILER V7.09 KB 07/10/2008 01:17:34 PAGE 2
56 1 F=F+1;
57 1
58 1
59 1 if(F==100) //0.20秒时间到,检测是否有报警
60 1
61 1 {
62 2
63 2 F=0;
64 2
65 2 P10=!P10;
66 2
67 2 C=1;
68 2
69 2
70 2
71 2 }
72 1
73 1
74 1
75 1 }
76
77 //串行中断程序
78 void serial () interrupt 4 using 3
79 {
80 1
81 1 if(RI)//当接受完一个字节后
82 1 {
83 2
84 2
85 2 Temp=SBUF;
86 2
87 2 if (Temp!=0x80)
88 2
89 2 {
90 3
91 3 BUFF[j]=Temp;
92 3
93 3 j=j+1;
94 3
95 3 }
96 2
97 2
98 2
99 2 if (Temp==0x80) //命令接收完成,置位PD
100 2 {
101 3
102 3 j=0;
103 3
104 3 PD=0x01;
105 3
106 3 }
107 2
108 2 RI=0;
109 2
110 2 }
111 1
112 1
113 1
114 1
115 1
116 1 }
117
C51 COMPILER V7.09 KB 07/10/2008 01:17:34 PAGE 3
118 void delay10ms(void) //10毫秒延时程序
119
120 {
121 1 unsigned char i,j,k;
122 1 for(i=5;i>0;i--)
123 1 for(j=4;j>0;j--)
124 1 for(k=248;k>0;k--); //248
125 1 }
126
127
128
129 uchar kbscan(void) // 键盘扫描程序
130 {
131 1
132 1 uchar sccode,recode;
133 1
134 1 P0=0xf0; //置所有行为低电平,行扫描,列线输入(此时)
135 1
136 1 if((P0&0xf0)!=0xf0) //判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成0111
- 0000),有往下执行
137 1 {
138 2 delay10ms(); //延时去抖动(10ms)
139 2 if((P0&0xf0)!=0xf0) //再次判断列中是否是干扰信号,不是则向下执行
140 2 {
141 3 sccode=0xFE; //逐行扫描初值(即先扫描第1行)
142 3 while((sccode&0x10)!=0)//行扫描完成时(即4行已经全部扫描完成)sccode为1110 1111 停止while程序
143 3 {
144 4 P0=sccode; //输出行扫描码
145 4 if ((P0&0xf0)!=0xf0) //本行有键按下(即P1(真实的状态)的高四位不全为1)
146 4 {
147 5 recode=(P0&0xf0)|0x0f; //列
148 5 return(sccode&recode); //返回行和列
149 5 }
150 4 else //所扫描的行没有键按下,则扫描下一行,直到4行都扫描
151 4 {
152 5 sccode=(sccode<<1)|0x01;//行扫描码左移一位
153 5 }
154 4 }
155 3 }
156 2 }
157 1 else
158 1 {
159 2 return 0; //无键按下,返回0
160 2 }
161 1 }
162
163
164
165
166 //主函数入口
167 void main(void)
168 {
169 1
170 1
171 1
172 1 init_timer();
173 1 init_serialcomm();
174 1 EA=1;
175 1 TR0=1;
176 1 ES=1;
177 1 while(1)
178 1
C51 COMPILER V7.09 KB 07/10/2008 01:17:34 PAGE 4
179 1 {
180 2
181 2 if (C==1)
182 2
183 2 {
184 3
185 3 C=0;
186 3
187 3 key=kbscan();
188 3
189 3
190 3 if (key!=0x00)
191 3
192 3 {
193 4 ComOutChar(key);
194 4
195 4
196 4 }
197 3
198 3
199 3
200 3 }
201 2
202 2 }
203 1
204 1 }
205
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 233 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 26 ----
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 + -