- /*
- ***********************************
- * **
- * 基于STC89c52与1602液晶的时钟 **
- * **
- ***********************************
- **/
-
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit dula=P2^6; //定义U1锁存端
- sbit wela=P2^7; //定义U2锁存端
- sbit rs=P3^5; //定义1602液晶RS端
- sbit lcden=P3^4; //定义1602液晶LCDEN端
- sbit beep=P2^3; //定义蜂鸣器端
- sbit rd=P3^7;
- sbit s1=P3^0; //定义功能选择键-功能键
- sbit s2=P3^1; //定义功能选择键-增大键
- sbit s3=P3^2; //定义功能选择键-减小键
- uchar code table[]=" 2007-7-30 MON";
- uchar code table1[]=" 00:00:00";
- uchar count,s1num;
- char shi,fen,miao;
- void delay(uint z);
- void _beep();
- void write_cmd(uchar cmd);
- void write_date(uchar date);
- void write_sfm(uchar add,uchar date);
- void init();
- void keyscan();
- /**********延时函数***************/
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /***********蜂鸣器发声函数**********/
- void _beep()
- {
- beep=0;
- delay(100);
- beep=1;
- }
- /***********液晶写命令函数**********/
- void write_cmd(uchar cmd)
- {
- rs=0; //数据/命令选择端
- lcden=0;
- P0=cmd; //将命令送达总线
- delay(5); //延时以待数据稳定
- lcden=1; //使能端送高电平
- delay(5); //延时
- lcden=0; //使能端置0完成高脉冲
- }
- /***********液晶写数据函数**********/
- void write_date(uchar date)
- {
- rs=1; //数据/命令选择端
- lcden=0;
- P0=date; //将数据送达总线
- delay(5); //延时以待数据稳定
- lcden=1; //使能端送高电平
- delay(5); //稍作延时
- lcden=0; //使能端置0完成高脉冲
- }
- /**********初始化函数***************/
- void init()
- {
- uchar num;
- rd=0; //软件将矩阵键盘第四列置0以便分离独立按键
- dula=0; //关闭数码管U1,U2锁存端,防止操作液晶造成数码管错误显示
- wela=0;
- lcden=0;
- shi=0;
- fen=0;
- miao=0;
- count=0;
- s1num=0;
- write_cmd(0x38); //设置液晶16*2显示,5*7点阵,8位数据接口
- write_cmd(0x0c);
- write_cmd(0x06); //开显示,显示字符后地址指针自动加一,光标自动加一
- write_cmd(0x01); //显示清屏
- write_cmd(0x80); //设置初始地址指针
- for(num=0;num<15;num++) //液晶显示日期
- {
- write_date(table[num]);
- delay(5);
- }
- write_cmd(0x80+0x40);
- for(num=0;num<12;num++)
- {
- write_date(table1[num]);
- delay(5);
- }
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- /***********液晶写日期函数**********/
- void write_sfm(uchar add,uchar date)
- {
- uchar ge,shi;
- ge=date%10; //分离十位 个位
- shi=date/10;
- write_cmd(0x80+0x40+add); //设置显示位
- write_date(0x30+shi); //送去十位
- write_date(0x30+ge); //送去个位
- }
- /***************按键扫描函数******************/
- void keyscan()
- {
- if(s1==0) //检测按键
- {
- delay(5); //延时 消抖
- if(s1==0) //确认按键按下
- {
- s1num++; //记录功能选择键按下次数
- while(!s1); //等待按键释放
- _beep(); //当有按键释放时蜂鸣器发声
- if(s1num==1)
- {
- TR0=0; //关闭定时器0
- write_cmd(0x80+0x40+10); //光标移动到秒的位置
- write_cmd(0x0f); //显示光标并闪烁
- }
- if(s1num==2) //检测功能选择键第二次被按下
- {
- write_cmd(0x80+0x40+7); //光标移动到分钟显示位置
-
- }
- if(s1num==3) //检测功能键第三次按下
- {
- write_cmd(0x80+0x40+4); //光标移动到时钟位置
-
- }
- if(s1num==4) //检测功能键第四次被按下
- {
- s1num=0; //记录按键数清零
- write_cmd(0x0c); //开显示关闭光标
- TR0=1; //开定时器0
- }
- }
- }
- if(s1num!=0) //功能键按下后功能选择键起作用
- {
- if(s2==0) //检测功能选择键-加按下
- {
- delay(5); //延时 消抖
- if(s2==0)
- {
- while(!s2); //等待按键释放
- _beep(); //按键释放后蜂鸣器发声
- switch(s1num)
- {
- case 1:
- miao++;
- if(miao==60)
- miao=0; //秒位满60后清零
- write_sfm(10,miao); //调节后 液晶写数据
- write_cmd(0x80+0x40+10); //地址指针返回原位置
-
- break;
- case 2:
- fen++;
- if(fen==60)
- fen=0; //分钟位满后清零
- write_sfm(7,fen); //调节后 液晶写数据
- write_cmd(0x80+0x40+7); //地址指针返回原位置
-
- break;
- case 3:
- shi++;
- if(shi==24)
- shi=0; //时钟满后清零
- write_sfm(4,shi); //调节后 液晶写数据
- write_cmd(0x80+0x40+4); //地址指针返回原位置
-
- break;
- default: break;
- }
- }
- if(s3==0)
- {
- delay(5); //延时 消抖
- if(s3==0)
- {
- while(!s3); //等待按键释放
- _beep(); //案件释放后蜂鸣器发声
- switch(s1num)
- {
- case 1:
- miao--;
- if(miao==-1)
- miao=59; //秒位清零
- write_sfm(10,miao); //调节后 液晶写数据
- write_cmd(0x80+0x40+10); //地址指针返回原位置
-
- break;
- case 2:
- fen--;
- if(fen==-1)
- fen=59; //分钟清零
- write_sfm(7,fen); //调节后 液晶写数据
- write_cmd(0x80+0x40+7); //地址指针返回原位置
-
- break;
- case 3:
- shi--;
- if(shi==-1)
- shi=23; //时钟位清零
- write_sfm(4,shi); //调节后 液晶写数据
- write_cmd(0x80+0x40+4); //地址指针返回原位置
- break;
- default: break;
- }
- }
- }
- }
- }
- }
- void mian()
- {
- init(); //初始化
- while(1)
- {
- keyscan();
- }
- }
-
- /***************中断服务函数*****************/
- 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);
-
- }
- }
复制代码
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>