帮忙给时钟加个闹钟和秒表,各位大神帮帮忙

2019-03-24 18:17发布

#include #define uint unsigned int #define uchar unsigned char sbit rs=P2^0; //定义液晶显示器控制端口 sbit rw=P2^1; sbit en=P2^2; sbit s1=P1^0; //定义按键控制 sbit s2=P1^1; sbit s3=P1^2; sbit s4=P1^3; sbit SPK=P3^0;//蜂鸣器,通过三极管9012驱动,端口低电平响 uchar shi,fen,miao; uchar code table[]={" 09 TONGXINB 27 "}; uchar code table1[]={" 00:00:00"}; uchar num,num1,count; uint i,sh,ge,s,g; void delay(uchar time) //延时 { uint j; for(;time>0;time--) for(j=0;j<125;j++); } void write_com(uchar com) //写指令函数 { en=0; rs=0; delay(5); P0=com; delay(5); en=1; delay(5); en=0; } void write_data(uchar dat) //写数据函数 { en=0; rs=1; delay(5); P0=dat; delay(5); en=1; delay(5); en=0; } void init() //初始化 { en=0; rw=0; write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口 write_com(0x0c);//设置开显示,不显示光标 write_com(0x06);//写一个字符后地址指针加1 write_com(0x01);//显示清零,数据指针清零 for(i=0;i<(sizeof(table)-1);i++) //第一行写 { write_com(0x80+i); write_data(table); } for(i=0;i<(sizeof(table1)-1);i++) //第二行写 { write_com(0x80+0x40+i); write_data(table1); } miao=59; fen=59; shi=23; TMOD=0x01; //time0作为定时器工作在模式1下 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; //开启总中断 ET0=1; //开启time0中断 TR0=1; //启动time0 } void write_sfm(uchar add,uchar num) //时分秒函数 { sh=num/10; //分离出十位 ge=num%10; //分离出个位 write_com(0x80+0x40+add); //第二行数据指针位置调整 write_data(0x30+sh); //更改显示数据的十位 write_data(0x30+ge); //更改显示数据的个位 } void timer0() interrupt 1 //time0中断 { TH0=(65536-50000)/256; //重装初始值 TL0=(65536-50000)%256; count++; if(count==20) //20次到则满一秒 { 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); } } //--------------- //蜂鸣器 //------------ void Beep() { uchar i,j =70; for(i=0;i<200;i++) { while ( -- j) ; SPK = ~SPK; } delay(5);SPK = 1; } void keyscan() //键盘扫描 { if(s1==0) //按下S1 { delay(5); if(s1==0) { num1++; while(!s1);//等待释放 if(num1==1) { Beep(); TR0=0; write_com(0x0e); //显示光标,不闪烁 write_com(0x80+0x40+0x0b); //数据指针移动到秒的个位处 write_com(0x0f);//显示光标,闪烁 } if(num1==2) {Beep(); write_com(0x80+0x40+0x08); //数据指针移到到分钟的个位处 } if(num1==3) { Beep(); write_com(0x80+0x40+0x05); //数据指针移到到小时的个位处 } if(num1==4) {Beep(); num1=0; //清零 write_com(0x0c); //重新显示 TR0=1; //重新启动计时 } } } if(num1!=0) //按下S2则选择时/分/秒加1 { if(s2==0) { delay(5); if(s2==0) { while(!s2); if(num1==1) {Beep(); delay(20); miao++; if(miao==60) miao=0; write_sfm(10,miao); write_com(0x80+0x40+0x0a); } if(num1==2) { Beep(); fen++; if(fen==60) fen=0; write_sfm(7,fen); write_com(0x80+0x40+0x07); } if(num1==3) { Beep(); shi++; if(shi==24) shi=0; write_sfm(4,shi); write_com(0x80+0x40+0x04); } } } } if(num1!=0) if(s3==0) //按下S3则选择时/分/秒 减1 { delay(5); if(s3==0) { while(!s3); if(num1==1) { Beep(); delay(20); miao--; if(miao==-1) miao=59; write_sfm(10,miao); write_com(0x80+0x40+0x0a); } if(num1==2) { Beep(); fen--; if(fen==-1) fen=59; write_sfm(7,fen); write_com(0x80+0x40+0x07); } if(num1==3) { Beep(); shi--; if(shi==-1) shi=23; write_sfm(4,shi); write_com(0x80+0x40+0x04); } } } if(num1!=0) if(s4==0) //确定按键 { Beep(); delay(5); if(s4==0) { while(!s4); num1=0; //清零 write_com(0x0c); //重新显示 TR0=1; //重新启动计时 } } } void main() { init(); SPK=1; while(1) { keyscan(); } } 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。