📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 07/28/2005 20:31:13 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 <absacc.h>
2 #include <reg51.h>
3 #include <intrins.h>
4 #include <stdio.h>
5 #include <24c64.h>
6
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;
27 sbit KEY2= P1^1;
28 sbit KEY3= P1^2;
29 sbit KEY4= P1^3;
30
31 sbit SCL =P1^5;
32 sbit SDA =P1^7;
33
34 /*////////////////////////////*/
35 /*/ 变量定义 /*/
36 /*////////////////////////////*/
37
38 /* 1s软件定时器计数 */
39 unsigned char clock1s;
40 /* 1s软件定时器溢出标志,位变量 */
41 bit clock1s_flag;
42
43 /* 数码管位驱动和指示灯驱动信号输出缓存,定义了一个可位寻址的变量 */
44 unsigned char bdata output_sel;
45 sbit led_1 = output_sel^5;
46 sbit led_2 = output_sel^6;
47 sbit led_3 = output_sel^7;
48 sbit led_4 = output_sel^4;
49
50 /* 数码管扫描驱动指针,为测试外部存储器(U3 6264),特使用xdata类型 */
51 unsigned char xdata digi_scaner;
52
53 /* 测试用计数器,为测试外部存储器(U3 6264),特使用xdata类型 */
54 unsigned int xdata test_counter;
55 /* 测试用计数值十进制表示,为测试外部存储器(U3 6264),特使用xdata类型 */
C51 COMPILER V7.06 MAIN 07/28/2005 20:31:13 PAGE 2
56 unsigned char xdata digi[4];
57
58 //test i2c
59 Uchar ch0, rec;
60 Uchar buf[8]="0000000";
61 Uchar *ch=&ch0;
62 Uchar *str = buf;
63 ////////////////////////////////////////////////////////////////
64 ////////////////////////////////////////////////////////////////
65
66
67 /*////////////////////////////*/
68 /*/ 函数定义 /*/
69 /*////////////////////////////*/
70
71 /**** 7段数码显示译码
72 参数:
73 DATA: 需要显示的数字或符号;
74 返回值: 7段译码结果 ( D7~0 = PGFEDCBA )
75 *****/
76 unsigned char NUMTOSEG7(unsigned char DATA)
77 { unsigned char AA;
78 1 switch (DATA)
79 1 { case 0: AA=0xc0;break; /* ‘0’*/
80 2 case 1: AA=0xf9;break; /* ‘1’*/
81 2 case 2: AA=0xa4;break; /* ‘2’*/
82 2 case 3: AA=0xb0;break; /* ‘3’*/
83 2 case 4: AA=0x99;break; /* ‘4’*/
84 2 case 5: AA=0x92;break; /* ‘5’*/
85 2 case 6: AA=0x82;break; /* ‘6’*/
86 2 case 7: AA=0xf8;break; /* ‘7’*/
87 2 case 8: AA=0x80;break; /* ‘8’*/
88 2 case 9: AA=0x90;break; /* ‘9’*/
89 2 case 10: AA=0x88;break; /* ‘A’*/
90 2 case 11: AA=0x83;break; /* ‘B’*/
91 2 case 12: AA=0xc6;break; /* ‘C’*/
92 2 case 13: AA=0xa1;break; /* ‘D’*/
93 2 case 14: AA=0x86;break; /* ‘E’*/
94 2 case 15: AA=0x8e;break; /* ‘F’*/
95 2 case '-':AA=0xdf;break; /* 破折号*/
96 2 case '_':AA=0xf7;break; /* 下划线*/
97 2 case ' ':AA=0xff;break; /* 消隐*/
98 2 default: AA=0xff;
99 2 }
100 1 return(AA);
101 1 }
102
103
104
105 /**** T0时钟中断服务程序
106 在本例中,每5ms被执行一次
107 *****/
108
109 timer0() interrupt 1 using 0
110 {
111 1 EA=0; /*关中断*/
112 1
113 1 /* 重新对计数器赋初值,并启动定时计数 */
114 1 TH0=V_TH0;
115 1 TL0=V_TL0;
116 1 TR0=1;
117 1
C51 COMPILER V7.06 MAIN 07/28/2005 20:31:13 PAGE 3
118 1 /* 1秒钟软定时器计数 */
119 1 if (++clock1s>=V_T1s)
120 1 {
121 2 clock1s_flag = 1; /*当1秒到时,溢出标志置1 */
122 2 clock1s = 0;
123 2 }
124 1
125 1
126 1
127 1 output_sel = 0xf0; /*初值,令数码管驱动位无效,指示灯全灭*/
128 1
129 1 /* 检测到按键被按下(0)时,相应的指示灯亮(0) */
130 1 if (KEY1==0) led_1 = 0;
131 1 if (KEY2==0) led_2 = 0;
132 1 if (KEY3==0) led_3 = 0;
133 1 if (KEY4==0) led_4 = 0;
134 1
135 1 /* 数码管扫描驱动指针值从1到4重复变换,每5ms间隔对一个数码管进行驱动,20ms一个轮回 */
136 1 if (++digi_scaner>=5) digi_scaner = 1;
137 1 switch (digi_scaner)
138 1 {
139 2 case 1: /* 驱动第一个数码管 */
140 2 output_sel |= 0x01;
141 2 ADDR_8SEG = NUMTOSEG7(digi[0]); /*输出到锁存器U5(在电路图中找)*/
142 2 break;
143 2
144 2 case 2: /* 驱动第二个数码管 */
145 2 output_sel |= 0x02;
146 2 ADDR_8SEG = NUMTOSEG7(digi[1]); /*输出到锁存器U5*/
147 2 break;
148 2
149 2 case 3: /* 驱动第三个数码管 */
150 2 output_sel |= 0x04;
151 2 ADDR_8SEG = NUMTOSEG7(digi[2]); /*输出到锁存器U5*/
152 2 break;
153 2
154 2 case 4: /* 驱动第四个数码管 */
155 2 output_sel |= 0x08;
156 2 ADDR_8SEG = NUMTOSEG7(digi[3]); /*输出到锁存器U5*/
157 2 break;
158 2 }
159 1
160 1 ADDR_SEL = output_sel; /*输出到锁存器U6(在电路图中找)*/
161 1
162 1
163 1 EA=1; /*开中断*/
164 1 }
165
166
167 /**** 主程序*****/
168
169 main()
170 {
171 1
172 1 /* 单片机系统初始化 */
173 1 P1=0XFF;
174 1 P3=0XFF;
175 1 /** 中断工作寄存器初始化 **/
176 1 IE=0X80;
177 1 IP=0;
178 1 IT0=0;
179 1 IT1=0;
C51 COMPILER V7.06 MAIN 07/28/2005 20:31:13 PAGE 4
180 1 /** 定时器工作寄存器初始化 **/
181 1 TMOD=0X21;
182 1 TH1=V_T1;
183 1 TL1=V_T1;
184 1 TH0=V_TH0;
185 1 TL0=V_TL0;
186 1 /** 串行通信口工作初始化 ,注:本例中虽未使用到串行通信口,但本段程序无妨保留**/
187 1 SM0=0; /*SCOM MODE 1 (8BIT UART VARBR)*/
188 1 SM1=1;
189 1 SM2=0;
190 1 REN=1;
191 1 TI=1;
192 1 /** 全局变量赋初值 **/
193 1 clock1s=0;
194 1 clock1s_flag=0;
195 1 digi_scaner=1;
196 1 /** 开定时器,定时器0中断允许 **/
197 1 TR0=1;
198 1 TR1=1;
199 1 ET0=1;
200 1
201 1 *ch = 'c';
202 1 // rec = ByteSend_TEST(ch, 0xA0);
203 1 EA=0; PageSend_TEST(buf);EA=1;
204 1 /* 主循环,本例中,在T0中断服务程序未被执行的空余时间里,处理机在以下程序中不断循环 */
205 1 while(1)
206 1 {
207 2 digi[0] = 1; /*计算千位数*/
208 2 digi[1] = 0; /*计算百位数*/
209 2 digi[2] = 1; /*计算十位数*/
210 2 digi[3] = 0; /*计算个位数*/
211 2
212 2 Stop_I2c();
213 2
214 2 if (clock1s_flag) /* 检查1秒定时是否到 */
215 2 {
216 3 clock1s_flag=0;
217 3
218 3 ET0=0;
219 3 // DisplayOneChar(0,0,*ch); //for test
220 3 // DisplayOneChar(5,0,rec); //for test
221 3 // printf("%c",ch);
222 3 ET0=1;
223 3 /** 每秒加1的数码管十进制显示计数 **/
224 3 if (++test_counter>=10000) test_counter=0;
225 3 digi[0] = test_counter/1000; /*计算千位数*/
226 3 digi[1] = (test_counter-digi[0]*1000)/100; /*计算百位数*/
227 3 digi[2] = (test_counter-digi[0]*1000-digi[1]*100)/10; /*计算十位数*/
228 3 digi[3] = (test_counter-digi[0]*1000-digi[1]*100-digi[2]*10); /*计算个位数*/
229 3
230 3 }
231 2 }
232 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 590 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 7 ----
PDATA SIZE = ---- ----
DATA SIZE = 18 1
IDATA SIZE = ---- ----
C51 COMPILER V7.06 MAIN 07/28/2005 20:31:13 PAGE 5
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 + -