单片机使用1062lcd设置的电子时钟。
第一行显示字符
第二行显示时间
适用于初学者和一些学生。
在文件里面有源文件C文件以及hex烧录程序。
大家可以看一看。
单片机源程序如下:
- #include<reg51.h>
- #include<string.h> //strcat():合并字符串
- #define uchar unsigned char
- #define uint unsigned int
- #define GPIO_KEY P1
- sbit E=P2^7; //1602使能引脚
- sbit RW=P2^5; //1602读写引脚
- sbit RS=P2^6; //1602数据/命令选择引脚
- uchar table1[]="zhangwenhua2017210484"; //The time is
- //注意修改后的长度
- uchar str1[2]="12"; //second
- uchar str2[2]="12"; //minute
- uchar str3[2]="07"; //hour
- uint KEY_VALUE;
- uint second,minute,hour; //时钟显示数值
- uint tag; //中断计时指标
- void intTostring(uint num,uchar temp[2]);
- void clock() //时钟进制函数
- {
- if(second == 60){minute++;second=0;}
- if(minute == 60){hour++;minute=0;}
- if(hour == 24){hour=0;}
- //数字->字符串的转换
- intTostring(second,str1);
- intTostring(minute,str2);
- intTostring(hour,str3);
- // time 已经存储了时间
- }
- void delayms(uint del) //延时1ms
- {
- uint i,j;
- for(i=0;i<del;i++)
- for(j=0;j<=110;j++);
- }
- void writecmd(uchar com) //写指令
- {
- E=0;
- RS=0;
- RW=0;
- P0=com;
- delayms(2);
- E=1;
- delayms(2);
- E=0;
- }
- void writedata(uchar dat)//写数据
- {
- E=0;
- RS=1;
- RW=0;
- P0=dat;
- delayms(2);
- E=1;
- delayms(2);
- E=0;
- }
- void init(void) //初始化
- {
- delayms(15);
- writecmd(0x38);
- delayms(5);
- writecmd(0x38);
- delayms(5);
- writecmd(0x38);
- writecmd(0x38);
- writecmd(0x08);
- writecmd(0x01);
- writecmd(0x06);
- writecmd(0x0c);
- }
- void intTostring(uint num,uchar temp[2])// 一定要注意这里的字符串长度。
- {
- uint ge,shi;
- shi = num/10;
- ge = num%10;
- temp[0] = shi+48;//利用ASCLL编码转换
- temp[1] = ge+48;
- }
- void display()
- {
-
- uchar j;
- uchar i;
- writecmd(0x80); //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
- for(j=0;j<11;j++) //有11个字符,要循环11次
- {
- writedata(table1[j]); //The time is
- delayms(5);
- }
-
- writecmd(0x80+0x40); //再设置第二行的起始位置
- //时钟显示
- for(i=0;i<2;i++)writedata(str3[i]);
- writedata(':');
- for(i=0;i<2;i++)writedata(str2[i]);
- writedata(':');
- for(i=0;i<2;i++)writedata(str1[i]);
- delayms(5);
- //end
-
- }
- void main()
- {
- TMOD = 0x02; //设置T0为自动重装初值的工作方式
- TL0 = 0x06;// 12Mhz晶振 --> 1us,此处取250us作为一次中断所用时间, 那么4000次中断就算一秒。
- TH0 = 0x06;// 自动重装初值,不影响精度
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- init();
-
- while(1){
-
- display();
- clock();
-
- }
-
- }
- //利用定时器0计时
- void T0_time() interrupt 1
- {
- if(tag == 4000)
- {
- tag = 0;
- second++;
- }
- tag++;
- }
复制代码
所有资料51hei提供下载:
电子时钟.rar
(2.45 KB, 下载次数: 13)
|