|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
/*****************能用按键实现时分秒的调节,与手表功能相差不大,本人已测试过*********************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
/****************位定义声明*****************/
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
uchar count,K1num;
char miao=55,shi=23,fen=59;
uchar code table[17]=" 2016-8-11 Thur ";
uchar code table1[16]=" 23:59:55 ";
/****************函数声明*****************/
void write_sfm(uchar address,uchar data1);
void write_com(uchar com);
void write_date(uchar date);
void init();
void keyscan();
void delay(uint m);
/****************主函数*****************/
void main()
{
init();
while(1)
{
keyscan();
}
}
/****************初始化函数*****************/
void init()
{
uchar i;
LCD1602_E=0;
write_com(0x38); //开显示
write_com(0x0c); //开显示不显示光标
write_com(0x06); //写一个指针加1
write_com(0x01); //清屏
write_com(0x80); //设置数据指针起点
for(i=0;i<17;i++)
{
write_date(table);
delay(1);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(table1);
delay(1);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/****************按键扫描函数*****************/
void keyscan()
{
if(K1==0)
{
delay(5);
if(K1==0)
{
delay(5);
if(K1==0)
{
K1num++;
while(!K1);
if(K1num==1)
{
TR0=0;
write_com(0x80+0x40+11);//光标在秒位闪烁
write_com(0x0f);
}
}
if(K1num==2)
{
write_com(0x80+0x40+8);//光标在分位闪烁
}
if(K1num==3)
{
write_com(0x80+0x40+5); //光标在时位闪烁
}
if(K1num==4)
{
K1num=0;
write_com(0x0c);//光标不闪烁
TR0=1;
}
}
}
if(K1num!=0)
{
if(K2==0)
{
delay(5);
if(K2==0)
{
while(!K2);
if(K1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(K1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(K1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(K3==0)
{
delay(5);
if(K3==0)
{
while(!K3);
if(K1num==1)
{
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
}
if(K1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(K1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
/****************写入时分秒的十位和个位*****************/
void write_sfm(uchar address,uchar data1)
{
uchar shi,ge;
shi=data1/10;
ge=data1%10;
write_com(0x80+0x40+address);
write_date(0x30+shi);
write_date(0x30+ge);
}
/****************1ms延时函数*****************/
void delay(uint m)
{
uint x,y;
for(x=m;x>0;x--)
for(y=110;y>0;y--);
}
/*****************写入命令*******************/
void write_com(uchar com)
{
LCD1602_E=0; //使能清零
LCD1602_RS=0; //选择发送命令
LCD1602_RW=0; //选择写入
LCD1602_DATAPINS=com; //放入命令
delay(1); //等待数据稳定
LCD1602_E=1; //写入时序
delay(1); //保持时间
LCD1602_E=0;
}
/*****************写入数据*******************/
void write_date(uchar date)
{
LCD1602_E=0; //使能清零
LCD1602_RS=1; //选择输入数据
LCD1602_RW=0; //选择写入
LCD1602_DATAPINS=date; //写入数据
delay(1); //等待数据稳定
LCD1602_E=1; //写入时序
delay(1); //保持时间
LCD1602_E=0;
}
/*****************定时器0中断*******************/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
} |
|