/**********************************************************************************************
* 描述:时间显示器
*功能按键:STC12C5A60S2右边方向键 右键为功能键 (按下选择年月日时分秒的设置)
左键为退出功能键 上键为加一键 下键为减一键
**********************************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BUZZ=P1^6; //定义蜂鸣器端,按键释放和整点响
sbit ENLCD=P1^5; //定义1602液晶LCDEN端,使能信号
sbit ADDR0=P1^0; //定义1602液晶RS端,数据/命令选择端(H/L)
sbit ADDR1=P1^1; //定义1602液晶RW端,读/写选择端(H/L)
uchar code keycode[] = {0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,
0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};//键位置
uchar yue,ri,shi,fen,miao,week,nian,flag,count;
uchar code table[7][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
//数字
//char code dat[]={"0123456789"};
/***********毫秒级延时函数**********/
void delay(uint x)
{
uint y,z;
for(y=x;y>0;y--)
for(z=110;z>0;z--);
}
/***********蜂鸣器发声函数**********/
void di(uint dd)
{
BUZZ=0;
delay(dd);
BUZZ=1;
}
/***********按键判断函数**********/
uchar key_scan()
{uchar i,k,kcode,scode;
P2 = 0xf0;
if((P2&0xf0)!=0xf0)
{delay(500);
if((P2&0xf0)!=0xf0)
{scode = 0xfe;
for(k=0;k<4;k++)
{P2 = scode;
if((P2&0xf0)!=0xf0)
{kcode = ~P2;
for(i=0;i<16;i++)
if(kcode == keycode[i])
return i;
}
else scode =_crol_(scode,1);
}
}
}
return(16);
}
/***********LCD1602忙等待**********/
uchar busycheck()
{uchar s;
ADDR0=0;
ADDR1=1;
ENLCD=1;
delay(1);
s=P0;
ENLCD=0;
return s;
}
/***********液晶写命令函数**********/
void write_com(uchar com)
{
while((busycheck()&0x80)==0x80);
ADDR0=0;
ADDR1=0;
ENLCD=0;
P0=com;
delay(5);
ENLCD=1;
delay(5);
ENLCD=0;
}
/***********液晶写数据函数**********/
void write_date(uchar date)
{
while((busycheck()&0x80)==0x80);
ADDR0=1;
ADDR1=0;
ENLCD=0;
P0=date;
delay(5);
ENLCD=1;
delay(5);
ENLCD=0;
}
/***********写年函数**********/
void write_nian(uchar add,uchar date)reentrant //reentrant定义为可重入函数,允许被递归调用
{
uint bai,shi,ge;
bai=date/100;
shi=date%100/10;
ge=date%100%10;
write_com(0x80+add); //设置显示位置
write_date(0x30+bai); //0~9对应的字符码是0x30~0x39
write_date(0x30+shi);
write_date(0x30+ge);
/*write_date(dat[bai]);
write_date(dat[shi]);
write_date(dat[ge]);*/
} <
* 描述:时间显示器
*功能按键:STC12C5A60S2右边方向键 右键为功能键 (按下选择年月日时分秒的设置)
左键为退出功能键 上键为加一键 下键为减一键
**********************************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BUZZ=P1^6; //定义蜂鸣器端,按键释放和整点响
sbit ENLCD=P1^5; //定义1602液晶LCDEN端,使能信号
sbit ADDR0=P1^0; //定义1602液晶RS端,数据/命令选择端(H/L)
sbit ADDR1=P1^1; //定义1602液晶RW端,读/写选择端(H/L)
uchar code keycode[] = {0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,
0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};//键位置
uchar yue,ri,shi,fen,miao,week,nian,flag,count;
uchar code table[7][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
//数字
//char code dat[]={"0123456789"};
/***********毫秒级延时函数**********/
void delay(uint x)
{
uint y,z;
for(y=x;y>0;y--)
for(z=110;z>0;z--);
}
/***********蜂鸣器发声函数**********/
void di(uint dd)
{
BUZZ=0;
delay(dd);
BUZZ=1;
}
/***********按键判断函数**********/
uchar key_scan()
{uchar i,k,kcode,scode;
P2 = 0xf0;
if((P2&0xf0)!=0xf0)
{delay(500);
if((P2&0xf0)!=0xf0)
{scode = 0xfe;
for(k=0;k<4;k++)
{P2 = scode;
if((P2&0xf0)!=0xf0)
{kcode = ~P2;
for(i=0;i<16;i++)
if(kcode == keycode[i])
return i;
}
else scode =_crol_(scode,1);
}
}
}
return(16);
}
/***********LCD1602忙等待**********/
uchar busycheck()
{uchar s;
ADDR0=0;
ADDR1=1;
ENLCD=1;
delay(1);
s=P0;
ENLCD=0;
return s;
}
/***********液晶写命令函数**********/
void write_com(uchar com)
{
while((busycheck()&0x80)==0x80);
ADDR0=0;
ADDR1=0;
ENLCD=0;
P0=com;
delay(5);
ENLCD=1;
delay(5);
ENLCD=0;
}
/***********液晶写数据函数**********/
void write_date(uchar date)
{
while((busycheck()&0x80)==0x80);
ADDR0=1;
ADDR1=0;
ENLCD=0;
P0=date;
delay(5);
ENLCD=1;
delay(5);
ENLCD=0;
}
/***********写年函数**********/
void write_nian(uchar add,uchar date)reentrant //reentrant定义为可重入函数,允许被递归调用
{
uint bai,shi,ge;
bai=date/100;
shi=date%100/10;
ge=date%100%10;
write_com(0x80+add); //设置显示位置
write_date(0x30+bai); //0~9对应的字符码是0x30~0x39
write_date(0x30+shi);
write_date(0x30+ge);
/*write_date(dat[bai]);
write_date(dat[shi]);
write_date(dat[ge]);*/
} <