📄 ir_decode.lst
字号:
C51 COMPILER V8.02 IR_DECODE 05/26/2006 22:12:13 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE IR_DECODE
OBJECT MODULE PLACED IN ir_decode.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ir_decode.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************/
2 /* */
3 /* ME300B单片机开发系统演示程序 - 红外遥控器键值显示 */
4 /* */
5 /* LCD1602显示 */
6 /* */
7 /* 邮箱: gguoqing@willar.com */
8 /* 网站: http://www.willar.com */
9 /* 作者: gguoqing */
10 /* 时间: 2006/05/25 */
11 /* */
-
12 /*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved */
13 /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! */
14 /* */
15 /*******************************************************************/
16
17 #include <reg51.h>
18 #include <intrins.h>
19
20 #define uchar unsigned char
21 #define uint unsigned int
22 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
23
24 void delay(uchar x); //x*0.14MS
25 void delay1(int ms);
26 void beep();
27
28 sbit IRIN = P3^2; //红外接收器数据线
29 sbit BEEP = P3^7; //蜂鸣器驱动线
30 sbit RELAY= P1^3; //继电器驱动线
31
32 uchar IRCOM[7];
33
34 sbit LCD_RS = P2^0;
35 sbit LCD_RW = P2^1;
36 sbit LCD_EN = P2^2;
37
38 uchar code cdis1[ ] = {" REMOTE CONTROL "};
39 uchar code cdis2[ ] = {" IR-CODE: --H "};
40
41 /*******************************************************************/
42 /* */
43 /*检查LCD忙状态 */
44 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
45 /* */
46 /*******************************************************************/
47
48 bit lcd_busy()
49 {
50 1 bit result;
51 1 LCD_RS = 0;
52 1 LCD_RW = 1;
53 1 LCD_EN = 1;
54 1 delayNOP();
C51 COMPILER V8.02 IR_DECODE 05/26/2006 22:12:13 PAGE 2
55 1 result = (bit)(P0&0x80);
56 1 LCD_EN = 0;
57 1 return(result);
58 1 }
59
60 /*******************************************************************/
61 /* */
62 /*写指令数据到LCD */
63 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
64 /* */
65 /*******************************************************************/
66
67 void lcd_wcmd(uchar cmd)
68
69 {
70 1 while(lcd_busy());
71 1 LCD_RS = 0;
72 1 LCD_RW = 0;
73 1 LCD_EN = 0;
74 1 _nop_();
75 1 _nop_();
76 1 P0 = cmd;
77 1 delayNOP();
78 1 LCD_EN = 1;
79 1 delayNOP();
80 1 LCD_EN = 0;
81 1 }
82
83 /*******************************************************************/
84 /* */
85 /*写显示数据到LCD */
86 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
87 /* */
88 /*******************************************************************/
89
90 void lcd_wdat(uchar dat)
91 {
92 1 while(lcd_busy());
93 1 LCD_RS = 1;
94 1 LCD_RW = 0;
95 1 LCD_EN = 0;
96 1 P0 = dat;
97 1 delayNOP();
98 1 LCD_EN = 1;
99 1 delayNOP();
100 1 LCD_EN = 0;
101 1 }
102
103 /*******************************************************************/
104 /* */
105 /* LCD初始化设定 */
106 /* */
107 /*******************************************************************/
108
109 void lcd_init()
110 {
111 1 delay1(15);
112 1 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
113 1 delay1(5);
114 1 lcd_wcmd(0x38);
115 1 delay1(5);
116 1 lcd_wcmd(0x38);
C51 COMPILER V8.02 IR_DECODE 05/26/2006 22:12:13 PAGE 3
117 1 delay1(5);
118 1
119 1 lcd_wcmd(0x0c); //显示开,关光标
120 1 delay1(5);
121 1 lcd_wcmd(0x06); //移动光标
122 1 delay1(5);
123 1 lcd_wcmd(0x01); //清除LCD的显示内容
124 1 delay1(5);
125 1 }
126
127 /*******************************************************************/
128 /* */
129 /* 设定显示位置 */
130 /* */
131 /*******************************************************************/
132
133 void lcd_pos(uchar pos)
134 {
135 1 lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
136 1 }
137
138 /*******************************************************************/
139 main()
140 {
141 1 uchar m;
142 1
143 1 IE = 0x81; //允许总中断中断,使能 INT0 外部中断
144 1 TCON = 0x01; //触发方式为脉冲负边沿触发
145 1
146 1 IRIN=1; //I/O口初始化
147 1 BEEP=1;
148 1 RELAY=1;
149 1
150 1 delay1(10); //延时
151 1 lcd_init(); //初始化LCD
152 1
153 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
154 1 m = 0;
155 1 while(cdis1[m] != '\0')
156 1 { //显示字符
157 2 lcd_wdat(cdis1[m]);
158 2 m++;
159 2 }
160 1
161 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
162 1 m = 0;
163 1 while(cdis2[m] != '\0')
164 1 {
165 2 lcd_wdat(cdis2[m]); //显示字符
166 2 m++;
167 2 }
168 1
169 1 while(1) ;
170 1
171 1 } //end main
172 /**********************************************************/
173 void IR_IN() interrupt 0 using 0
174 {
175 1 unsigned char j,k,N=0;
176 1 EX0 = 0;
177 1 delay(15);
178 1 if (IRIN==1)
C51 COMPILER V8.02 IR_DECODE 05/26/2006 22:12:13 PAGE 4
179 1 { EX0 =1;
180 2 return;
181 2 }
182 1 //确认IR信号出现
183 1 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
184 1 {delay(1);}
185 1
186 1 for (j=0;j<4;j++) //收集四组数据
187 1 {
188 2 for (k=0;k<8;k++) //每组数据有8位
189 2 {
190 3 while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
191 3 {delay(1);}
192 3 while (!IRIN) //等 IR 变为高电平
193 3 {delay(1);}
194 3 while (IRIN) //计算IR高电平时长
195 3 {
196 4 delay(1);
197 4 N++;
198 4 if (N>=30)
199 4 { EX0=1;
200 5 return;} //0.14ms计数过长自动离开。
201 4 } //高电平计数完毕
202 3 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
203 3 if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
204 3 N=0;
205 3 }//end for k
206 2 }//end for j
207 1
208 1 if (IRCOM[2]!=~IRCOM[3])
209 1 { EX0=1;
210 2 return; }
211 1
212 1 IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
213 1 IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
214 1
215 1 if(IRCOM[5]>9)
216 1 { IRCOM[5]=IRCOM[5]+0x37;}
217 1 else
218 1 IRCOM[5]=IRCOM[5]+0x30;
219 1
220 1 if(IRCOM[6]>9)
221 1 { IRCOM[6]=IRCOM[6]+0x37;}
222 1 else
223 1 IRCOM[6]=IRCOM[6]+0x30;
224 1
225 1 lcd_pos(0x4b);
226 1 lcd_wdat(IRCOM[6]); //第一位数显示
227 1 lcd_pos(0x4c);
228 1 lcd_wdat(IRCOM[5]); //第二位数显示
229 1
230 1 beep();
231 1 EX0 = 1;
232 1 }
233
234 /**********************************************************/
235 void beep()
236 {
237 1 unsigned char i;
238 1 for (i=0;i<100;i++)
239 1 {
240 2 delay(4);
C51 COMPILER V8.02 IR_DECODE 05/26/2006 22:12:13 PAGE 5
241 2 BEEP=!BEEP; //BEEP取反
242 2 }
243 1 BEEP=1; //关闭蜂鸣器
244 1 }
245 /**********************************************************/
246 void delay(unsigned char x) //x*0.14MS
247 {
248 1 unsigned char i;
249 1 while(x--)
250 1 {
251 2 for (i = 0; i<13; i++) {}
252 2 }
253 1 }
254
255 /**********************************************************/
256 void delay1(int ms)
257 {
258 1 unsigned char y;
259 1 while(ms--)
260 1 {
261 2 for(y = 0; y<250; y++)
262 2 {
263 3 _nop_();
264 3 _nop_();
265 3 _nop_();
266 3 _nop_();
267 3 }
268 2 }
269 1 }
270
271 /*
272 ;================================
273 ;DT9122D 遥控器(伟纳电子)
274
275 ;****** 红外遥控器键值表 ******
276
277 ; 10 03 01 06
278 ; 09 1D 1F 0D
279 ; 19 1B 11 15
280 ; 17 12 16 4C
281 ; 40 48 04 00
282 ; 02 05 54 4D
283 ; 0A 1E 0E 1A
284 ; 1C 14 0F 0C
285 ;================================
286 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 513 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 4
IDATA SIZE = ---- ----
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 + -