📄 main.lst
字号:
C51 COMPILER V7.07 MAIN 09/26/2008 11:05:59 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //*******************************************************************
2 #include"at89x52.h"
3 #include<intrins.h>
4 #include<math.h>
5 bit FLAG0=0; /*设定位标号FLAG0=1键盘扫描回应*/
6 bit FLAG1=1; /*设定位标号20H.1比较密码回应旗号*/
7 char m,ptr=0,ptr1=0; /*PTR键盘扫描指标,ptr1显示器扫描指标*/
8 char a1=0,b1=100,stand=0,m=0; /*宣告变数a1为TIMER0的中断次数,ptr为TIMER1扫描数码管指标*/
9 char disple[10]; /*显示值存放阵列*/
10 unsigned char bufuart[8]; /*串口接收值存放阵列*/
11 unsigned char tem[8];
12 unsigned char bufdata[9];
13 unsigned char num=0;
14 unsigned char key_sym;
15 unsigned char i=0;
16 unsigned char crc;
17 unsigned char sym;
18 unsigned char tim;
19 static const char tab[16]={0x01,0x02,0x03,0x0c, /*键盘码00,01,02,03,*/
20 0x04,0x05,0x06,0x0d, /*键盘码04,05,06,07,*/
21 0x07,0x08,0x09,0x0e, /*键盘码08,09,0a,0b,*/
22 0x0a,0x00,0x0b,0x0f};/*键盘码0c,0d,0e,0f*/
23 void delay (unsigned int value) /*延时副程式*/
24 {
25 1 while (value!=0) value--; /*10US延时*/
26 1 }
27 void scan(void); /*键盘扫描副程式*/
28 void clear(void);
29 void angle(void);
30 void speed(void);
31 void tserial(void);
32 void xch(void);
33 /*********************************************************************/
34 main() /*主程式*/
35 {
36 1 TMOD=0x01;
37 1 TH0=(65536-3000)/256;
38 1 TL0=(65536-3000)%256;
39 1 TR0=1;
40 1 T2CON=0x38;
41 1 TL2=0xfd;
42 1 TH2=0xff; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
43 1 RCAP2L=0xdc; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
44 1 RCAP2H=0xff; /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
45 1 TH2=256-(28800/9600); /*设定传输波特率9600,晶体振荡器=11.059Mhz*/
46 1 /*|波特率9600时|SMOD=0|C/T=0|模式=2|自动载入TH1=FD|*/
47 1 /*|波特率4800时|SMOD=0|C/T=0|模式=2|自动载入TH1=FA|*/
48 1 /*|波特率2400时|SMOD=0|C/T=0|模式=2|自动载入TH1=F4|*/
49 1 /*|波特率1200时|SMOD=0|C/T=0|模式=2|自动载入TH1=E8|*/
50 1 TR2=1; /*启动TEMER2*/
51 1 SCON=0x50; /*设定UART工作在MODE3模式,可传送和接收数据 REN=1*/
52 1 /*串列控制寄存器SCON_______________________*/
53 1 /*| 7 6 5 4 | 3 2 1 0 |*/
54 1 /*| SM0| SM1| SM2| REN| TB8| RB8| TI | RI |*/
55 1 /*|___________________|___________________|*/
C51 COMPILER V7.07 MAIN 09/26/2008 11:05:59 PAGE 2
56 1 IE=0x9f; /*8是允许中断,a是TIMER0,TIMER1中断致能位*/
57 1 /*| 7 6 5 4 | 3 2 1 0 |*/
58 1 /*| EA | | ET2| ES | ET1| EX1| ET0| EX0|*/
59 1 /*|___________________|___________________|*/
60 1 IP=0x10; /*中断优先级寄存器IP_______________________*/
61 1 /*| | | PT2| PS | PT1| PX1| PT0| PX0|*/
62 1 /*|___________________|___________________|*/
63 1
64 1 P2_0=1; /*关喇叭灭指示灯*/
65 1 key_sym=3;
66 1 while(1)
67 1 {
68 2 scan();
69 2 if(tim>160)// 480ms
70 2 {
71 3 tim=0;
72 3 if(key_sym==1) angle();
73 3 else if(key_sym==2) angle();
74 3 else if(key_sym==3) speed();
75 3 }
76 2
77 2 if(FLAG0==1) /*判断有按键输入否?111111111111*/
78 2 {
79 3 switch(tab[ptr])
80 3 {
81 4 case 0x00:
82 4 case 0x01:
83 4 case 0x02:
84 4 case 0x03:
85 4 case 0x04:
86 4 case 0x05:
87 4 case 0x06:
88 4 case 0x07:
89 4 case 0x08:
90 4 case 0x09:
91 4 if(sym==1)
92 4 {
93 5 xch();
94 5 num++;
95 5 }
96 4 break;
97 4 case 0x0d:
98 4 key_sym=1;
99 4 //angle();
100 4 break;
101 4 case 0x0e:
102 4 key_sym=2;
103 4 //angle();
104 4 break;
105 4 case 0x0f:
106 4 key_sym=3;
107 4 //speed();
108 4 break;
109 4 case 0x0a:
110 4 sym=1;
111 4 num=0;
112 4 clear();
113 4 break;
114 4 case 0x0b:
115 4 if(sym==1)
116 4 {
117 5 sym=0;
C51 COMPILER V7.07 MAIN 09/26/2008 11:05:59 PAGE 3
118 5 tserial();
119 5 }
120 4 break;
121 4 default:
122 4 break;
123 4 }
124 3 delay(100);
125 3 while(m==P1);
126 3 delay(100);
127 3 }/*判断有按键输入否?111111111111*/
128 2
129 2 delay(300);
130 2 }//while(1)
131 1
132 1 }
133
134
135 /*--------------------------------------*/
136 void scan(void) /*扫描键盘副程式*/
137 {
138 1 char a1=0xf7,i; /*A1=0XF7列扫描初值,I行*/
139 1 FLAG0=0; /*设按键回应旗号为0,键盘扫描计数指标为0*/
140 1 ptr=0;
141 1 for(i=0;i<4;i++) /*键盘4个扫描列*/
142 1 {
143 2 P1=a1; /*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
144 2 m=P1;
145 2 switch(m&0xf0) /*取行的高4位元,侦测那一行被按*/
146 2 {
147 3 case 0x70: ptr=i*4; /*第一行被按否?是则扫描指标=列X4*/
148 3 FLAG0=1; /*是则设FLAG0=1表有按键输入*/
149 3 break; /*跳出此循环*/
150 3 case 0xb0: ptr=i*4+1; /*第二行被按否?是则扫描指标=列X4+1*/
151 3 FLAG0=1; /*是则设FLAG0=1表有按键输入*/
152 3 break; /*跳出此循环*/
153 3 case 0xd0: ptr=i*4+2; /*第三行被按否?是则扫描指标=列X4+2*/
154 3 FLAG0=1; /*是则设FLAG0=1表有按键输入*/
155 3 break; /*跳出此循环*/
156 3 case 0xe0: ptr=i*4+3; /*第四行被按否?是则扫描指标=列X4+3*/
157 3 FLAG0=1; /*是则设FLAG0=1表有按键输入*/
158 3 default: break; /*跳出此循环*/
159 3 }
160 2 if(FLAG0==1)break; /*不为1,则扫描列右移,扫描下一列*/
161 2 a1=a1>>1|0x80; /*高位补1,由于P1.7~P1.4未接+5V,而是由指令加载高电平*/
162 2 }
163 1 } /*返回主程式*/
164
165 /****************************************************/
166 void clear(void)
167 {
168 1 char c;
169 1 for(c=0;c<6;c++)
170 1 {
171 2 disple[c]=0x00;
172 2 }
173 1 }
174
175
176 void xch(void) /*显示向右移动副程式*/
177 {
178 1 char c; /*宣告变数*/
179 1 for(c=5;c>0;c--)
C51 COMPILER V7.07 MAIN 09/26/2008 11:05:59 PAGE 4
180 1 {
181 2 disple[c]=disple[c-1]; /*将显示器disple[]移位交换,disple[3]->disple[4]->disple[5]...*/
182 2 }
183 1 disple[0]=tab[ptr]; /*新的按键值存入disple[0]*/
184 1 } /*返回主程式*/
185 /****************************************************/
186
187 void angle(void)
188 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -