📄 2.lst
字号:
C51 COMPILER V7.50 2 08/19/2008 13:15:50 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 2
OBJECT MODULE PLACED IN 2.OBJ
COMPILER INVOKED BY: d:\Keil7.5\C51\BIN\C51.EXE 2.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 //若遥控接收不到,修改脉宽值即可
3 //遥控器使用红外线遥控编码芯片为LC7461 12MHZ晶振
4 //-----------------------------------------------
5 #include <regx52.h>
6 #include<intrins.h>
7
8 sbit RS = P2^0;
9 sbit RW = P2^1;
10 sbit Elcm =P2^2;
11 #define DATAPORT P0 // 数据端口
12 #define busy 0x80 //用于检查写忙信号
13
14 sbit p32=P3^2;
15 sbit p37=P3^7;
16 unsigned char flag; //引导码标志位
17 unsigned char REM_l;
18 unsigned char REM_h;
19 unsigned char a,b;
20
21
22 void delay400ms(void);
23 void delay5ms(void);
24 void lcdreset( void ); //LCD RESET
25 void WaitForEnable( void ); //忙信号检测
26 void lcdwrite_c( unsigned char CMD,unsigned char AttribC );//
27 void DispOneChar(unsigned char x,unsigned char y,unsigned char Wdata);//显示一个字符
28 void LocateXY( unsigned char posx,unsigned char posy);
29 void LcdWrite_D( unsigned char dataW ) ; //写一个数据
30 void disp(unsigned char x,unsigned char y,char *ptr);
31
32 /**************精确延时程序***************/
33 void delay_880us(void) //延时880us
34 {
35 1 unsigned int i;
36 1 for(i=0;i<109;i++);
37 1 }
38
39 void delay_4720us(void) //延时4.7ms
40 {
41 1 unsigned int k;
42 1 for(k=0;k<892;k++);
43 1 }
44
45 void delay_1ms(void) //延时1ms
46 {
47 1 unsigned int m;
48 1 for(m=0;m<124;m++);
49 1 }
50
51
52 // 短延时
53 void delay5ms(void)
54 {
55 1 unsigned int i = 5552;
C51 COMPILER V7.50 2 08/19/2008 13:15:50 PAGE 2
56 1 while(i--);
57 1 }
58 //长延时
59 void delay400ms(void)
60 {
61 1 unsigned char i = 5;
62 1 unsigned int j;
63 1 while(i--)
64 1 {
65 2 j=7269;
66 2 while(j--);
67 2 };
68 1 }
69
70
71 /*=======================================================
72 显示字符串
73 =======================================================*/
74 void disp(unsigned char x,unsigned char y,char *ptr) {
75 1 unsigned char i,l=0;
76 1 while (ptr[l] >31){l++;};
77 1 for (i=0;i<l;i++) {
78 2 DispOneChar(x++,y,ptr[i]);
79 2 if ( x == 16 ){
80 3 x = 0; y ^= 1;
81 3 }
82 2 }
83 1 }
84 /*=======================================================
85 按指定位置显示数出一个字符
86 =======================================================*/
87 void DispOneChar(unsigned char x,unsigned char y,unsigned char Wdata) {
88 1 LocateXY( x, y ); // 定位显示地址
89 1 LcdWrite_D( Wdata ); // 写字符
90 1 }
91 /*=======================================================
92 显示光标定位
93 =======================================================*/
94 void LocateXY( unsigned char posx,unsigned char posy) {
95 1 unsigned char temp;
96 1 temp = posx & 0xf;
97 1 posy &= 0x1;
98 1 if ( posy )temp |= 0x40;
99 1 temp |= 0x80;
100 1 lcdwrite_c(temp,0);
101 1 }
102 //初始化
103 void lcdreset(void){
104 1 lcdwrite_c(0x38, 0); //显示模式设置(不测试忙信号)共三次
105 1 delay5ms();
106 1 lcdwrite_c(0x38, 0);
107 1 delay5ms();
108 1 lcdwrite_c(0x38, 0);
109 1 delay5ms();
110 1 lcdwrite_c( 0x38, 1);
111 1 lcdwrite_c( 0x08, 1);
112 1 lcdwrite_c( 0x01, 1);
113 1 lcdwrite_c( 0x06, 1);
114 1 lcdwrite_c( 0x0c, 1);
115 1 }
116
117 /*=======================================================
C51 COMPILER V7.50 2 08/19/2008 13:15:50 PAGE 3
118 写控制字符子程序: E=1 RS=0 RW=0
119 =======================================================*/
120 void lcdwrite_c( unsigned char CMD,unsigned char AttribC ) {
121 1 if (AttribC) WaitForEnable(); // 检测忙信号?
122 1 RS = 0; RW = 0; _nop_();
123 1 DATAPORT =CMD; _nop_(); // 送控制字子程序
124 1 Elcm = 1;_nop_();_nop_();Elcm = 0; // 操作允许脉冲信号
125 1 }
126 /*=======================================================*/
127 /*=======================================================
128 当前位置写字符子程序: E =1 RS=1 RW=0
129 =======================================================*/
130 void LcdWrite_D( unsigned char dataW ) {
131 1 WaitForEnable(); // 检测忙信号
132 1 RS = 1; RW = 0; _nop_();
133 1 DATAPORT = dataW; _nop_();
134 1 Elcm = 1; _nop_(); _nop_(); Elcm = 0; // 操作允许脉冲信号
135 1 }
136 /*=======================================================
137 正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
138 DB7: 0 LCD控制器空闲; 1 LCD控制器忙
139 ========================================================*/
140 void WaitForEnable( void ) {
141 1 DATAPORT = 0xff;
142 1 RS =0; RW = 1; _nop_(); Elcm = 1; _nop_(); _nop_();
143 1 while( DATAPORT & busy );
144 1 Elcm = 0;
145 1 }
146
147
148 /*************中断服务程序***********/
149 void intt0(void) interrupt 0 using 0
150 {
151 1 unsigned char i,k,n,temp;
152 1 EA=0;
153 1 /****以下跳过系统引导码****/
154 1 for(i=0;i<10;i++)
155 1 {
156 2 delay_880us();//延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
157 2 if(p32==1)
158 2 {
159 3 flag=1;
160 3 break;
161 3 }// 重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
162 2 else
163 2 flag=0;
164 2 }
165 1
166 1 if(flag==0)
167 1 { //
168 2 while(p32==0);//等待高电平避开9毫秒低电平引导脉冲
169 2 delay_4720us();//延时4.74毫秒避开4.5毫秒的结果码
170 2
171 2 /****忽略26位识别码****/
172 2 for(i=0;i<26;i++)
173 2 {
174 3 while(p32==0);
175 3 delay_880us();//高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
176 3 if(p32==0)
177 3 continue;
178 3 else
179 3 delay_1ms();
C51 COMPILER V7.50 2 08/19/2008 13:15:50 PAGE 4
180 3 }
181 2 /*处理用户操作码及反码*/
182 2 for(n=0;n<2;n++)
183 2 {
184 3 k=0X01;
185 3 for(i=0;i<8;i++)
186 3 {
187 4 while(p32==0);//等待高电平
188 4 delay_880us();
189 4 if(p32==0) //检测该位为0或1 并存储到temp
190 4 temp=temp&(~k);
191 4 else
192 4 {
193 5 delay_1ms();
194 5 temp=temp|k;
195 5 }
196 4 k=k<<1;
197 4 }
198 3 if(n==0) REM_h=temp; //n==0时temp为操作码存到REM_h,n==1时为操作反码存到REM_l
199 3 else REM_l=temp;
200 3 }
201 2 if((~REM_h)==REM_l)
202 2 {
203 3 // P1=REM_h;
204 3 p37=~p37;
205 3 if(REM_h/16<10) a=REM_h/16+'0';
206 3 else a=REM_h/16+'A'-10;
207 3 if(REM_h%16<10) b =REM_h%16+'0';
208 3 else b=REM_h%16+'A'-10;
209 3 DispOneChar(9,1,a);
210 3 DispOneChar(10,1,b);
211 3 DispOneChar(11,1,'H');
212 3 }
213 2 }
214 1 EA=1;
215 1 }
216
217 void main()
218 {
219 1 lcdreset(); //初始化
220 1 delay400ms();
221 1 EA=1;
222 1 IT0=1;
223 1 EX0=1;
224 1 disp(0,2," IR Decoder ");//第一行
225 1 disp(0,1,"KEYCODE:"); //第二行
226 1 while(1);
227 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 573 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 11
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -