📄 yxktv.lst
字号:
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE YXKTV
OBJECT MODULE PLACED IN C:\WAVE\PEI\YXKTV\YXKTV.OBJ
COMPILER INVOKED BY: c:\keil\c51\BIN\C51.EXE C:\WAVE\PEI\YXKTV\YXKTV.C DB SB OE
stmt level source
1 /******************************************************************************
2 * 模块名:YxKtv.c
3 * 功 能:系统主程序部分
4 * 时 间:2004.8.2
5 *
6 ******************************************************************************/
7
8 /*学会使用预编译指令控制不同硬件版本
9 #if (条件) ,还有#ifdef #ifndef
10 C语言指令,不用{}包括
11 #else
12 #endif
13 */
14
15 //串口命令数据使用idata类型,编译使用rs(256),可使用80H后的数据区
16 //注意:函数预定义的变量说明要和实现体保持一致,否则参数传递错误
17 //void Prints(char,char,char data *,char);第3个参数char data *就必须有data
18
19 //为什么SendAck()中如果指定Using 1,内部变量Crc却使用RAM0的07
20 //如果串口中断Using 0,串口中断中并没有保护R0-R7的代码,引起错误,例如液晶显示乱
21
22 #include <reg52.h>
23 #include <intrins.h> /*nop等指令*/
24
25 /*AT89LS52专用的*/
26 sfr AUXR=0x8E ;/*WDT等控制*/
27 /*b0=1不输出ALE信号 b3=0 WDT复位是RST脚输出高电平 b4=1 IDLE模式下WDT停止 */
28 sfr WDTRST=0xA6 ;/*轮流写1E和E1可复位WDT(16384个机器周期内,约32ms?),第一次是启动*/
29
30 #define uint unsigned int
31 #define uchar unsigned char
32
33
34 #define NOP _nop_();_nop_();_nop_();_nop_();
35
36 sbit a0=ACC^0; /*定义ACC的位,利用ACC操作速度最快*/
37 sbit a1=ACC^1;
38 sbit a2=ACC^2;
39 sbit a3=ACC^3;
40 sbit a4=ACC^4;
41 sbit a5=ACC^5;
42 sbit a6=ACC^6;
43 sbit a7=ACC^7;
44
45 /*变量定义*/
46 sbit K0 =P1^0;
47 sbit K1 =P1^1;
48 sbit K2 =P1^2;
49 sbit K3 =P1^3;
50 sbit K4 =P1^4;
51 sbit K5 =P1^5;
52 sbit K6 =P1^6;
53 sbit K7 =P1^7;
54
55 sbit P07 =P0^7;
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 2
56
57 sbit LCDRS =P2^0;
58 sbit LCDRW =P2^1;
59 sbit LCDE =P2^2;
60 sbit LCDPSB =P2^3;
61 sbit LCDRST =P2^4;
62 sbit LCDLED =P2^5;
63 sbit SCL =P2^6;
64 sbit SDA =P2^7;
65
66 sbit TR =P3^4;
67 sbit LED =P3^7;
68
69 /*常数定义*/
70
71 #define C_T0H 0xB8 /*20ms=(65536-x)*12/11.0592 */
72 #define C_T0L 0x00
73
74 #define BANK_SERI 1
75
76 #define C_SERMAXN 16 /*串口缓冲区大小 最多显示64个字符*/
77
78 /*收发转换需要2ms*/
79 #ifdef WXKEY
#define C_HEADN 20 /*无线发送引导头长度 发送0x55的数目*/
#else
82 #define C_HEADN 0
83 #endif
84
85 #define C_TIMERN 25
86 #define C_LED 30
87 #define C_LOOPT 25
88
89 #define KDOT 10
90 #define KDEL 11
91 #define KOK 12
92 #define KESC 13
93 #define KFUNC1 14
94 #define KFUNC2 15
95
96 /*内部数据*/
97 uchar bdata ICData; /*串行读写数据使用,可位寻址*/
98 sbit ICDataB0=ICData^0;
99 sbit ICDataB1=ICData^1;
100 sbit ICDataB2=ICData^2;
101 sbit ICDataB3=ICData^3;
102 sbit ICDataB4=ICData^4;
103 sbit ICDataB5=ICData^5;
104 sbit ICDataB6=ICData^6;
105 sbit ICDataB7=ICData^7;
106
107 uchar bdata Config1,Config2,Config3;
108 sbit Config1_0=Config1^0;
109 sbit Config1_1=Config1^1;
110
111 uchar data SerData[C_SERMAXN] ;/*串口数据区*/
112 //uchar idata SerData[78];
113
114 uchar data SerN,SerHeadN,SerBufN;
115 bit bRcvOk,bSendOk;
116
117 bit bTimer,bKeyOk,bDot,bEnter,bKeyScan,bSetup,bFlash;
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 3
118 uchar data TimerN,PwrT,KonT;
119 uchar data AddL,AddH,SysMode;
120 uchar data KeyNo,InputN,IniPos,DataPos,InputMode;
121
122 unsigned int data TimerA,LedTimer,SleepTimer;
123 uchar data InitOkNum,InitOkNum1;
124 /*最后按键计时,延时关机计时,上电初始化标志*/
125
126 uchar data LcdBuf[6];/*液晶显示*/
127
128 uchar data IcBuf[10];/*EEPROM数据区*/
129 bit bAck; /*EEPROM中的应答标志*/
130
131 uchar data LcdX,LcdY;
132 bit bSendAck;//在发送应答
133 #define C_CHARN 68
134 uchar idata CharData[C_CHARN];
135 bit bLoopShow,bRcvChar,bLoop;//
136 uchar LoopT,LoopPos,CharN,Money,Crc,SleepN;
137
138 #define VERSION 10
139
140 void SystemIni();
141 void ReadCmd();
142 void TstSend();
143 void LcdInit();
144 void ShowNums();
145 void TimerFunc();
146 void KeyScan();
147 void FuncInput();
148 void FuncSetup();
149 void PushSendBuf(uchar);
150 void StartSendBuf();
151 void Stop24();
152 bit WrBytes24(unsigned int,unsigned char);
153 bit RdBytes24(unsigned int,unsigned char);
154 bit CheckMima();
155 void ShowIni();
156 void SendIni();
157 void Beep();
158 void DelayMs(uchar);
159 void RstTR();/*TR100E接收不正常后复位TR100E*/
160 void Tst24();
161 void InputClr();
162 void SaveKey(uchar);
163 void ReadKey(uchar);
164
165 void LcdWrCmd(uchar);
166 void LcdWrData(uchar);
167 void LcdClr(uchar);
168 void Prints(uchar,uchar,uchar data *,uchar);
169 void ShowLoop();
170 void WrBytes(uchar,uchar data *,uchar);
171 void ShowEprom();
172 void ShowMoney();
173
174 //液晶数据地址
175 uchar code DDRAMTAB[]={0x80,0x90,0x88,0x98,};
176
177 /*主程序开始*/
178 main()
179 {
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 4
180 1 AUXR=0x11;
181 1
182 1 SystemIni(); /*系统初始化*/
183 1
184 1 WDTRST=0x1E; /*start WDT*/
185 1 WDTRST=0xE1;
186 1
187 1 while(1)
188 1 {
189 2 WDTRST=0x1E; /*Reset WDT*/
190 2 WDTRST=0xE1;
191 2
192 2 if (bRcvOk) ReadCmd();
193 2 if (bTimer) TimerFunc();
194 2 if (bKeyScan) KeyScan();
195 2 if (bKeyOk) Beep();
196 2 if (bLoop) ShowLoop();
197 2
198 2 switch (SysMode)
199 2 { case 0:
200 3 FuncInput();
201 3 break;
202 3 case 1: //Setup
203 3 FuncSetup();
204 3 break;
205 3 default:
206 3 SysMode=0;
207 3 break;
208 3 }
209 2
210 2 //PCON=PCON|0x01;//IDLE模式,减少耗电
211 2 }
212 1 }
213
214 void InputNum()
215 { uchar data i;
216 1 switch (InputMode)
217 1 {
218 2 case 0:
219 2 break;
220 2 case 2:
221 2 LcdBuf[5]=KeyNo;
222 2 InputN=1;
223 2 break;
224 2 case 3:
225 2 Money=KeyNo;
226 2 //if (Money>99) Money=99;
227 2 ShowMoney();
228 2 break;
229 2 default:
230 2 //if (InputN>5) return;
231 2 if (bEnter) return;//修改为Enter后不可再输入
232 2 for (i=0;i<5;i++) LcdBuf[i]=LcdBuf[i+1];
233 2 LcdBuf[5]=KeyNo;
234 2 InputN++;
235 2 }
236 1 }
237 /*正常键盘输入*/
238 void FuncInput()
239 { register uchar i;
240 1 if (!bKeyOk) return;
241 1 bKeyOk=0;
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 5
242 1 //LED=~LED;
243 1
244 1 if (InputMode==0) return;
245 1 SleepTimer=PwrT*120;
246 1
247 1 TimerA=0;/*重新计时*/
248 1
249 1 switch (KeyNo)
250 1 {
251 2 case KDOT: //dot
252 2 if (InputMode!=1) return;
253 2 if (bDot) return;
254 2 bDot=1;
255 2 if (InputN==0)
256 2 { LcdBuf[5]=0;}
257 2 for (i=0;i<5;i++) LcdBuf[i]=LcdBuf[i+1];
258 2 LcdBuf[5]=0x0a;
259 2 InputN++;
260 2 break;
261 2 //case 11: //space
262 2 // break;
263 2 case KDEL:
264 2 if (InputMode==3)
265 2 { if (Money>0) Money--;
266 3 ShowMoney();
267 3 break;
268 3 }
269 2 if (bEnter==1) return;
270 2 if (LcdBuf[5]==0x0a) bDot=0;
271 2 for (i=0;i<5;i++) LcdBuf[5-i]=LcdBuf[4-i];
272 2 LcdBuf[0]=0x0f;
273 2 if (InputN>0) InputN--;
274 2 break;
275 2 case KOK: //OK
276 2 if (InputMode==3)
277 2 { if (Money<99 ) Money++;
278 3 ShowMoney();
279 3 break;
280 3 }
281 2 if (InputN>0)
282 2 { bEnter=1;
283 3 //InputN=6;
284 3 }
285 2 else return;
286 2 break;
287 2
288 2 case KESC: //ESC
289 2 if (InputMode==3)
290 2 { Money=0;
291 3 ShowMoney();
292 3 break;
293 3 }
294 2 InputClr();
295 2 break;
296 2 case KFUNC1: //FUNC
297 2 case KFUNC2:
298 2 break;
299 2 default: /*数字键*/
300 2 InputNum();
301 2 }
302 1
303 1 if (InputN==1)/*开机缺省显示消除*/
C51 COMPILER V7.00 YXKTV 05/08/2006 17:58:08 PAGE 6
304 1 { for (i=0;i<5;i++) LcdBuf[i]=0x0f;
305 2 }
306 1
307 1 ShowNums();
308 1 }
309
310
311 void WriteIni()
312 { IcBuf[0]=0xAA;IcBuf[1]=0x55;
313 1 IcBuf[2]=AddH;IcBuf[3]=AddL;
314 1 IcBuf[4]=PwrT;IcBuf[5]=Config1;
315 1 IcBuf[6]=Config2;IcBuf[7]=Config3;
316 1 WrBytes24( 0,8);
317 1
318 1 }
319
320 void ReadIni()
321 { uchar i;
322 1
323 1 Stop24();
324 1 for (i=0;i<6;i++)
325 1 {
326 2 RdBytes24(0,2);
327 2 if ((IcBuf[0]==0xAA) && (IcBuf[1]==0x55)) i=7;
328 2 DelayMs(10);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -