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