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