IRLCD.LST
资源名称:infrared.zip [点击查看]
上传用户:taysgs
上传日期:2021-07-28
资源大小:53k
文件大小:12k
源码类别:
单片机开发
开发平台:
HTML/CSS
- C51 COMPILER V7.02b IRLCD 12/27/2009 13:36:54 PAGE 1
- C51 COMPILER V7.02b, COMPILATION OF MODULE IRLCD
- OBJECT MODULE PLACED IN IRLCD.OBJ
- COMPILER INVOKED BY: D:ProgromKeilC51BINC51.EXE IRLCD.C BROWSE DEBUG OBJECTEXTEND
- stmt level source
- 1
- 2 /********************************************************************************
- 3 * 描述: *
- 4 * lcd1602显示 遥控键值读取器 *
- 5 * lcd1602显示 遥控器接p3.2 *
- 6 * 喇叭接p1.5 继电器接p1.4 *
- 7 * 17(40h)键按下,继电器吸合。19(04h)键按下,继电器关闭。 *
- 8 * 连接方法:使用红外功能时 J1跳线短接
- - *
- 9 ********************************************************************************/
- 10
- 11 #include <reg51.h>
- 12 #include <intrins.h>
- 13
- 14 #define uchar unsigned char
- 15 #define uint unsigned int
- 16
- 17 uchar LCD_ID_1[16] = {"Red Control"};
- 18 uchar LCD_ID_2[16] = {"IR CODE:--H"};
- 19
- 20 void delay(uchar x); //x*0.14MS
- 21 void delay1(int ms);
- 22 void beep();
- 23
- 24 sbit IRIN = P3^3; //红外接收器数据线
- 25 sbit BEEP = P1^5; //蜂鸣器驱动线
- 26 sbit RELAY= P1^4; //继电器驱动线
- 27
- 28 uchar IRCOM[7];
- 29
- 30 sbit E=P2^7; //1602使能引脚
- 31 sbit RW=P2^6; //1602读写引脚
- 32 sbit RS=P2^5; //1602数据/命令选择引脚
- 33
- 34
- 35 /********************************************************************
- 36 * 名称 : delay()
- 37 * 功能 : 延时,延时时间大概为140US。
- 38 * 输入 : 无
- 39 * 输出 : 无
- 40 ***********************************************************************/
- 41
- 42 void Delay2()
- 43 {
- 44 1 int i,j;
- 45 1 for(i=0; i<=10; i++)
- 46 1 for(j=0; j<=2; j++)
- 47 1 ;
- 48 1 }
- 49
- 50 /********************************************************************
- 51 * 名称 : Convert(uchar In_Date)
- 52 * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
- 53 * 输入 : 1602资料上的值
- 54 * 输出 : 送到1602的值
- C51 COMPILER V7.02b IRLCD 12/27/2009 13:36:54 PAGE 2
- 55 ***********************************************************************/
- 56 uchar Convert(uchar In_Date)
- 57 {
- 58 1 uchar i, Out_Date = 0, temp = 0;
- 59 1 for(i=0; i<8; i++)
- 60 1 {
- 61 2 temp = (In_Date >> i) & 0x01;
- 62 2 Out_Date |= (temp << (7 - i));
- 63 2 }
- 64 1 return Out_Date;
- 65 1 }
- 66
- 67 /********************************************************************
- 68 * 名称 : enable(uchar del)
- 69 * 功能 : 1602命令函数
- 70 * 输入 : 输入的命令值
- 71 * 输出 : 无
- 72 ***********************************************************************/
- 73
- 74 void enable(uchar del)
- 75 {
- 76 1 P0 = Convert(del);
- 77 1 RS = 0;
- 78 1 RW = 0;
- 79 1 E = 0;
- 80 1 Delay2();
- 81 1 E = 1;
- 82 1 Delay2();
- 83 1 }
- 84
- 85 /********************************************************************
- 86 * 名称 : write(uchar del)
- 87 * 功能 : 1602写数据函数
- 88 * 输入 : 需要写入1602的数据
- 89 * 输出 : 无
- 90 ***********************************************************************/
- 91
- 92 void write(uchar del)
- 93 {
- 94 1 P0 = Convert(del);
- 95 1 RS = 1;
- 96 1 RW = 0;
- 97 1 E = 0;
- 98 1 Delay2();
- 99 1 E = 1;
- 100 1 Delay2();
- 101 1 }
- 102
- 103 /********************************************************************
- 104 * 名称 : L1602_init()
- 105 * 功能 : 1602初始化,请参考1602的资料
- 106 * 输入 : 无
- 107 * 输出 : 无
- 108 ***********************************************************************/
- 109 void L1602_init(void)
- 110 {
- 111 1 enable(0x01);
- 112 1 enable(0x38);
- 113 1 enable(0x0c);
- 114 1 enable(0x06);
- 115 1 enable(0xd0);
- 116 1 }
- C51 COMPILER V7.02b IRLCD 12/27/2009 13:36:54 PAGE 3
- 117
- 118 /********************************************************************
- 119 * 名称 : L1602_char(uchar hang,uchar lie,char sign)
- 120 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
- 121 L1602_char(1,5,'b')
- 122 * 输入 : 行,列,需要输入1602的数据
- 123 * 输出 : 无
- 124 ***********************************************************************/
- 125 void L1602_char(uchar hang,uchar lie,char sign)
- 126 {
- 127 1 uchar a;
- 128 1 if(hang == 1) a = 0x80;
- 129 1 if(hang == 2) a = 0xc0;
- 130 1 a = a + lie - 1;
- 131 1 enable(a);
- 132 1 write(sign);
- 133 1 }
- 134
- 135 /********************************************************************
- 136 * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
- 137 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
- 138 L1602_string(1,5,"ab cd ef;")
- 139 * 输入 : 行,列,需要输入1602的数据
- 140 * 输出 : 无
- 141 ***********************************************************************/
- 142 void L1602_string(uchar hang,uchar lie,uchar *p)
- 143 {
- 144 1 uchar a;
- 145 1 if(hang == 1) a = 0x80;
- 146 1 if(hang == 2) a = 0xc0;
- 147 1 a = a + lie - 1;
- 148 1 enable(a);
- 149 1 while(1)
- 150 1 {
- 151 2 if(*p == ' ') break;
- 152 2 write(*p);
- 153 2 p++;
- 154 2 }
- 155 1 }
- 156
- 157 /*******************************************************************/
- 158 main()
- 159 {
- 160 1
- 161 1 IE = 0x84; //允许总中断中断,使能 INT1 外部中断
- 162 1 TCON = 0x10; //触发方式为脉冲负边沿触发
- 163 1
- 164 1 IRIN=1; //I/O口初始化
- 165 1 BEEP=1;
- 166 1 RELAY=1;
- 167 1
- 168 1 delay1(10); //延时
- 169 1 L1602_init(); //初始化LCD
- 170 1 L1602_string(1, 1, LCD_ID_1);
- 171 1 L1602_string(2, 1, LCD_ID_2);
- 172 1 while(1) ;
- 173 1
- 174 1 } //end main
- 175 /**********************************************************/
- 176 void IR_IN() interrupt 2 using 0
- 177 {
- 178 1 unsigned char j,k,N=0;
- C51 COMPILER V7.02b IRLCD 12/27/2009 13:36:54 PAGE 4
- 179 1 EX1 = 0;
- 180 1 delay(15);
- 181 1 if (IRIN==1)
- 182 1 { EX1 =1;
- 183 2 return;
- 184 2 }
- 185 1 //确认IR信号出现
- 186 1 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
- 187 1 {delay(1);}
- 188 1
- 189 1 for (j=0;j<4;j++) //收集四组数据
- 190 1 {
- 191 2 for (k=0;k<8;k++) //每组数据有8位
- 192 2 {
- 193 3 while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
- 194 3 {delay(1);}
- 195 3 while (!IRIN) //等 IR 变为高电平
- 196 3 {delay(1);}
- 197 3 while (IRIN) //计算IR高电平时长
- 198 3 {
- 199 4 delay(1);
- 200 4 N++;
- 201 4 if (N>=30)
- 202 4 { EX1=1;
- 203 5 return;} //0.14ms计数过长自动离开。
- 204 4 } //高电平计数完毕
- 205 3 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
- 206 3 if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
- 207 3 N=0;
- 208 3 }//end for k
- 209 2 }//end for j
- 210 1
- 211 1 if (IRCOM[2]!=~IRCOM[3])
- 212 1 { EX1=1;
- 213 2 return; }
- 214 1
- 215 1 IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
- 216 1 IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
- 217 1
- 218 1 if(IRCOM[5]>9)
- 219 1 { IRCOM[5]=IRCOM[5]+0x37;}
- 220 1 else
- 221 1 IRCOM[5]=IRCOM[5]+0x30;
- 222 1
- 223 1 if(IRCOM[6]>9)
- 224 1 { IRCOM[6]=IRCOM[6]+0x37;}
- 225 1 else
- 226 1 IRCOM[6]=IRCOM[6]+0x30;
- 227 1 //////////////////////////
- 228 1 L1602_char(2,10,IRCOM[5]);
- 229 1 L1602_char(2,9,IRCOM[6]);
- 230 1 //beep();
- 231 1 EX1 = 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 V7.02b IRLCD 12/27/2009 13:36:54 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
- MODULE INFORMATION: STATIC OVERLAYABLE
- CODE SIZE = 562 ----
- CONSTANT SIZE = ---- ----
- XDATA SIZE = ---- ----
- PDATA SIZE = ---- ----
- DATA SIZE = 39 8
- IDATA SIZE = ---- ----
- BIT SIZE = ---- ----
- END OF MODULE INFORMATION.
- C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
English
