这是一个简单的电子时钟设计,利用LCD1602显示,均为原创,请大家指正
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- //#include<lcd1602.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar int_time;
- uchar second;
- uchar minute;
- uchar hour;
- void write_data(uchar date);
- void write_com(uchar com);
- void init1602();
- void write_string(uchar *pp, uint n);
- void write_sfm(uchar add,uchar date);
- uchar code date[]="wwj 2604200321";
- uchar code time[]=" TIME 23:59:55 ";
- uchar second=55,minute=59,hour=23;
- void clock_init(){
- uchar i,j;
- for(i=0;i<16;i++){
- write_data(date[i]);
- }
- write_com(0x80+0x40);
- for(j=0;j<16;j++){
- write_data(time[j]);
- }
- }
- void clock_write(uint s, uint m, uint h){
- write_sfm(0x47,h);
- write_sfm(0x4a,m);
- write_sfm(0x4d,s);
- }
- void main(){
- init1602();
- clock_init();
- TMOD=0x01;
- EA=1;
- ET0=1;
- TH0=(65536-46483)/256;
- TL0=(65536- 46483)%256;
- TR0=1;
- int_time=0;
- second=55;
- minute=59;
- hour=23;
- while(1){
- clock_write(second,minute,hour);
- }
- }
- void T0_interserve(void) interrupt 1 using 1{
- int_time++;
- if(int_time==20){
- int_time=0;
- second++;
- }
- if(second==60){
- second=0;
- minute++;
- }
- if(minute==60){
- minute=0;
- hour ++;
- }
- if(hour==24){
- hour=0;
- }
- TH0=(65536-46083)/256;
- TL0=(65536- 46083)%256;
- }
- //#ifndef LCD_CHAR_1602_2011_5_9
- #define LCD_CHAR_1602_2011_5_9
- #define uchar unsigned char
- #define uint unsigned int
- sbit Icdrs = P2^0;
- sbit Icdrw= P2^1;
- sbit Icden= P2^2;
- void delay(uint z){
- uint x,y;
- for(x=z;x>0;x--){
- for(y=110;y>0;y--);
- }
- }
- void write_com(uchar com){
- Icdrw=0;
- Icdrs=0;
- P3=com;
- delay(5);
- Icden=1;
- delay(5);
- Icden=0;
- }
- void write_data(uchar date){
- Icdrw=0;
- Icdrs=1;
- P3=date;
- delay(5);
- Icden=1;
- delay(5);
- Icden=0;
- }
- void init1602(){
- Icdrw=0;
- Icden=0;
- write_com(0x3C);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80);
- }
- void write_string(uchar *pp, uint n){
- int i;
- for(i=0;i<n;i++){
- write_data(pp[i]);
- }
- }
- void write_sfm(uchar add,uchar date){
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+add);
- write_data(0x30+shi);
- write_data(0x30+ge);
- }
- //#endif
复制代码
Keil代码与Proteus8.13仿真下载:
LCD.7z
(35.31 KB, 下载次数: 53)
|