作业帮 > 综合 > 作业

51单片机,1602动态显示时钟,有独立按键(3个k1,k2,k3)分别控制选择,加1,减一

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/10/03 07:34:13
51单片机,1602动态显示时钟,有独立按键(3个k1,k2,k3)分别控制选择,加1,减一
程序如下,k1键是功能键,只有k1键按下,k2(加1键)才能按下,我现在k1键按下之后能看到光标的闪烁,按k2键之后,却没有反应,应该是要加1的,
#include
#include
#include "1602.h"
sbit k1=P3^0; //功能键,设置光标闪烁
sbit k2=P3^1; //时间加1
sbit k3=P3^2; //时间减1
uchar code table1[]=" 2013-08-06 Tue ";
uchar code table2[]=" 22:58:50 ";
uchar i,count;
uchar shi,fen,miao,k1num;
void write_sfm(uchar add,uchar date);
void keyscan();
void main(){
\x05ledinit();
\x05shi=22;
\x05fen=58;
\x05miao=50;
\x05//设置定时器
\x05TMOD=0x01;
\x05TH0=0x3c;
\x05TL0=0xb0;
\x05EA=1;
\x05ET0=1;
\x05TR0=1;
\x05\x05
\x05while(table1[i]!='\0')
\x05{
\x05\x05write_data(table1[i]);
\x05\x05i++;
\x05}
\x05write_com(0xc0);
\x05i=0;
\x05while(table2[i]!='\0'){
\x05\x05write_data(table2[i]);
\x05\x05i++;\x05
\x05}
\x05while(1){
\x05\x05keyscan();
\x05\x05if(count==20){\x05//定时器为:50ms*20=1000ms=1s
\x05\x05count=0;
\x05\x05miao++;
\x05\x05if(miao==60){
\x05\x05\x05miao=0;
\x05\x05\x05fen++;
\x05\x05\x05if(fen==60){
\x05\x05\x05\x05fen=0;
\x05\x05\x05\x05shi++;
\x05\x05\x05\x05if(shi==24){
\x05\x05\x05\x05\x05shi=0;
\x05\x05\x05\x05}
\x05\x05\x05\x05write_sfm(3,shi);
\x05\x05\x05}
\x05\x05\x05write_sfm(6,fen);
\x05\x05}
\x05\x05write_sfm(9,miao);
\x05}
\x05}
\x05
\x05
}
void keyscan(){
\x05if(k1==0){
\x05\x05delay(5);
\x05\x05if(k1==0){
\x05\x05\x05k1num++;
\x05\x05\x05while(!k1);\x05 //松手
\x05\x05\x05if(k1num==1){
\x05\x05\x05\x05TR0=0;//关闭中断,计时器停止工作!
\x05\x05\x05\x05write_com(0xc0+10);\x05
\x05\x05\x05\x05write_com(0x0f); //光标闪烁命令发送一次就可以了.
\x05\x05\x05}
\x05\x05\x05if(k1num==2){
\x05\x05\x05\x05write_com(0xc0+7);
\x05\x05\x05}
\x05\x05\x05if(k1num==3){
\x05\x05\x05\x05write_com(0xc0+4);
\x05\x05\x05}
\x05\x05\x05if(k1num==4){
\x05\x05\x05\x05k1num=0;
\x05\x05\x05\x05write_com(0x0c); //取消光标的闪烁
\x05\x05\x05\x05TR0=1;
\x05\x05\x05}
\x05\x05\x05
\x05\x05//按k1键之后才能按k2,k3键
\x05\x05\x05if(k1num!=0){\x05 //说明功能键被按下
\x05\x05\x05\x05if(k2==0){
\x05\x05\x05\x05\x05delay(5);
\x05\x05\x05\x05\x05if(k2==0){
\x05\x05\x05\x05\x05\x05while(!k2); //松手
\x05\x05\x05\x05\x05\x05if(k1num==1){\x05//秒针
\x05\x05\x05\x05\x05\x05\x05miao++;
\x05\x05\x05\x05\x05\x05\x05if(miao==60)
\x05\x05\x05\x05\x05\x05\x05\x05miao=0;
//\x05\x05\x05\x05\x05\x05\x05write_com(0xc0+9);
//\x05\x05\x05\x05\x05\x05\x05write_data(0x30+miao/10);
//\x05\x05\x05\x05\x05\x05\x05write_data(0x30+miao%10);
\x05\x05\x05\x05\x05\x05\x05write_sfm(9,miao);
//\x05\x05\x05\x05\x05\x05\x05write_com(0xc0+10);//将数据指针退一格\x05
\x05\x05\x05\x05\x05\x05}
\x05\x05\x05\x05\x05\x05if(k1num==2){\x05 //分针
\x05\x05\x05\x05\x05\x05\x05fen++;
\x05\x05\x05\x05\x05\x05\x05if(fen==60)
\x05\x05\x05\x05\x05\x05\x05\x05fen=0;
\x05\x05\x05\x05\x05\x05\x05write_sfm(6,fen);
\x05\x05\x05\x05\x05\x05\x05write_com(0xc0+6);
\x05\x05\x05\x05\x05\x05}
\x05\x05\x05\x05\x05\x05if(k1num==3){\x05 //时针
\x05\x05\x05\x05\x05\x05\x05shi++;
\x05\x05\x05\x05\x05\x05\x05if(shi==24)
\x05\x05\x05\x05\x05\x05\x05\x05shi=0;
\x05\x05\x05\x05\x05\x05\x05write_sfm(3,shi);
\x05\x05\x05\x05\x05\x05\x05write_com(0xc0+3);
\x05\x05\x05\x05\x05\x05}
\x05\x05\x05\x05\x05}
\x05\x05\x05\x05}
\x05\x05\x05}\x05\x05\x05
\x05\x05}
\x05\x05
\x05}
}
//刷新时间
void write_sfm(uchar add,uchar date){
\x05uchar shiwei,gewei;
\x05shiwei=date/10;
\x05gewei=date%10;
\x05write_com(0xc0+add);
\x05write_data(0x30+shiwei);
\x05write_data(0x30+gewei);
}
void timer0() interrupt 1{
\x05TH0=0x3c;
\x05TL0=0xb0;
\x05count++;
}
你好,
我这又一个参考程序,是用郭天祥的TX-1C开发板写的,有3个按键,调节光标,时间加,时间减.引脚方便可以根据自己的开发板更改,其他程序内容不变.
希望我的回答能帮助到你.