51单片机LCD液晶屏按键电子时钟的设计
21ic 2025-07-11

液晶屏为JM12864或FYD12864(带字库),我用这两种型号的屏没问题, 4行*8列汉字=32 串行通信 接/口P1.5--P1.7,可根据你的电路修改相应的接口。


#include

#define uchar unsigned char

voidLCD_ini();

void ascii_change(void);

void delay();

void wri_add(uchar com);

void wri_dat(uchar com1);

void shan(void);

void disp();

void tkey(void);

sbit cs=P1^7;

sbit sid=P1^6;

sbit sclk=P1^5;

bit flag=1;

uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态

uchar data cLOCk[3]={23,45,12};

uchar code clockname[10]={“北京时间:”};

uchar data num[6];

/*******主程序*************/

void main()

{

lcd_ini();

count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒

TMOD=0x01;

TL0=0XB0;

TH0=0X3C;

EA=1;

ET0=1;

IT0=1;

EX0=1;

TR0=1;

while(1)

{

back:ascii_change();

disp();

delay();

if(flag==1)

goto back;

tkey();

shan();

delay();

}

}

/****lcd初始化*******/

void lcd_ini()

{

wri_add(0x30);

delay();

wri_add(0x0c);

delay();

wri_add(0x01);

delay();

wri_add(0x06);

delay();

}

/********定时程序*************/

voidtimer1() interrupt 1 using 2

{

TL0=0XB0;

TH0=0X3C;

count--;

if(count==0)

{

count=10;

clock[2]++;//秒//

}

else

goto out;

if(clock[2]==60)

{

clock[2]=0;

clock[1]++;//分//

}

if(clock[1]==60)

{

clock[1]=0;

clock[0]++;

}

if(clock[0]==24)//时//

clock[0]=0;

out:_nop_();

}

/*******十位个位转换成ASCII码************/

void ascii_change(void)

{

num[5]=clock[2]-(clock[2]/10)*10+0x30;

num[4]=clock[2]/10+0x30;

num[3]=clock[1]-(clock[1]/10)*10+0x30;

num[2]=clock[1]/10+0x30;

num[1]=clock[0]-(clock[0]/10)*10+0x30;

num[0]=clock[0]/10+0x30;

}

/********廷时程序*************/

void delay()

{

uchar i,j;

for (i=250;i》0;i--)

for (j=250;j》0;j--);

}

/*****Write address*********/

void wri_add(uchar com)

{

uchar i,j,k;

cs=0;

cs=1;

dat=0xf8;

for(i=1;i《=8;i++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat《《1;

}

dat=com;

dat=dat&0xf0;

for(j=1;j《=8;j++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat《《1;

}

dat=com;

dat=_cror_(dat,4);// 此为高低四位交换

dat=dat&0xf0;

for(k=1;k《=8;k++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat《《1;

}

}

/*********Write data*************/

void wri_dat(uchar com1)

{

uchar i,j,k;

cs=0;

cs=1;

dat=0xfa;

for(i=1;i《=8;i++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat《《1;

}

dat=com1;

dat=dat&0xf0;

for(j=1;j《=8;j++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat《《1;

}

dat=com1;

dat=_cror_(dat,4);// 此为高低四位交换

dat=dat&0xf0;

for(k=1;k《=8;k++)

{

sid=(bit)(dat&0x80);

sclk=0;

sclk=1;

sclk=0;

dat=dat《《1;

}

}

/******display program***********/

void disp()

{

uchar i,k=0;

wri_add(0x80);

for (i=1;i《=9;i++)

wri_dat(clockname[i-1]);

wri_add(0x90);

for (i=1;i《=6;i++)

{

k++;

if(k==3||k==5)

wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);

}

}

/*******闪烁程序*************************/

void shan(void)

{

uchar i,k=0;

wri_add(0x90);

if(f==1)

{

num[0]=‘ ’;

num[1]=‘ ’;

}

else

goto next;

for (i=1;i《=6;i++)

{

k++;

if(k==3||k==5)

wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);

}

goto return1;

next: if(f==2)

{

num[2]=‘ ’;

num[3]=‘ ’;

}

else

goto next1;

for (i=1;i《=6;i++)

{

k++;

if(k==3||k==5)

wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);

}

goto return1;

next1: if(f==3)

{

num[4]=‘ ’;

num[5]=‘ ’;

}

else

goto return1;

for (i=1;i《=6;i++)

{

k++;

if(k==3||k==5)

wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);

}

return1:_nop_();

}

/*******外部中断***********/

void intr0() interrupt 0 using 2

{

flag=~flag;//判断是否闪烁位//

TR0=~TR0; //闪关定时否则开定时

f=1;

}

/**********按键程序************/

void tkey(void)

{

uchar judcekey;

judcekey=P1&0x0f;

if(judcekey==0x0f)

goto return2;

/*******移位键*********/

if (judcekey==0x0e)

f++;

if (f==4)

f=1;

/**********加一键*********/

if(judcekey==0x0d)

{clock[f-1]++;}

if (f==1)

{ if (clock[f-1]==24){

clock[f-1]=0;}

}

else{ if (clock[f-1]==60)

clock[f-1]=0;

}

/******减一键***********/

if(judcekey==0x0b)

{clock[f-1]--;}

if (f==1)

{ if (clock[f-1]==0xff){

clock[f-1]=23;}

}

else

{ if (clock[f-1]==0xff)

clock[f-1]=59;

}

return2:_nop_();

}

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【7.24 深圳】2025国际AI+IoT生态发展大会/2025全球 MCU及嵌入式技术论坛


  • 相关技术文库
  • 电源
  • DC
  • AC
  • 稳压
  • 什么是pwm调光?pwm调光有何优点和注意事项?

    pwm,脉宽调制技术,在很多方面都有应用。为增进大家对pwm的认识和了解,本文将对pwm在led调光方面的应用予以介绍。本文的主要内容在于介绍如何实现pwm调光、pwm调光优点、pwm调光需要注意的事项。如果你对pwm具有...

    前天
  • 什么是整流器?整流器的工作原理是什么?

    整流器是常用设备之一,通过整流器,我们能够对电流类型加以转换。为增进大家对整流器的认识,本文将对整流器、整流器的工作原理予以介绍。如果你对整流器或者整流器的相关知识具有兴趣,不妨和小编继续往下阅读哦...

    07-09
  • 干式变压器有何优缺点?干式变压器的应用+保护方式介绍

    干式变压器具备很强的应用意义,为增进大家对干式变压器的认识,本文将基于三点介绍干式变压器:1.干式变压器的优缺点,2.干式变压器的应用领域,3.干式变压器的保护方式。如果你对干式变压器具有兴趣,不妨继续往...

    07-09
  • 你了解干式变压器的冷却结构吗?干式变压器如何冷却?

    干式变压器在工业中具有很多的应用场景,对于干式变压器,我们有必要对它有所认识。为增进大家对干式变压器的了解程度,本文将基于两点介绍干式变压器:1.干式变压器的冷却结构,2.干式变压器的冷却方式介绍。如果...

    07-09
  • 干式变压器正常温度是多少?干式变压器有何安装规范?

    干式变压器是变压器类型之一,任何一款器件都有它的适用范围,干式变压器也不例外。为保证干式变压器的正常适用,本文将对干式变压器的正常温度予以介绍。此外,本文还将介绍干式变压器的安装规范。如果你对干式变...

    07-09
  • 为何要发展电源管理芯片?如何选择电源管理芯片?

    芯片的重要性不言而喻,我国目前在芯片方面的成就还未达到世界巅峰。但是,小编相信中国的芯片水平将会领先世界。为增进大家对芯片的了解,本文将对电源管理芯片予以解读。本文中,你将对电源管理芯片的发展必要性...

    07-08
  • 全方位了解存储,你知道的存储介质有哪些?

    存储是非常重要的技术,基于存储技术,我们可以将数据存储在存储设备上。那么对于存储设备而言,有哪些因素对它而言是十分重要的呢?其中一个,便是存储介质。为增进大家对存储的认识,本文将对存储介质予以介绍。如...

    07-07
  • 了解过分布式光伏逆变器吗?不同光伏逆变器有何优缺点?

    逆变器,已是一个老生常谈的话题。因此,就机械等相关专业的朋友,对于逆变器通常都较为了解。为增进大家对逆变器的认识,本文将对光伏逆变器、组串式逆变器、分布式逆变器等内容予以介绍。如果你对逆变器相关内容...

    07-07
  • 一步步了解检测技术,什么是声发射检测?

    检测的重要性不言而喻,我们通过检测,可以对很多电子器件进行检测,以判断电子器件是否存在一些缺陷。为增进大家对检测的认识,本文将对声发射检测技术予以介绍。如果你对检测技术具有兴趣,不妨同小编一起来阅读...

    07-07
  • 变压器规格型号容量

    一般常用变压器的型号可归纳如下 : 1、按相数分: (1)单相变压器:用于单相负荷和三相变压器组。 (2)三相变压器:用于三相系统的升、降电压。 2、按冷却方式分: (1)干式变压器:依靠空气对流进行自然冷却或增加风机冷却...

    07-04
  • 干式变压器有哪些分类?干式变压器性能特点介绍

    干式变压器是变压器类型之一,但是,很多朋友对干式变压器却并非十分了解。为增进大家对干式变压器的认识,本文将对干式变压器的分类、干式变压器的性能特点、干式变压器的应用领域予以介绍。如果你对干式变压器具...

    07-03
  • UPS电源内部结构解析,大佬带你看UPS电源防雷误区

    UPS电源,也就是我们常说的不间断电源。通常情况下,UPS电源都带有保护作用。为增加大家对UPS电源的认识,本文将对UPS电源的内部结构以及UPS电源的防雷误区予以介绍。如果你对UPS电源具有兴趣,不妨和小编一同往下...

    07-03
下载排行榜
更多
评测报告
更多
广告