工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->微机单片机电路图->单片机综合电路图->液晶显示1602与遥控程序演示

液晶显示1602与遥控程序演示

作者:dolphin时间:2011-05-05

液晶显示1602与遥控程序演示!
//遥控带液晶显示程序,已经调试完毕2002/10/30
//并可显示时钟
//若遥控接收不到,修改脉宽值即可
//
//-----------------------------------------------
//作者:Mingtree
//-----------------------------------------------
#include reg51.h
#includeintrins.h
#includeabsacc.h

//变量类型标识的宏定义,
#define uchar unsigned char
#define uint unsigned int

#define DEDA 20
unsigned char deda=0;

// 1602 控制引脚定义,
sbit RS = P0^0;
sbit RW = P0^1;
sbit Elcm =P0^2;
#define DATAPORT P1 // 数据端口
#define busy 0x80 //用于检查写忙信号


//外键控制(本程序未用,现在用遥控控制)
sbit act=P2^1; /*加键*/
sbit deb=P2^0; /*减键*/
sbit cong=P2^2; /*功能键*/

char data led6[8];/*六位显示缓冲区*/

code char love[]=I LOVE YOU ;

code char time[]=0123456789ABCDEF:MinHour ;

unsigned char hour=0,min=0,sec=0;
bit menu=0;
bit up=0;
bit dw=0;
#define temp1 DBYTE[0x50]
#define temp2 DBYTE[0x51]
#define temp3 DBYTE[0x52]
#define temp4 DBYTE[0x53]
#define temp5 DBYTE[0x54]
//遥控
unsigned char yt; //中断次数
bit start=0; //起码标志
bit h=0; //解码标志
unsigned char da=0; //暂存数据
unsigned char gt=0,gv=0; //

//
void delay400ms(void);
void delay5ms(void);
void lcdreset( void ); //LCD RESET
void WaitForEnable( void ); //忙信号检测

void lcdwrite_c( uchar CMD,uchar AttribC );//
void DispOneChar(uchar x,uchar y,uchar Wdata);//显示一个字符
void LocateXY( char posx,char posy);
void LcdWrite_D( char dataW ) ; //写一个数据
void yk(void);
/*键盘检测*/
void acct_1(void);
unsigned char conh=0; /*功能键键值*/
void key_hit(unsigned char add3);
void delay(void);

/*定时初始化------------*/
void init_timer()
{
TMOD=0x11;
TH0=0x4c;
TL0=0x00;

IP=0x10;
IE=0X82;
TR0=1;
IT0=1; //边沿触发方式
EX0=1; //INT0

}
/*------------------------*/
/*----------显示缓冲区放数子程序--------------*/
void gift_in(void){
if(conh==0){
led6[0]=hour/10;
led6[1]=hour%10;
led6[2]=16;
led6[3]=min/10;
led6[4]=min%10;
led6[5]=16;
led6[6]=sec/10;
led6[7]=sec%10;
}
else if(conh==1){
led6[0]=17;
led6[1]=18;
led6[2]=19;
led6[3]=16;
led6[4]=min/10;
led6[5]=min%10;
led6[6]=24;
led6[7]=24;
}
else{
led6[0]=20;
led6[1]=21;
led6[2]=22;
led6[3]=23;
led6[4]=16;
led6[5]=hour/10;
led6[6]=hour%10;
led6[7]=24;


}
}
/*----------时间判断子程序--------------*/

conv()
{
if(sec==60){min++;sec=0;}
if(min==60){hour++;min=0;}
if(hour==24) hour=0;

gift_in();
}
/*-----------中断服务程序-------------*/
void time8()interrupt 1 using 3
{
TH0=0x4c;
TL0=0x00;

deda++;
if(deda==DEDA)
{
sec++;deda=0;

}
conv();
}

/*-----------送显子程序-------------*/
void disp1(uchar x,uchar y) {
unsigned char *pd;
unsigned char*kt;
unsigned char b;
kt=&led6[0]; /*送led的首地址给指针KT*/
for(b=0;b8;b++){ /* 显示六位*/
pd=&time[*kt]; /*查表---送要显示的码给指针pd*/
kt++; /*缓冲区加1*/
DispOneChar(x,y,*pd);
x++; //显示位置X
}
}

/*------------------------*/


/*=======================================================
显示字符串
=======================================================*/
void disp(uchar x,uchar y,char *ptr) {
uchar i,l=0;
while (ptr[l] 31){l++;};
for (i=0;il;i++) {
DispOneChar(x++,y,ptr[i]);
if ( x == 16 ){
x = 0; y ^= 1;
}
}
}

/*=======================================================
按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(uchar x,uchar y,uchar Wdata) {

LocateXY( x, y ); // 定位显示地址
LcdWrite_D( Wdata ); // 写字符
}

/*=======================================================
显示光标定位
=======================================================*/
void LocateXY( char posx,char posy) {

uchar temp;

temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
lcdwrite_c(temp,0);
}
//初始化
void lcdreset(void){
lcdwrite_c(0x38, 0); //显示模式设置(不测试忙信号)共三次
delay5ms();
lcdwrite_c(0x38, 0);
delay5ms();
lcdwrite_c(0x38, 0);



评论

技术专区