📄 shewang.c
字号:
//晶振采用12MHz 用 自己做的双面板平台 采用扫描法
//此程序经测试OK,可以放心使用,数码管与lcd1602上显示。
//日期:2009-01-05 21:10
//设计人:佘望胜
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*uchar code Dis_Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管的位说明 【ME500】*/
//0xfe=P20 0xfd=P21 0xfb=P22 0xf7=P23 0xef=P24 0xdf=P25 0xbf=P26 0x7f=P27 数码管
//的位说明 【ME500】
uchar data irtab[4]={0x00,0x62,0x21,0x00}; //定义4个数组,用来存储IR码值
uchar code lcd_data_list[]={"0123456789ABCDEF"}; //定义字符表
uchar user[]="User Code:"; //定义字符串
uchar date[]="Data Code:"; //定义字符串
//uchar count_time; //定义数码管计时用变量
//extern void _nop_(void);
sbit remote=P2^0;
sbit beep=P2^1;
sbit lcd_rs=P3^7;
sbit lcd_rw=P3^6;
sbit lcd_en=P3^5;
void disp();
//====================================================================
/*delay1ms(uint h) //12mhz 刚好999us
{
uint i,j;
for(i=0;i<h;i++)
for(j=0;j<121;j++);
}*/
//====================================================================
delay100us() //12mhz 经过测试刚好100us
{
uchar i,j;
for(i=5;i>0;i--)
for(j=8;j>0;j--);
}
//====================================================================
void delay_beep(uchar k)
{
uchar i,j; // 12MHz //j=41,经过测试刚好是101us
for(i=k;i>0;i--)
for(j=10;j>0;j--);
}
//=====================================================================
void delay_lcd(uchar k)
{
uchar i,j; // 12MHz //j=41,经过测试刚好是101us
for(i=k;i>0;i--)
for(j=41;j>0;j--);
}
//====================================================================
void Sound()
{
uint k;
for (k=120;k>0;k--) //此k的数值越大,声音就会越响
{
beep=~beep;
delay_beep(6); //此延时里面的数越大,声音就会持续越长
}
}
//===========读32个码值 初始化=========================================
read_remote()
{
uchar s,q,k,count;
if(remote==0)
{
for(k=85;k>0;k--) //100us重复85次,测得时间8.926ms
{
delay100us();
if(remote==1){return;} //再来判断ir是否为低电平,如果是低电平就执行下面的语句
}
while(!remote); //等待4.5ms的高电平
for(k=23;k>0;k--) //100us重复23次,测得时间2.416ms
{
delay100us();
if(remote==0){return;}
}
for(k=15;k>0;k--) //100us重复16次,测得时间1.681ms
{ //100us重复15次,测得时间1.561ms
delay100us();
if(remote==0){return;} //再判断ir是不是等于0,是就跳出。如果不是就进入while(ir)处进行等待用户码的到了
}
while(remote); //等待0
//===================================开始读32个码======================
for(s=0;s<4;s++) //循环4次读完客户码,客户反吗;数据码,数据反码。
{
for(q=0;q<8;q++) //8位为一个字节
{
while(!remote); //等待4.5ms的高电平
for(k=9;k>0;k--) //100us重复9次,测得时间928us
{ //100us重复8次,测得时间825us
delay100us();
}
if(remote==1) //判断ir是不是为高电平
{
for(k=10;k>0;k--) //100us重复10次,测得时间1.031ms
{ //100us重复11次,测得时间1.134ms
delay100us();
}
count=count>>1;
count=count|0x80;
}
else count=count>>1;
}
irtab[s]=count;
count=0;
} //========================读完了32个码=================================
if(irtab[0] != ~irtab[1] && irtab[2] != ~irtab[3]){return;} //核对有没有读到用户误码与数据误码
disp(); //解码成功后刷新LCD屏
Sound(); //解码成功后蜂鸣器会响一下
}
} //=========================读码完全结束======================
//===============================================数码管初始化================================================
/*void initial() //初始化
{
EA=1;
ET1=1;
TMOD=0x10; //t1方式1
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
}
//===================================================数码管中断================================================
void time() interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count_time++; //用来数码管计时用的
switch(count_time)
{
case 1: P0=Dis_Data[irtab[3]%16]; //显示数据反码
P2=wei[7]; //数码管的个位
break;
case 2: P0=Dis_Data[irtab[3]/16]; //显示数据反码
P2=wei[6]; //数码管的十位
break;
case 3: P0=Dis_Data[irtab[2]%16]; //显示数据码
P2=wei[5]; //数码管的百位
break;
case 4: P0=Dis_Data[irtab[2]/16]; //显示数据码
P2=wei[4]; //数码管的千位
break;
case 5: P0=Dis_Data[irtab[1]%16]; //显示用户反码
P2=wei[3]; //数码管的万位
break;
case 6: P0=Dis_Data[irtab[1]/16]; //显示用户反码
P2=wei[2]; //数码管的十万位
break;
case 7: P0=Dis_Data[irtab[0]%16]; //显示用户码
P2=wei[1]; //数码管的百万位
break;
case 8: P0=Dis_Data[irtab[0]/16]; //显示用户码
P2=wei[0]; //数码管的千万位
count_time=0; //计数器清0
break;
}
}*/
//=========================================LCD============================================
//=========================================LCD============================================
write_command(uchar command)
{
lcd_rs=0; //指向命令寄存器
delay_lcd(5);
lcd_rw=0;
delay_lcd(5);
lcd_en=1;
delay_lcd(5);
P0=command;
delay_lcd(5);
lcd_en=0;
delay_lcd(5);
lcd_rw=0;
}
//========================================================================================
write_date(uchar date)
{
lcd_rs=1; //指向数据寄存器
delay_lcd(5);
lcd_rw=0;
delay_lcd(5);
lcd_en=1;
delay_lcd(5);
P0=date;
delay_lcd(5);
lcd_en=0;
delay_lcd(5);
lcd_rw=0;
}
//========================================================================================
initial()
{
beep=0;
write_command(0x38); //设置显示模式
delay_lcd(8);
write_command(0x01); //清屏设置
delay_lcd(8);
write_command(0x0c); //光标显示设置【0x0f光标闪烁,0x0c没有光标】
delay_lcd(8); //延时,等待LCD初始化充分完成。
//write_command(0x07); //移屏设置
}
//========================================================================================
void disp()
{
uchar i;
//===================================用户码=============================================
write_command(0x80); //显示屏的第一行,显示用户名
delay_lcd(5);
for(i=0;i<10;i++)
{
write_date(user[i]);
delay_lcd(5);
}
write_command(0x80+10); //显示屏的第一行,显示用户码十位
write_date(lcd_data_list[irtab[0]/16]);
delay_lcd(5);
write_command(0x80+11); //显示屏的第一行,显示用户码个位
write_date(lcd_data_list[irtab[0]%16]);
delay_lcd(5);
//===================================用户反码===========================================
write_command(0x80+13); //显示屏的第一行+8位置,显示用户反码
write_date(lcd_data_list[irtab[1]/16]);
delay_lcd(5);
write_command(0x80+14); //显示屏的第一行+9位置,显示用户反码
write_date(lcd_data_list[irtab[1]%16]);
//====================================数据码=============================================
write_command(0xc0); //显示屏的第二行,显示用户名
delay_lcd(5);
for(i=0;i<10;i++)
{
write_date(date[i]);
delay_lcd(5);
}
write_command(0xc0+10); //显示屏的第二行,显示数据码
write_date(lcd_data_list[irtab[2]/16]);
delay_lcd(5);
write_command(0xc0+11); //显示屏的第二行,显示数据码
write_date(lcd_data_list[irtab[2]%16]);
//===================================数据反码====================================
write_command(0xc0+13); //显示屏的第二行,显示数据码
write_date(lcd_data_list[irtab[3]/16]);
delay_lcd(5);
write_command(0xc0+14); //显示屏的第二行,显示数据码
write_date(lcd_data_list[irtab[3]%16]);
/*for(k=0;k<12;k++) //移屏
{
write_command(0x18); //从右向左移屏指令
delay_lcd(50);
}*/
}
//=================================================================================
//========================================================================================
void main()
{
initial();
disp();
while(1)
{
read_remote();
}
} //主函数结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -