【C51】基于C51单片机的LCD电子时钟设计(含代码,电路图,拿去直接用)

学校的一个课设

可以去"链接"直接打包下载

1 LCD电子时钟设计
1、 制作一个基于LCD显示的电子钟,在LCD显示器上显示当前时间。
2、 使用字符型LCD显示器显示时间。
3、 显示格式:“时时:分分:秒秒”。
4、 用4个功能键操作来设置当前时间。功能键K1~K4功能如下:
(1) K1:进入设置现在时间;
(2) K2:修改小时,并显示修改结果;
(3) K3:修改分钟,并显示修改结果;
(4) K4:确认完成设置。
在这里插入图片描述

代码

#include<reg52.h>
#include<stdlib.h>
#include<stdio.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
 
uint num,A_num,x,y=0;
uint h,m,s,year=2020,month=7,day=4,lcd_x=0,lcd_y=0;
 
uchar code Zifu[]="0123456789";
 
 
sbit LCD_EN = P3^4;
sbit LCD_RS = P3^5;
 
 
sbit key_A = P1^0;
sbit key_B = P1^1;
sbit key_C = P1^2;
sbit key_D = P1^3;

void delay_1ms(uchar x){
	uchar i,j;
	for(j=0;j<x;j++)
		for(i=0;i<110;i++);
}
 
void write_command(uchar command){
	LCD_RS = 0;
	LCD_EN = 0;
	P0 = command;
	delay_1ms(2);
	LCD_EN = 1;	 		//EN ?1 -- 0 ?? ???? ? ??
	delay_1ms(2);
	LCD_EN = 0;
}
 
void write_data(uchar fuck){
	LCD_RS = 1;
	LCD_EN = 0;
	P0 = fuck;
	delay_1ms(2);
	LCD_EN = 1;
	delay_1ms(2);
	LCD_EN = 0;
}
 
void lcd_post(int X,int Y){			//0,1?? ??? ? ???
	write_command(0x80+X*(0x40)+Y);
}
 
void init(){
	h=m=s=0;
	num=A_num=0;
 
	LCD_EN=0;
	write_command(0x38);
	write_command(0x0c);
	//write_command(0x06); //??????????
	write_command(0x01);
 
	TMOD = 0x02;
	TH0 = 6;
	TL0 = 6;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
 
/*???*/	
	lcd_post(0,0); write_data(Zifu[h/10]);
	lcd_post(0,1); write_data(Zifu[h%10]);
 
	lcd_post(0,2); write_data(':');
 
	lcd_post(0,3); write_data(Zifu[m/10]);
	lcd_post(0,4); write_data(Zifu[m%10]);
 
	lcd_post(0,5); write_data(':');
 
	lcd_post(0,6); write_data(Zifu[s/10]);
	lcd_post(0,7); write_data(Zifu[s%10]);
 
/*???*/
	lcd_post(1,6); write_data(Zifu[year/1000]);
	lcd_post(1,7); write_data(Zifu[(year%1000)/100]);
	lcd_post(1,8); write_data(Zifu[(year%100)/10]);
	lcd_post(1,9); write_data(Zifu[year%10]);
 
	lcd_post(1,10); write_data('-');
 
	lcd_post(1,11); write_data(Zifu[month/10]);
	lcd_post(1,12); write_data(Zifu[month%10]);
 
	lcd_post(1,13); write_data('-');
 
	lcd_post(1,14); write_data(Zifu[day/10]);
	lcd_post(1,15); write_data(Zifu[day%10]);
}
 
 
void keyscan(){

			if(key_A==0){
			delay_1ms(3);
			if(key_A==0){	

					m=(++m)%60;
					lcd_post(0,3); write_data(Zifu[m/10]);
					lcd_post(0,4); write_data(Zifu[m%10]);

			while(!key_A);
		}
	}
	

	

		if(key_B==0){
			delay_1ms(3);
			if(key_B==0){	


					h=(++h)%24;
					lcd_post(0,0); write_data(Zifu[h/10]);
					lcd_post(0,1); write_data(Zifu[h%10]);

			while(!key_B);
		}
	}		
}
 
