📄 led.lst
字号:
C51 COMPILER V7.10 LED 10/22/2007 09:39:59 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE LED
OBJECT MODULE PLACED IN led.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE led.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <STC89C58.h>
2 #include <intrins.h>
3 #include <ctype.h>
4 #include <string.h>
5 #include <absacc.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <typedef.h>
9
10 // define XT0 221184
11 #define XT1 110592
12
13 #define STC89C58 1
14 #define W77E58 0
15
16 #define STCSPD_1 0 // STC单片机用单倍速
17 #define STCSPD_2 1 // STC单片机用双倍速
18
19 #define vT01MS 4
20 #define vT010MS 10
21 #define vT01S 100
22 #define vLedFlashTimeVal 38
23
24 #define vKeyVal_Null 0x00
25 #define vKeyVal_Set 0x01
26
27 #define vKeyAct_Null 0
28 #define vKeyAct_Push 1
29 #define vKeyAct_Pop 2
30 #define vKeyAct_Keep 3
31
32 #define vBtnVal_Null 0x00
33 #define vBtnVal_ST 0x08
34 #define vBtnVal_Up 0x10
35 #define vBtnVal_Down 0x20
36 #define vBtnVal_All 0x30
37
38
39 #define vBtnAct_Null 0
40 #define vBtnAct_Push 1
41 #define vBtnAct_Pop 2
42 #define vBtnAct_Keep 3
43 #define vBtnAct_All 4
44 #if STC89C58
45 #include "STC89C58.h"
46 #elif W77E58
#include "W77E58.h"
#endif
49
50 #if STC89C58
51 #if STCSPD_1
#define vBaudTime 0xff // 0xfa对应9600Hz波特率,但若要查看信令解码数据,则要用57600Hz(0xff)
#define vT0HVal 0xfc
#define vT0LVal 0x76
#elif STCSPD_2
C51 COMPILER V7.10 LED 10/22/2007 09:39:59 PAGE 2
56 #define vBaudTime 0xfa // 0xfa对应9600Hz波特率,但若要查看信令解码数据,则要用57600Hz(0xff)
57 #define vT0HVal 0xfe //0xfc//0xfe//0xff
58 #define vT0LVal 0x0c //0x76//0x43//0x19
59 #endif
60
61 #elif W77E58
#define vBaudTime 0xff // 0xfa对应9600Hz波特率,但若要查看信令解码数据,则要用57600Hz(0xff)
#define vT0HVal 0xfc
#define vT0LVal 0x76
#endif
66
67 sbit KS0 =P2^3;
68 sbit KS1 =P2^4;
69 sbit KS2 =P2^5;
70
71 sbit LED =P2^7;
72 sbit RELAY =P2^2;
73
74 uchar data cT01ms; // 定时器0中的1ms,10ms,及1s的时基计数器
75 uchar data cT010ms;
76 uchar data cT01s;
77 uint data iDY_Timer; // 通用定时器计数值
78 uchar idata cDY_LedFlash; // 指示灯闪烁时隔计数
79 uchar idata cDY_KeyKeep; // 按键延时计时器
80 uint iKeyVal;
81
82 uchar cKeySetValue; // 键盘进行项目设置时的数值
83 uchar cBtnVal; // 按钮取值
84 uchar cBtnValPre; // 原按钮取值
85 uchar vSecond;
86 uchar vMinute;
87 uchar vHour;
88
89 uchar code Led_Data[28]={
90 0x05, //0
91 0xDD, //1
92 0x46, //2
93 0x54, //3
94 0x9C, //4
95 0x34, //5
96 0x24, //6
97 0x5D, //7
98 0x04, //8
99 0x14, //9
100 0x0C, //A
101 0xA4, //b
102 0x27, //C
103 0xE6, //c
104 0xC4, //d
105 0x26, //E
106 0x2E, //F
107 0x8C, //H
108 0xAC, //h
109 0xA7, //L
110 0xEC, //n
111 0x0D, //N
112 0xE4, //o
113 0x0E, //P
114 0xEE, //r
115 0xA6, //t
116 0x85, //U
117 0xFE, //-
C51 COMPILER V7.10 LED 10/22/2007 09:39:59 PAGE 3
118 };
119
120 uchar vEEprom;
121 bit b_Run;
122
123 uchar digbit; // 字位
124 uchar wordbuf[4]; // 字型码缓冲区
125 uchar time[3];
126 uint idata time0_tmp; // 临时变量,用于计算定时
127
128 #define DIGPORT P1 // 定义字位口
129 #define WORDPORT P0 // 定义字型口
130
131 #define UseAddr 0x9000 //0x8000~0xf3ff空间地址
132 #define vSecondAddr 0x9001
133 #define vMinuteAddr 0x9002
134 #define vHourAddr 0x9003
135
136 #define BaseAddr 0x8000 //起始地址
137 #define EndSectoraddr 0xf200
138 #define EndAddr 0xf3ff //末地址
139
140 #define PerSector 512 //定义扇区大小
141
142 #define RdCommand 0x01 /* 字节读 */
143 #define PrgCommand 0x02 /* 字节写 */
144 #define EraseCommand 0x03 /* 扇区擦除 */
145
146 #define Error 1
147 #define Ok 0
148
149 /*
150 sfr ISP_DATA =0xe2; // ISP/IAP FLASH数据寄存器
151 sfr ISP_ADDRH =0xe3; // ISP/IAP FLASH地址高位
152 sfr ISP_ADDRL =0xe4; // ISP/IAP FLASH地址低位
153 sfr ISP_CMD =0xe5; // ISP/IAP FLASH指令寄存器
154 sfr ISP_TRIG =0xe6; // ISP/IAP FLASH指令触发器
155 sfr ISP_CONTR =0xe7; // ISP/IAP 控制寄存器
156 /*
157 sfr isp_data=0xe2;
158 sfr isp_addrh=0xe3;
159 sfr isp_addrl=0xe4;
160 sfr isp_cmd=0xe5;
161 sfr isp_trig=0xe6;
162 sfr isp_contr=0xe7;
163 */
164 //uchar eeprom_read(uint addres);
165 //void eeprom_write(uint address,uchar wdata);
166 //void eeprom_eares(uint addres);//扇区擦除。
167
168 //uchar getcode(uchar i); // 根据共阴极字型编码表获取字型代码函数
169 //void display(void); // 显示函数
170 /**************************************************************************
171 * 函数原型: void eeprom_eares(uint addres)
172 * 功 能: 扇区擦除
173 **************************************************************************/
174 void eeprom_eares(uint addres){
175 1 // uchar i;
176 1 ISP_ADDRL=addres; //低位地址
177 1 ISP_ADDRH=addres>>8; //高位地址
178 1 ISP_CONTR=0x01;
179 1 ISP_CONTR|=0x80; //设时间与充ISP操作。
C51 COMPILER V7.10 LED 10/22/2007 09:39:59 PAGE 4
180 1 ISP_CMD=0x03; //扇区命命令
181 1 ISP_TRIG=0x46; //触发
182 1 ISP_TRIG=0xb9; //触发启动。
183 1 _nop_();
184 1 // for(i=0;i<3;i++);
185 1 ISP_ADDRL=0xff;
186 1 ISP_ADDRH=0xff;
187 1 ISP_CONTR=0x00;
188 1 ISP_CMD=0x00;
189 1 ISP_TRIG=0x00;
190 1 }
191
192 /**************************************************************************
193 * 函数原型: void eeprom_write(uint addres,uchar write_data)
194 * 功 能: 单字节写数据
195 **************************************************************************/
196 void eeprom_write(uint addres,uchar write_data){
197 1 // uchar i;
198 1 ISP_DATA=write_data; //要写入的数据。
199 1 ISP_ADDRL=addres; //低位地址
200 1 ISP_ADDRH=addres>>8; //高位地址
201 1 ISP_CONTR=0x01;
202 1 ISP_CONTR|=0x80; //设时间与充ISP操作。
203 1 ISP_CMD=0x02; //写命令
204 1 ISP_TRIG=0x46; //触发
205 1 ISP_TRIG=0xb9; //触发启动。
206 1 _nop_();
207 1 // for(i=0;i<3;i++);
208 1 ISP_ADDRL=0xff;
209 1 ISP_ADDRH=0xff;
210 1 ISP_CONTR=0x00;
211 1 ISP_CMD=0x00;
212 1 ISP_TRIG=0x00;
213 1 }
214
215 /**************************************************************************
216 * 函数原型: void eeprom_read(uint addres)
217 * 功 能: 单字节读数据
218 **************************************************************************/
219 uchar eeprom_read(uint addres){
220 1 // uchar i;
221 1 uchar caData;
222 1 ISP_ADDRL=addres; //低位地址
223 1 ISP_ADDRH=addres>>8; //高位地址
224 1 ISP_CONTR=0x01;
225 1 ISP_CONTR|=0x80; //设时间与充ISP操作。
226 1 ISP_CMD=0x01; //写命令
227 1 ISP_TRIG=0x46; //触发
228 1 ISP_TRIG=0xb9; //触发启动。
229 1 _nop_();
230 1 // for(i=0;i<3;i++);
231 1 ISP_ADDRL=0xff;
232 1 ISP_ADDRH=0xff;
233 1 ISP_CONTR=0x00;
234 1 ISP_CMD=0x00;
235 1 ISP_TRIG=0x00;
236 1 caData=ISP_DATA;
237 1 return(caData);
238 1 }
239
240 /**************************************************************************
241 * 函数原型: uchar ArrayWrite(uint begin_addr, uint len, uchar *array)
C51 COMPILER V7.10 LED 10/22/2007 09:39:59 PAGE 5
242 * 功 能: 数组写入并校验
243 **************************************************************************/
244 /*
245 uchar ArrayWrite(uint begin_addr, uint len, uchar *array){
246 uint i;
247 uint in_addr;
248
249 if(len > PerSector){//判是否是有效范围,此函数不允许跨扇区操作
250 return Error;
251 }
252 in_addr = begin_addr & 0x01ff; //扇区内偏移量
253 if((in_addr + len) > PerSector){
254 return Error;
255 }
256
257 in_addr = begin_addr;
258 //逐个写入并校对
259 ISP_CONTR=0x01;
260 ISP_CONTR|=0x80; //设时间与充ISP操作。
261
262 for(i = 0; i< len; i++){
263 // 写一个字节
264 ISP_ADDRH = (uchar)(in_addr >> 8);
265 ISP_ADDRL = (uchar)(in_addr & 0x00ff);
266 ISP_DATA = array[i]; // 取数据
267 ISP_CMD = ISP_CMD & 0xf8; // 清低3位
268 ISP_CMD = ISP_CMD | PrgCommand; // 写命令2
269
270 ISP_TRIG = 0x46; // 触发ISP_IAP命令字节1
271 ISP_TRIG = 0xb9; // 触发ISP_IAP命令字节2
272 _nop_();
273
274 // 读回来
275 ISP_DATA = 0x00;
276
277 ISP_CMD = ISP_CMD & 0xf8; // 清低3位
278 ISP_CMD = ISP_CMD | RdCommand; // 读命令1
279
280 ISP_TRIG = 0x46; // 触发ISP_IAP命令字节1
281 ISP_TRIG = 0xb9; // 触发ISP_IAP命令字节2
282 _nop_();
283
284 // 比较对错
285 if(ISP_DATA != array[i]){
286 ISP_CONTR=0x00;
287 ISP_CMD=0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -