1602jm.lst
来自「本程序主要是遥控器解码和1602驱动程序」· LST 代码 · 共 358 行
LST
358 行
C51 COMPILER V8.02 1602JM 10/12/2007 11:12:46 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 1602JM
OBJECT MODULE PLACED IN 1602jm.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602jm.c BROWSE DEBUG OBJECTEXTEND
line level source
1 // 本程序主要是遥控器解码和1602驱动程序
2 //-------------------------------------------------------
3 // LCD1602 IR-DECODE
4 // writed by nxp---2006.12.29
5 //-------------------------------------------------------
6 // 连线表: CPU=89S52
7 // SysClock=12MHz
8 // LCD: 1602
9 // 功能:解码红外遥控器
10 // 遥控器芯片:tc9012-011
11
12
13 #include <at89x52.h>
14
15 #define uchar unsigned char
16 #define uint unsigned int
17
18 /*----------------------------控制I/O口设置,根据实际而定---------------*/
19 #define RS P3_0 //RS数据命令选择端,高电平数据,低电平命令
20 #define RW P3_1 //RW读写选择端,高电平读操作,低电平写操作
21 #define E P2_2 //E使能控制端,E高电平跳变为低电平时LCD执行命令
22
23 #define DATA P0 //数据端口定义
24 #define D0 P0_0
25 #define D1 P0_1
26 #define D2 P0_2
27 #define D3 P0_3
28 #define D4 P0_4
29 #define D5 P0_5
30 #define D6 P0_6
31 #define D7 P0_7
32 #define KEY1 P1_0
33 #define KEY2 P1_1
34 #define IR_RE P3_2
35 /*------------------------------------------------------------------------------*/
36 bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效
37 uchar n=0; //用来控制外部中断
38 uchar code str0[16]=" REMOTE CONTROL"; //开机画面显示
39 uchar code str1[16]=" IR-CODE: ";
40 uchar code str2[16]="ERROR";
41
42 uchar *p0=str0;
43 uchar *p1=str1;
44 uchar *p2=str2;
45 delay1ms(uint k);
46
47 void disp(void); //红外键值显示程序
48 uchar data date[4]; //date数组为存放地址原码,反码,数据原码,反码
49
50 /*------------------------LCD忙判断子程序--------------------------------------*/
51
52 void busy()
53 {
54 1 RS=0;RW=1;
55 1 E=0;E=1;DATA=0xff;
C51 COMPILER V8.02 1602JM 10/12/2007 11:12:46 PAGE 2
56 1 while(D7);
57 1 }
58
59 /*----------------------- 写命令子程序-----------------------------------------*/
60
61 void wcom(uchar com)
62 {
63 1 busy();
64 1 RS=0;RW=0;
65 1 E=1;
66 1 DATA=com;
67 1 E=0;
68 1 }
69
70 /*-------------------------写数据子程序--------------------------------------*/
71
72 void wdata(uchar dat)
73 {
74 1 busy();
75 1 RS=1;RW=0;
76 1 E=1;
77 1 DATA=dat;
78 1 E=0;
79 1 }
80
81 /*--------------------------读命令子程序-----------------------------------*/
82
83 uchar rcom(void)
84 {
85 1 uchar com;
86 1 busy();
87 1 RS=0;RW=1;
88 1 DATA=0xff;
89 1 E=1;
90 1 com=DATA;
91 1 E=0;
92 1 return(com);
93 1
94 1 }
95
96 /*----------------------------读数据子程序-----------------------------*/
97
98 uchar rdat(void)
99 {
100 1 uchar dat;
101 1 busy();
102 1 RS=1;RW=1;
103 1 DATA=0xff;
104 1 E=1;
105 1 dat=DATA;
106 1 E=0;
107 1 return(dat);
108 1 }
109
110 /*--------------------------延时1ms程子程序-----------------------*/
111 delay1000()
112 {
113 1 uint i,j;
114 1 for(i=0;i<1;i++)
115 1 for(j=0;j<124;j++)
116 1 ;
117 1 }
C51 COMPILER V8.02 1602JM 10/12/2007 11:12:46 PAGE 3
118
119 /*---------------------------延时882us子程序-----------------------*/
120
121 delay882()
122 {
123 1 uint i,j;
124 1 for(i=0;i<1;i++)
125 1 for(j=0;j<109;j++)
126 1 ;
127 1 }
128
129 /*--------------------------延时2400ms程子程序-----------------------*/
130
131 delay2400()
132 {
133 1 uint i,j;
134 1 for(i=0;i<3;i++)
135 1 for(j=0;j<99;j++)
136 1 ;
137 1 }
138
139
140 /*--------------------------以下为初始化程序,由上面子程序组成,根据个人爱好-----------*/
141
142
143 /******************************清屏程序***********************************/
144 void clear()
145 { wcom (0x01);}
146
147 /******************************归位程序********************************/
148 void rehome()
149 { wcom(0x02); }
150 /*******************8*****888**88888显示模式设定8888888888888888888888*/
151
152 void mode(bit x)
153 {
154 1 if(x==1)wcom(0x38); //两行5*8 mode
155 1 else wcom(0x34); //一行5*10 mode
156 1 }
157 /*------------------------显示开关控制命令----------------------------*/
158
159 void on_off(bit x)
160 {
161 1 if(x==1)wcom(0x0f); //显示开,光标开,光标闪烁
162 1 else wcom(0x0c); //显示开,光标关
163 1 }
164
165
166 /*------------------------init初始化组合-------------------------*/
167
168 void init()
169 {
170 1 clear(); //清屏
171 1 mode(1); //模式设置
172 1 on_off(1); //显示设置
173 1 wcom(0x06); //移动方式
174 1 }
175
176 /*---------------------------对字符串的处理------------------------*/
177
178 void strchar(uchar *p)
179 {
C51 COMPILER V8.02 1602JM 10/12/2007 11:12:46 PAGE 4
180 1 while(*p!='\0')
181 1 {
182 2 wdata(*p);
183 2 p++;
184 2 }
185 1 }
186
187 /*----------------------------------------------------------*/
188 /*-----------------------红外解码程序(核心)-----------------*/
189 /*----------------------------------------------------------*/
190
191 void IR_decode()
192 {
193 1 uchar i,j;
194 1 while(IR_RE==0);
195 1 delay2400();
196 1 if(IR_RE==1) //延时2.4ms后如果是高电平则是新码
197 1 {
198 2 delay2400(); //延时4.8ms避开4.5ms的高电平
199 2 for(i=0;i<4;i++)
200 2 {
201 3 for(j=0;j<8;j++)
202 3 {
203 4 while(IR_RE==0); //等待地址码第1位高电平到来
204 4 delay882(); //延时882ms判断此时引脚电平
205 4 ///CY=IR_RE;
206 4 if(IR_RE==0)
207 4 {
208 5 date[i]>>=1;
209 5 date[i]=date[i]&0x7f;
210 5 }
211 4 else if(IR_RE==1)
212 4 {
213 5 delay1000();
214 5 date[i]>>=1;
215 5 date[i]=date[i]|0x80;
216 5 }
217 4 } //1位数据接收结束
218 3 } //32位二进制码接收结束
219 2 }
220 1 }
221
222
223
224 /*------------------二进制码转换为压缩型BCD码,并显示---------------*/
225
226 void two_2_bcd(uchar date)
227 {
228 1
229 1 uchar temp;
230 1 temp=date;
231 1 date&=0xf0;
232 1 date>>=4; //右移四位得到高四位码
233 1 date&=0x0f; //与0x0f想与确保高四位为0
234 1 if(date<=0x09)
235 1 {
236 2 // wcom(0xcb);
237 2 wdata(0x30+date); //lcd显示键值高四位
238 2 }
239 1 else
240 1 {
241 2 date=date-0x09;
C51 COMPILER V8.02 1602JM 10/12/2007 11:12:46 PAGE 5
242 2 //wcom(0xcb);
243 2 wdata(0x40+date);
244 2 }
245 1 date=temp;
246 1 date&=0x0f;
247 1 if(date<=0x09)
248 1 {
249 2 wdata(0x30+date); //lcd显示低四位值
250 2 }
251 1 else
252 1 {
253 2 date=date-0x09;
254 2 wdata(0x40+date);
255 2 }
256 1 wdata(0x48); //显示字符'H'
257 1 }
258
259
260 //////////////////////////////转换程序结束///////////////////////////
261
262
263 /*----------------------解码成功后,1602显示键值子程序---------------*/
264
265 void disp()
266 {
267 1 uchar date1;
268 1 date1=date[3]^0xff; //如果得到的数据原码和数据反码相反
269 1 if(date[2]==date1) //显示键值
270 1 {
271 2 wcom(0xc0);
272 2 two_2_bcd(date[0]);
273 2 wdata(0x20);
274 2 two_2_bcd(date[1]);
275 2 wdata(0x20);
276 2 two_2_bcd(date[2]);
277 2 wdata(0x20);
278 2 two_2_bcd(date[3]);
279 2 }
280 1 }
281
282
283 /*------------------------外部中断0程序-------------------------*/
284 /*------------------主要用于处理红外遥控键值--------------------*/
285
286 void int0() interrupt 0
287 {
288 1 uint i;
289 1 for(i=0;i<4;i++)
290 1 {
291 2 delay1000();
292 2 if(IR_RE==1){k=~k;} //刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序
293 2 }
294 1
295 1 if(k==0)
296 1 {
297 2 EX0=0; //检测到有效信号关中断,防止干扰
298 2 IR_decode(); //如果接收到的是有效信号,则调用解码程序
299 2 disp(); //解码成功,调用显示程序,显示该键值
300 2 }
301 1 EX0=1; //开外部中断,允许新的遥控按键
302 1 }
303
C51 COMPILER V8.02 1602JM 10/12/2007 11:12:46 PAGE 6
304
305
306 /*---------------------------------------------------------------*/
307 /* 以下为主程序,主要对LCD初始化,开始界面设置 */
308 /*---------------------------------------------------------------*/
309 void main(void)
310 {
311 1 SP=0x60; //堆栈指针
312 1 TMOD=0x11; //定时器模式设置所选为 模式1
313 1 TH0=0xd8; //定时器初值理论为 10ms;
314 1 TL0=0xf7; //实际取d8f7
315 1 ET0=1; //允许定时器0中断
316 1 EX0=1; //允许外部中断0,用于检测红外遥控器按键
317 1 EA=1; //总中断开
318 1 init(); //初始化LCD
319 1 wcom(0x80); //写入字符的地址为第1行第1列
320 1 strchar(p0); //调用显示字符串函数
321 1 wcom(0xc0);
322 1 //strchar(p1);
323 1 while(1);
324 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 557 ----
CONSTANT SIZE = 48 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 2
IDATA SIZE = ---- ----
BIT SIZE = 1 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?