/* 设计者:李文 功能: 1602液晶显示时钟,并且可调。 */ #include <reg52.h>//头文件 #include <intrins.h> #define uchar unsigned char//宏定义 #define uint unsigned int sbit wela=P2^7;//定义位类型 sbit dula=P2^6; sbit rs =P3^5; sbit en =P3^4; sbit key1=P3^6;//功能键 sbit key2=P3^3;//按键加 sbit key3=P3^1;//按键减 sbit key4=P3^2;//清零 sbit beep=P2^3; sbit P3_6=P3^7; uchar miao ,shi,fen;//定义变量 uchar count=0,num;//定义变量 //uchar code table[]={{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}};//定义数组 void delay(uint x)//延时1ms函数 { uchar i; while(x--) {for(i=0;i<120;i--);} } void com (uchar com)//1602的写指令 { rs=0; en=0; P0=com; delay(5); en=1; delay(5); en=0; } void dat(uchar dat)//1602的写数据 { rs=1; en=0; P0=dat; delay(5); en=1; delay(5); en=0; } void write_sfm(uchar add,uchar num)//液晶显示一位两位的十进制数 { uchar shi ,ge;
shi=num/10;//十位和个位的分离 ge=num%10; com(0x80+0x40+add);//显示的位置 dat(0x30+shi);//显示的十位 dat(0x30+ge);//显示的个位 } void write_sfmTIAN(uchar add,uchar num)//液晶显示一位两位的十进制数 { uchar shi ,ge;
shi=num/10;//十位和个位的分离 ge=num%10; com(0x80+add);//显示的位置 dat(0x30+shi);//显示的十位 dat(0x30+ge);//显示的个位 }
void write_sfmNIAN(uint num)//液晶显示一位四位的十进制数 { uchar qian,bai,shi ,ge;
qian=num/1000;// bai=num%1000/100; shi=num%1000%100/10;// ge=num%1000%100%10; com(0x80);//显示的位置 dat(0x30+qian);//显示 dat(0x30+bai);//显示 dat(0x30+shi);//显示 dat(0x30+ge);//显示 }
void di ()//蜂鸣器 { beep=0; delay(100); beep=1; } void init ()//初始化函数 { uint k=2011; uchar yue=4,tian=10; dula=0; wela=0; en=0; fen=0; shi=0; miao=0; count=0; //1602液晶的初始化 com(0x38);//显示模式初始化 com(0x0c);//开显示,光标不显示,光标不闪烁 com(0x06);//指针加一 com(0x01);//清屏 com(0x80+4);//定位数据指针 dat('-');//写数据 delay(5);//延时 com(0x80+7);//定位数据指针 dat('-');//写数据 delay(5); //延时
write_sfmNIAN(k); write_sfmTIAN(5,yue); write_sfmTIAN(8,tian);
com(0x80+0x40+6);//定位数据指针 dat(':');//写数据 delay(5);//延时 com(0x80+0x40+9);//定位数据指针 dat(':');//写数据 delay(5); //延时 write_sfm(10,miao);//秒的显示 write_sfm(7,fen);//分的显示 write_sfm(4,shi);//时的显示 TMOD=0X01;//定时器0工作在方式1 TH0=(65536-50000)/256;//设置初值 TL0=(65536-50000)%256;// EA=1;//开总中断 ET0=1;//开定时器0 TR0=1; //启动定时器0 } void key()//按键函数 { P3_6=0; if(key1==0) { delay(5); if(key1==0) { num++; while(!key1); di(); if(num==1) { TR0=0; com(0x80+0x40+10); com(0x0f); } if(num==2) { com(0x80+0x40+7); com(0x0f); }
if(num==3) { com(0x80+0x40+4); com(0x0f); } if(num==4) { com(0x80); com(0x0f); } if(num==5) { com(0x80+5); com(0x0f); } if(num==6) { com(0x80+8); com(0x0f); } if(num==7) { com(0x80+11); } if(num==8) { num=0; com(0x0C); TR0=1; } } } if(num != 0) { if(key2==0) { delay(5); if(key2==0) { while(!key2); di(); if(num==1) { miao++; if(miao==60) miao=0; write_sfm(10,miao);//秒的显示 com(0x80+0x40+10); } if(num==2) { fen++; if(fen==60) fen=0; write_sfm(7,fen);//分的显示 com(0x80+0x40+7); } if(num==3) { shi++; if(shi==24) shi=0; write_sfm(4,shi);//时的显示 com(0x80+0x40+4); } } } }
if(num!=0) { if(key3==0) { delay(5); if(key3==0) { while(!key3); di(); if(num==1) { miao--; if(miao==-1) miao=59; write_sfm(10,miao);//秒的显示 com(0x80+0x40+10); } if(num==2) { fen--; if(fen==-1) fen=59; write_sfm(7,fen);//分的显示 com(0x80+0x40+7); } if(num==3) { shi--; if(shi==-1) shi=23; write_sfm(4,shi);//时的显示 com(0x80+0x40+4); } } } }
if(num != 0) { if(key4==0) { delay(5); if(key4==0) { while(!key4); di(); if(num==1) { miao=0; write_sfm(10,miao);//秒的显示 com(0x80+0x40+10); } if(num==2) { fen=0; write_sfm(7,fen);//分的显示 com(0x80+0x40+7); } if(num==3) { shi=0; write_sfm(4,shi);//时的显示 com(0x80+0x40+4); } } } }
} void main()//主函数 { init();//初始化 while(1) { key(); } }
void timer0() interrupt 1//中断服务程序 { TH0=(65536-50000)/256;//重新赋初值 TL0=(65536-50000)%256; count++; if(count==20)//1秒到了 { 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);//刷新秒 } }
|