📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 09/02/2005 20:04:34 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2 #include <stdio.h>
3 #include <8255A.h>
4 #include <intrins.h>
5 #include <keyboard.h>
6 #define ADDR_LED XBYTE[0X4000]
7 /*////////////////////////////*/
8 /*/ 常量定义 /*/
9 /*////////////////////////////*/
10
11 /* 定时器初值 */
12 #define V_T1 0xfd /*SCOM 9600 baud, ! notice: crystal 11.0592MHz */
13 #define V_TH0 0xee /* ~ 5ms , ! notice: crystal 11.0592MHz */
14 #define V_TL0 0x00
15
16 /* 1s软件定时器溢出值,200个5ms */
17 #define V_T1s 200
18
19 /* 数码管段驱动寄存器地址 */
20 #define ADDR_8SEG XBYTE[0x2000]
21
22 /* 数码管位驱动和指示灯驱动寄存器地址 */
23 #define ADDR_SEL XBYTE[0x4000]
24
25 /* 按键 */
26 sbit KEY1= P1^0; /*P1^0等同p1.0管脚*/
27 sbit KEY2= P1^1;
28 sbit KEY3= P1^2;
29 sbit KEY4= P1^3;
30
31
32 /*////////////////////////////*/
33 /*/ 变量定义 /*/
34 /*////////////////////////////*/
35
36 /* 1s软件定时器计数 */
37 unsigned char clock1s,k=0,key;
38 /* 1s软件定时器溢出标志,位变量 */
39 bit clock1s_flag;
40
41 /* 数码管位驱动和指示灯驱动信号输出缓存,定义了一个可位寻址的变量 */
42 unsigned char bdata output_sel;
43 sbit led_1 = output_sel^5;
44 sbit led_2 = output_sel^6;
45 sbit led_3 = output_sel^7;
46 sbit led_4 = output_sel^4;
47
48 /* 数码管扫描驱动指针,(为测试外部存储器(U3 6264),特使用xdata类型) */
49 unsigned char data digi_scaner;
50
51 /* 测试用计数器,(为测试外部存储器(U3 6264),特使用xdata类型) */
52 unsigned int data test_counter;
53 /* 扫描字符,(为测试外部存储器(U3 6264),特使用xdata类型) */
54 unsigned char data digi[4];
55
C51 COMPILER V7.06 MAIN 09/02/2005 20:04:34 PAGE 2
56 //
57 char n=0,key_flag=0;
58
59 //////////////////////////////////////////////////////////////////////////
60 //////////////////////////////////////////////////////////////////////////
61
62 void Delay()
63 {
64 1 Uchar i=0;
65 1 for(i=0;i<=100;i++);
66 1 }
67
68 unsigned char CHARTOSEG7(unsigned char DATA)
69 {
70 1 unsigned char AA;
71 1 switch (DATA)
72 1 {
73 2 case 'H': AA=0x89;break; /* 'H'*/
74 2 case 'E': AA=0x86;break; /* 'E'*/
75 2 case 'L': AA=0xc7;break; /* 'L'*/
76 2 case 'O': AA=0xc0;break; /*字符'O'*/
77 2 case 'U': AA=0x41;break; /* 'U.'*/
78 2 case 'J': AA=0xf1;break; /* 'W'的后半部*/
79 2 case 'o': AA=0xa3;break; /* 'o'*/
80 2 case 'r': AA=0xaf;break; /* 'r'*/
81 2 case 'l': AA=0xf9;break; /* 'l'*/
82 2 case 'd': AA=0xa1;break; /* 'd'*/
83 2 case 0: AA=0xc0;break; /* ‘0’*/
84 2 case 1: AA=0xf9;break; /* ‘1’*/
85 2 case 2: AA=0xa4;break; /* ‘2’*/
86 2 case 3: AA=0xb0;break; /* ‘3’*/
87 2 case 4: AA=0x99;break; /* ‘4’*/
88 2 case 5: AA=0x92;break; /* ‘5’*/
89 2 case 6: AA=0x82;break; /* ‘6’*/
90 2 case 7: AA=0xf8;break; /* ‘7’*/
91 2 case 8: AA=0x80;break; /* ‘8’*/
92 2 case 9: AA=0x90;break; /* ‘9’*/
93 2 case 10: AA=0x88;break; /* ‘A’*/
94 2 case 11: AA=0x83;break; /* ‘B’*/
95 2 case 12: AA=0xc6;break; /* ‘C’*/
96 2 case 13: AA=0xa1;break; /* ‘D’*/
97 2 case 14: AA=0x86;break; /* ‘E’*/
98 2 case 15: AA=0x8e;break; /* ‘F’*/
99 2 case '-':AA=0xdf;break; /* 破折号*/
100 2 case '_':AA=0xf7;break; /* 下划线*/
101 2 case ' ':AA=0xff;break; /* 消隐 */
102 2 default: AA=0xff;
103 2 }
104 1 return(AA);
105 1 }
106
107
108
109 timer0() interrupt 1 using 0
110 {
111 1
112 1 EA=0; /*关中断*/ /*EA: enable all*/
113 1
114 1 /* 重新对计数器赋初值,并启动定时计数 */
115 1 TH0=V_TH0;
116 1 TL0=V_TL0;
117 1 TR0=1;
C51 COMPILER V7.06 MAIN 09/02/2005 20:04:34 PAGE 3
118 1
119 1 /* 1秒钟软定时器计数 */
120 1 if (++clock1s>=V_T1s)
121 1 {
122 2 clock1s_flag = ~clock1s_flag; /*当1秒到时,溢出标志置1 */
123 2 clock1s = 0;
124 2 }
125 1
126 1
127 1 output_sel = 0xf0; /*初值,令数码管驱动位无效,指示灯全灭*/
128 1
129 1 /* 检测到按键被按下(0)时,相应的指示灯亮(0) */
130 1 if (KEY1==0) {led_1 = 0;k=1;}
131 1 else if (k==1) {key=1;k=0;}
132 1 if (KEY2==0) {led_2 = 0;k=2;}
133 1 else if (k==2) {key=2;k=0;}
134 1 if (KEY3==0) {led_3 = 0;k=3;}
135 1 else if (k==3) {key=3;k=0;}
136 1 if (KEY4==0) {led_4 = 0;k=4;}
137 1 else if (k==4) {key=4;k=0;}
138 1
139 1 /* 数码管扫描驱动指针值从1到4重复变换,每5ms间隔对一个数码管进行驱动,20ms一个轮回 */
140 1 if (++digi_scaner>=5) digi_scaner = 1;
141 1 switch (digi_scaner)
142 1 {
143 2 case 1: /* 驱动第一个数码管 */
144 2 output_sel |= 0x01;
145 2 ADDR_8SEG = CHARTOSEG7(digi[0]); /*输出到锁存器U5(在电路图中找)*/
146 2 break;
147 2
148 2 case 2: /* 驱动第二个数码管 */
149 2 output_sel |= 0x02;
150 2 ADDR_8SEG = CHARTOSEG7(digi[1]); /*输出到锁存器U5*/
151 2 break;
152 2
153 2 case 3: /* 驱动第三个数码管 */
154 2 output_sel |= 0x04;
155 2 ADDR_8SEG = CHARTOSEG7(digi[2]); /*输出到锁存器U5*/
156 2 break;
157 2
158 2 case 4: /* 驱动第四个数码管 */
159 2 output_sel |= 0x08;
160 2 ADDR_8SEG = CHARTOSEG7(digi[3]); /*输出到锁存器U5*/
161 2 break;
162 2 }
163 1
164 1
165 1 ADDR_SEL = output_sel; /*输出到锁存器U6(在电路图中找)*/
166 1
167 1 EA=1; /*开中断*/
168 1 }
169
170
171 void SerialInit()
172 {
173 1 /* 单片机系统初始化 */
174 1 P1=0XFF;
175 1 P3=0XFF;
176 1 /** 中断工作寄存器初始化 **/
177 1 IE=0X80;
178 1 IP=0;
179 1 IT0=0;
C51 COMPILER V7.06 MAIN 09/02/2005 20:04:34 PAGE 4
180 1 IT1=0;
181 1 /** 定时器工作寄存器初始化 **/
182 1 TMOD=0X21;
183 1 TH1=V_T1;
184 1 TL1=V_T1;
185 1 TH0=V_TH0;
186 1 TL0=V_TL0;
187 1 /** 串行通信口工作初始化 **/
188 1 SM0=0; /*SCOM MODE 1 (8BIT UART VARBR)*/
189 1 SM1=1;
190 1 SM2=0;
191 1 REN=1;
192 1 TI=1;
193 1 /** 全局变量赋初值 **/
194 1 clock1s=0;
195 1 clock1s_flag=0;
196 1 digi_scaner=1;
197 1
198 1 /** 开定时器,定时器0中断允许 **/
199 1 TR0=1;
200 1 TR1=1;
201 1 ET0=1;
202 1 output_sel = 0xf0; /*初值,令数码管驱动位无效,指示灯全灭*/
203 1
204 1 }
205
206
207 void main()
208 {
209 1 int temp;
210 1 SerialInit();
211 1
212 1 EA=0;
213 1 Init8255A();
214 1 printf("init\n");
215 1 EA=1;
216 1
217 1 EA=0;
218 1 SelectForm0(0,0,0,1);
219 1
220 1 // while(1)
221 1 {
222 2 // PortA=0xff-0x80;
223 2 // temp=0;
224 2 // while(temp==0)
225 2 {
226 3 // temp=getrow();
227 3 }
228 2 // while(temp!=0)
229 2 {
230 3 // temp=getrow();
231 3 }
232 2 // printf("%d\n",temp);
233 2 }
234 1
235 1 while (1)
236 1 {
237 2 // if (clock1s_flag) {clock1s_flag=1;printf("%x,%x\n",col,row);}
238 2 /*if (key_flag)
239 2 {
240 2 EA=0;
241 2 putchar(col+0x30);
C51 COMPILER V7.06 MAIN 09/02/2005 20:04:34 PAGE 5
242 2 putchar(0x20);
243 2 putchar(row+0x30);
244 2 putchar(13);putchar(10);
245 2 key_flag=0;
246 2 printf()
247 2 EA=1;
248 2 }*/
249 2 EA=0;
250 2 temp=GetKey();
251 2 printf("%d\n",temp) ;
252 2 EA=1;
253 2 digi[0]=temp%10;
254 2 digi[1]=temp/10;
255 2 }
256 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 580 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 3
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -