51单片机LCD液晶屏按键电子时钟的设计

发布者:脑洞飞翔最新更新时间:2021-03-02 来源: eefocus关键字:51单片机  LCD液晶屏  按键电子时钟 手机看文章 扫描二维码
随时随地手机看文章

液晶屏为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_();


}


关键字:51单片机  LCD液晶屏  按键电子时钟 引用地址:51单片机LCD液晶屏按键电子时钟的设计

上一篇:51单片机对LCD1602液晶的驱动设计
下一篇:基于C51单片机实现汽车座椅自动控制系统的软硬件设计

推荐阅读最新更新时间:2024-11-10 11:10

51单片机38译码器实现动态数码管控制
51单片机38译码器实现动态数码管控制 代码如下: #include REGX51.H void delay(void) //延时函数 { unsigned char i, j; for (i=0;i 10;i++) { for(j=0;j 10;j++); } } void main(void) { //译码后的选位数组 unsigned char yimaweima ={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7}; //段码数组 unsigned char duanma ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7
[单片机]
<font color='red'>51单片机</font>38译码器实现动态数码管控制
51单片机—红外遥控
- 什么是红外遥控 红外遥控系统主要由红外发射装置和红外接收装置构成。 红外发射装置主要由键盘电路、红外编码芯片、电源和红外发射电路组成(比如遥控器),如图: 红外接收装置主要由红外接收电路、红外解码芯片、电源和应用电路组成,在单片机开发板上有红外接收电路,而且单片机充当解码芯片。 - 红外信号是怎么传输的 人的眼睛能看到的可见光按波长从长到短排列依次为:红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.72微米,红外遥控就是利用波长为0.76至1.5微米之间的近红外线来传送控制信号的。 红外信号的发射由红外发射电路中的红外发光二极管完成,通常情况下为了提高抗干扰能力与降低电源消耗,遥控器将遥控信号(二进制
[单片机]
<font color='red'>51单片机</font>—红外遥控
51单片机LCD1602液晶的驱动设计
51单片机——LCD1602 1、1602液晶读写时序 (1)、读状态 RS=L,R/W=H,E=H。(判断忙完毕后释放总线) (2)、读数据 RS=H,R/W=H,E=H。 (3)、写指令 RS=L,R/W=L,D0~D7=指令码,E=高脉冲 (4)、写数据 RS=H,R/W=L,D0~D7=数据,E=高脉冲 2、液晶显示驱动文件 #include #define LCD1602_DB P0 sbit LCD1602_RS = P1 ^ 0; sbit LCD1602_RW = P1 ^ 1; sbit LCD1602_E = P1 ^ 5; /* 等待液晶准
[单片机]
<font color='red'>51单片机</font>对<font color='red'>LCD</font>1602液晶的驱动设计
40-基于51单片机直流电机PWM调速设计
具体实现功能 系统由STC89C52单片机、LCD1602液晶显示屏、霍尔测速传感器、3V直流电机、按键模块构成。 具体功能: 1、采用霍尔传感器非接触式测电机转速; 2、LCD1602液晶显示当前的转速(单位为转/分(RPM))和当前的PWM占空比0~100%; 3、电机转速可以通过按键调整,也可以开始暂停,正转和反转; 4、按键可实现加速、减速、正转、反转、开始/暂停等功能。 使用说明: 液晶屏第一行显示电机转速,第二行显示占空比,占空比数值越大,电机转速越快。 系统一共有6个按键,单片机附近的独立按键是系统的复位按键,按下单片机会复位。 下面一排是控制按键: 1键:加速键,可以短按,占
[单片机]
40-基于<font color='red'>51单片机</font>直流电机PWM调速设计
51单片机实验8:led点阵(1):点亮一个点
开发板led点阵模块电路图如下: 74HC595:74HC595是一个8位串行输入、并行输出的位移缓存器。芯片第11角为数据输入时钟线,上升沿有效。芯片第12脚为输出存储器锁存时钟线,上升沿有效。芯片第13脚为输出有效(低电平)。芯片第14脚为串行数据输入。 为表示出输入74HC595的8位二进制数,开发板加入了led模块(图一中绿色所示)。若要使led发光,则需将JP595接vcc。 OE为输出有效控制端,低电平有效,所以务必将JOE短接片短接到GND端。 _nop_();函数为延时一个机器周期,所对应头文件为intrins.h #include reg52.h #include intrins.h #
[单片机]
<font color='red'>51单片机</font>实验8:led点阵(1):点亮一个点
51单片机晶振疑难问题全解
回首当年,在初学51单片机的时候,总是伴随很多有关与晶振的问题,其实晶振就是如同人的心脏,是血液的是脉搏,把单片机的晶振问题搞明白了,51单片机的其他问题迎刃而解…… 今天大侠把自己当年学习51单片机有关晶振的问题一并总结出来,希望对初学51的童鞋来说能有帮助。 一,为什么51单片机爱用11.0592MHZ晶振? 其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。 其二:用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.059
[单片机]
24-基于51单片机的4乘4计算器设计
具体实现功能 系统由STC89C52单片机+4乘4按键模块+LCD1602液晶显示屏+电源构成。 具体功能: 利用输入采用4×4矩阵键盘,可以进行加、减、乘、除等几种数字运算,并在LCD1602上显示操作过程及结果。 设计背景 计算器的市场需求较大,应用范围广泛,任何一个办公地点不可缺少的都需要计算器,常见的计算器有:算术型计算器,可进行加、减、乘、除等简单的四则运算。科学型计算器,可进行乘方、开方、指数、对数等方面的运算。程序计算器,可以编程序,把较复杂的运算步骤贮存起来,进行多次重复的运算。简易计算器应用更为广泛,将其设计的更加具有市场竞争力是完全有必要的。我国计算器已经有了很成熟的技术,这里推广的是新观念,通过实
[单片机]
24-基于<font color='red'>51单片机</font>的4乘4计算器设计
MCS-51单片机的结构及特点
单片机(MICROCONTROLLER,又称微控制器)是在一块硅片上集成了各种部件的微型机算计,这些部件包括中央处理器CPU、数据存贮器RAM、程序存贮器ROM、定时器/计数器和多种I/O接口电路。 MCS-51单片机的基本结构如图所示。 51系列单片机结构特点: l 8位CPU; l 片内振荡器及时钟电路; l 32根I/O线; l 外部存贮器寻址范围ROM、RAM各64K; l 3个l6位的定时器/计数器; l 5个中断源,2个中断优先级; l 全双工串行口; l 布尔处理器。
[单片机]
MCS-<font color='red'>51单片机</font>的结构及特点
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved