📄 ir_decode.lst
字号:
C51 COMPILER V8.05a IR_DECODE 11/23/2006 10:19:32 PAGE 1
C51 COMPILER V8.05a, 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 /* ME500单片机开发系统演示程序 - 红外遥控器键值显示 */
4 /* */
5 /* LCD1602显示 */
6 /* */
7 /* 版本: V1.0 (2006/11/20) */
8 /* 作者: gguoqing (Email: gguoqing@willar.com) */
9 /* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界) */
10 /* 时间: 2006/05/26 */
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= P3^6; //继电器驱动线
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.05a IR_DECODE 11/23/2006 10:19:32 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.05a IR_DECODE 11/23/2006 10:19:32 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 for(m=0;m<16;m++)
155 1 lcd_wdat(cdis1[m]);
156 1
157 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
158 1 for(m=0;m<16;m++)
159 1 lcd_wdat(cdis2[m]);
160 1
161 1 while(1)
162 1 {
163 2 if(IRCOM[2]==0x1d) //UP键
164 2 RELAY=0;
165 2 if(IRCOM[2]==0x12) //DOWN键
166 2 RELAY=1;
167 2 }
168 1
169 1 } //end main
170 /**********************************************************/
171 void IR_IN() interrupt 0 //using 0
172 {
173 1 unsigned char j,k,N=0;
174 1 EX0 = 0;
175 1 delay(15);
176 1 if (IRIN==1)
177 1 { EX0 =1;
178 2 return;
C51 COMPILER V8.05a IR_DECODE 11/23/2006 10:19:32 PAGE 4
179 2 }
180 1 //确认IR信号出现
181 1 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
182 1 {delay(1);}
183 1
184 1 for (j=0;j<4;j++) //收集四组数据
185 1 {
186 2 for (k=0;k<8;k++) //每组数据有8位
187 2 {
188 3 while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
189 3 {delay(1);}
190 3 while (!IRIN) //等 IR 变为高电平
191 3 {delay(1);}
192 3 while (IRIN) //计算IR高电平时长
193 3 {
194 4 delay(1);
195 4 N++;
196 4 if (N>=30)
197 4 { EX0=1;
198 5 return;} //0.14ms计数过长自动离开。
199 4 } //高电平计数完毕
200 3 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
201 3 if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
202 3 N=0;
203 3 }//end for k
204 2 }//end for j
205 1
206 1 if (IRCOM[2]!=~IRCOM[3])
207 1 { EX0=1;
208 2 return; }
209 1
210 1 IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
211 1 IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
212 1
213 1 if(IRCOM[5]>9)
214 1 { IRCOM[5]=IRCOM[5]+0x37;}
215 1 else
216 1 IRCOM[5]=IRCOM[5]+0x30;
217 1
218 1 if(IRCOM[6]>9)
219 1 { IRCOM[6]=IRCOM[6]+0x37;}
220 1 else
221 1 IRCOM[6]=IRCOM[6]+0x30;
222 1
223 1 lcd_pos(0x4b);
224 1 lcd_wdat(IRCOM[6]); //第一位数显示
225 1 lcd_pos(0x4c);
226 1 lcd_wdat(IRCOM[5]); //第二位数显示
227 1
228 1 beep();
229 1 EX0 = 1;
230 1 }
231
232 /**********************************************************/
233 void beep()
234 {
235 1 unsigned char i;
236 1 for (i=0;i<180;i++)
237 1 {
238 2 delay(5);
239 2 BEEP=!BEEP; //BEEP取反
240 2 }
C51 COMPILER V8.05a IR_DECODE 11/23/2006 10:19:32 PAGE 5
241 1 BEEP=1; //关闭蜂鸣器
242 1 }
243 /**********************************************************/
244 void delay(unsigned char x) //x*0.14MS
245 {
246 1 unsigned char i;
247 1 while(x--)
248 1 {
249 2 for (i = 0; i<13; i++) {}
250 2 }
251 1 }
252
253 /**********************************************************/
254 void delay1(int ms)
255 {
256 1 unsigned char y;
257 1 while(ms--)
258 1 {
259 2 for(y = 0; y<250; y++)
260 2 {
261 3 _nop_();
262 3 _nop_();
263 3 _nop_();
264 3 _nop_();
265 3 }
266 2 }
267 1 }
268
269 /*
270 ;================================
271 ;DT9122D 遥控器(伟纳电子)
272
273 ;****** 红外遥控器键值表 ******
274
275 ; 10 03 01 06
276 ; 09 1D 1F 0D
277 ; 19 1B 11 15
278 ; 17 12 16 4C
279 ; 40 48 04 00
280 ; 02 05 54 4D
281 ; 0A 1E 0E 1A
282 ; 1C 14 0F 0C
283 ;================================
284 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 556 ----
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 + -