void main()
{
	init();
	y = 0;
	while(1){
		
		
if(key_D==0){  
		delay_1ms(3);
		if(key_D==0){
			y = 1;
		}
		while(!key_D);
	}
if(key_C==0){  
		delay_1ms(3);
		if(key_C==0){
			y = 0;
		}
		while(!key_C);
}
		


		
		if(num==3686){
			num=0;
			s++;
			if(s==60){
				s=0;
				m++;
				if(m==60){
					m=0;
					h++;
					if(h==24)h=0;
					lcd_post(0,0); write_data(Zifu[h/10]);
					lcd_post(0,1); write_data(Zifu[h%10]);
				}
				lcd_post(0,3); write_data(Zifu[m/10]);
				lcd_post(0,4); write_data(Zifu[m%10]);
			}
			lcd_post(0,6); write_data(Zifu[s/10]);
			lcd_post(0,7); write_data(Zifu[s%10]);
		}
		
		if(y == 1)
		{
		keyscan();
		}
		
		
		
	}
}
 
void T0_time() interrupt 1
{
	num++;
}

//	if(key_A==0){  //??????
//		delay_1ms(3);
//		if(key_A==0){

//		}
//		while(!key_A);
//	}
  • 92
    点赞
  • 703
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
准确延时,数码管显示!用于电子时钟 #include <reg51.h> //*** 函数定义 *** void long_delay(void); // 长延时 void short_delay(void); // 短延时 void delay10ms(unsigned char); // 延时10MS void write7279(unsigned char, unsigned char);// 写入到HD7279 unsigned char read7279(unsigned char);//从HD7279读入 void send_byte(unsigned char); // 发送一个字节 unsigned char receive_byte(void); //接收一个字节 void init_timer(); /*定时器T0初始化*/ void conv(); /*时、分、秒单元及走时单元转换*/ void dirve(); /*时间显示程序*/ void time_adj(); /*时间调整设置*/ unsigned char digit[6]; unsigned char j; unsigned int tmr; unsigned long wait_cnter; unsigned char hour=0,min=0,sec=0; /*时、分、秒单元清零*/ unsigned char deda=0; /*5mS计数单元清零*/ bit sign; //设置标志位 sbit cs=P1^5; // cs at P1.5 sbit clk=P1^4; // clk 连接于 P1.4 sbit dat=P1^3; // dat 连接于 P1.3 sbit set=P3^7; // key 连接于 P3.7 //****** HD7279A 指令 ****** #define CMD_RESET 0xa4 #define CMD_TEST 0xbf #define DECODE0 0x80 #define DECODE1 0xc8 #define CMD_READ 0x15 #define UNDECODE 0x90 #define RTL_CYCLE 0xa3 #define RTR_CYCLE 0xa2 #define RTL_UNCYL 0xa1 #define RTR_UNCYL 0xa0 #define ACTCTL 0x98 #define SEGON 0xe0 #define SEGOFF 0xc0 #define BLINKCTL 0x88 //*** 主函数 *** main() { for (tmr=0;tmr<0x2000;tmr++); // 上电延时 send_byte(CMD_RESET); // 复位HD7279A //****************************************** // 测试指令演示 //****************************************** send_byte(CMD_TEST); // 指令测试 for (j=0;j<3;j++) // 延时哟3秒? { delay10ms(100); } send_byte(CMD_RESET); // 清除显示 //********************************************** //时间显示 //********************************************** init_timer();/*定时器T0初始化*/ while(1) { if(set==0) time_adj(); conv(); /*时、分、秒单元及走时单元转换*/ dirve(); /*时、分、秒单元显示*/ } } /*定时器T0 5mS初始化*/ void init_timer() { TMOD=0x01; TH0=-(4800/256); TL0=-(4800%256); IE=0x82; TR0=1; } /*5mS定时中断服务子函数*/ void zd(void) interrupt 1 { TH0=-(4800/256); TL0=-(4800%256); deda++; } /*时、分、秒单元及走时单元转换*/ void conv() { if(deda>=200){sec++;deda=0;} if(sec==60){min++;sec=0;} if(min==60){hour++;min=0;} if(hour==24){hour=0;} } void dirve() { digit[0]=sec%10; //计数个位 write7279(DECODE0,digit[0]); //显示个位 digit[1]=0x80|(sec/10); //计数十位 write7279(DECODE0+1,digit[1]); //显示十位 digit[2]=0x80|(min%10); //计数百位 write7279(DECODE0+2,digit[2]); //显示百位 digit[3]=0x80|(min/10); //计数千位 write7279(DECODE0+3,digit[3]); //显示千位 digit[4]=0x80|(hour%10); //计数万位 write7279(DECODE0+4,digit[4]); //显示万位 digit[5]=hour/10; //计数十万位 write7279(DECODE0+5,digit[5]); } void write7279(unsigned char cmd, unsigned char dta) { send_byte (cmd); send_byte (dta); } unsigned char read7279(unsigned char command) { send_byte(command); return(receive_byte()); } void send_byte( unsigned char out_byte) { unsigned char i; cs=0; long_delay(); for (i=0;i<8;i++) { if (out_byte&0x80) { dat=1; } else { dat=0; } clk=1; short_delay(); clk=0; short_delay(); out_byte=out_byte*2; } dat=0; } unsigned char receive_byte(void) { unsigned char i, in_byte; dat=1; // 设置为输入状态 long_delay(); for (i=0;i<8;i++) { clk=1; short_delay(); in_byte=in_byte*2; if (dat) { in_byte=in_byte|0x01; } clk=0; short_delay(); } dat=0; return (in_byte); } void long_delay(void) { unsigned char i; for (i=0;i<0x30;i++); } void short_delay(void) { unsigned char i; for (i=0;i<8;i++); } // ********************* 延时 n*10ms ********************** void delay10ms(unsigned char time) { unsigned char i; unsigned int j; for (i=0;i<time;i++) { for(j=0;j<0x390;j++) { } } } /*时间调整程序*/ void time_adj() { if(set==0) //有键按下,判断按键时间 { delay10ms(200); //1s延时程序 if(set==0) //大于1s,进入时间设置 { ET0=0; TR0=0; //关定时器0 while(set==0) dirve(); //等键释放 // ET1=1;TR1=1; con=0xF3; //开定时器1,让调整位闪烁 write7279(BLINKCTL,0xF3); do { while(set!=0) dirve(); //等待按键 delay10ms(100); if(set!=0) //小于0.5s,进入分钟设置 { while(set==0) dirve(); //等待按键释放 sign=1; min++; if(min==60)min=0; //分钟加1 dirve(); } else sign=0; //大于0.5s,进入小时设置 }while(sign); while(set==0)dirve(); //等待按键释放 // con=0xCF; write7279(BLINKCTL,0xCF); do { while(set!=0) dirve(); //等待按键 delay10ms(100); if(set!=0) //小于0.5s,进入小时设置 { while(set==0) dirve(); //等待按键释放 sign=1; hour++; //小时加1 if(hour==24)hour=0; dirve(); } else sign=0; //大于0.5s,结束时间设置 }while(sign); // ET1=0;TR1=0; //关定时器1 ET0=1;TR0=1; //开定时器0 write7279(BLINKCTL,0xFF); } else //小于1s,进入省电模式 { ET0=1; TR0=1; //开定时器0 while(set!=0); //等待按键 do { dirve(); //有键按下,调显示程序消抖 }while(set!=0); //是干扰则继续循环 } while(set==0) dirve(); //等待按键释放 } else ; //无键按下,跳出按键扫描程序 }
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搞IC的那些年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值