/**********************************************************************
LCD1602显示 rs P3^5 rw P3^6 ep P3^7 P0口 为数据输出口
1838的数据采集口为3.2口 为外部中断
***********************************************************************/
#include "stc8.h"
#define u8 unsigned char
#define u16 unsigned int
int i;
//void delay(uchar x); //x*0.14MS
sbit IRIN = P3^2; //红外接收器数据线
u8 IRCOM[7];
sbit rw=P3^6; //1602 IO口定义 这里用的数据口是P0口
sbit rs=P3^5;
sbit ep=P3^7;
unsigned char code d[] = {" IR-CODE: --H "};
unsigned char code cdis1[] = {" 51 hei "};
unsigned char code a[] ={ //汉字
0x04,0x1f,0x15,0x1f,0x15,0x1f,0x05,0x07, //电
0x0f,0x02,0x04,0x1f,0x04,0x04,0x14,0xc, //子
0x04,0x1f,0x15,0x1f,0x15,0x1f,0x05,0x07, //电
0x0f,0x02,0x04,0x1f,0x04,0x04,0x14,0xc }; //子
/**************************** 延时函数 ***********************************/
void delay(unsigned int a)
{
while(a--);
}
void delay1(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
/*************************************************************************************/
/*************************************************************************************/
/***************************** 1602 *******************************************/
u8 lcd_busy() //查忙 这部很重要 否则有的显示容易出现乱码
{
u8 result;
rs = 0;
rw = 1;
ep = 1;
delay(50);
result = P0&0x80;
ep = 0;
return result; //返回值
}
void lcd_com(unsigned char com)// 地址
{
while(lcd_busy());
rs=0;
ep=0;
rw=0;
P0=com;
delay(50);
ep=1;
delay(50);
ep=0;
}
void lcd_date(unsigned char date)//采集输出数据
{
while(lcd_busy());
rs=1; //1是些数据 0是写指令
rw=0; // 1是读 0是写
ep=0; //E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令
P0=date;
delay(5);
ep=1;
delay(5);
ep=0;
}
void lcd_pos(unsigned char pos)
{
lcd_com(pos|0x80); //数据指针=80+地址变量
}
void writetab() // 写 汉字函数
{
unsigned char m;
lcd_com(0x40); //写CGRAM 此处是指令
for (m = 0; m< 32; m++)
lcd_date(a[m]);
}
void init()//1602初始化
{
lcd_com(0x38);
delay(50);
lcd_com(0x38);
delay(50);
lcd_com(0x38);
delay(50);
lcd_com(0x0c);
delay(50);
lcd_com(0x06);
delay(50);
lcd_com(0x01);
delay(1000);
writetab() ; // 汉字初始化
}
/*******************************************************************************/
/*******************************************************************************/
/*******************************************************************************/
void hanzi() //汉字显示
{
lcd_pos(0x00);
lcd_date(0x00);
lcd_pos(0x01);
lcd_date(0x01);
}
/************************************************************************/
void IR_IN() interrupt 0
{
unsigned char j,k,N=0;
EX0 = 0;
// delay1(15);
delay1(120);
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay1(8);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay1(8);}
while (!IRIN) //等 IR 变为高电平
{delay1(8);}
while (IRIN) //计算IR高电平时长
{
delay1(8);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8)
{IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}
}
if (IRCOM[2]!=~IRCOM[3])
{ EX0=1;
return; }
IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
if(IRCOM[5]>9)
{ IRCOM[5]=IRCOM[5]+0x37;}
else
IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{ IRCOM[6]=IRCOM[6]+0x37;}
else
IRCOM[6]=IRCOM[6]+0x30;
lcd_pos(0x4b);
lcd_date(IRCOM[6]); //第一位数显示
lcd_pos(0x4c);
lcd_date(IRCOM[5]);
EX0 = 1;
}
/**********************************************************/
void main(void)
{
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
TCON = 0x01; //触发方式为脉冲负边沿触发
IRIN=1; //I/O口初始化
init(); //1602初始化
hanzi() ; //显示汉字
delay(100);
lcd_pos(0x00);
i=0;
while(cdis1[i]!='\0') //显示字母
{
lcd_date(cdis1[i]);
i++;
}
delay(100);
lcd_pos(0x40);
i=0;
while(d[i]!='\0') //显示字母
{
lcd_date(d[i]);
i++;
}
while(1);
}
void test1()
{ unsigned char a,b,c;
if(a>b)
{
c=0;
}
else
{
c=1;
}
}
void test2()
{
while(i<10)
{
i=i+1;
}
}
|