历史上的今天
返回首页

历史上的今天

今天是:2025年02月28日(星期五)

正在发生

2021年02月28日 | 单片机液晶显示程序

2021-02-28 来源:eefocus

单片机液晶显示程序


硬件电路:51最小系统,没有采用总线方式,直接的I/O形式,包括矩阵键盘,1602液晶,一个数码管,LED4个,蜂鸣器等.


//单片机液晶秒表计算器完整修改版本


可以实现两种功能的切换,其他功能自行对照代码研究。4*4矩阵键盘,第一排前三列是实现小时分钟秒的加.第二排前三列是实现小时分钟秒的减.当然还可以通过设置矩阵键盘的键值,来实现加减乘除四则运算,由数码管显示参与运算的数字以及最终的运算结果


#include


#include


#include


#include


#include


#define uchar unsigned char


#define uint unsigned int


#define wc 0x8fff


#define wd 0xdfff


#define rc 0xbfff


void displayListChar(unsigned char X, unsigned char Y, uchar DData);


uchar dispbuf[]={''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'','':''};


uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,


0x92,0x82,0xf8,0x80,0x90,0x88,0x83,


0xc6,0xa1,0x86,0x8e,0x00


};


uchar second;


uchar temp1;


uchar minute;


uchar hour;


uint tcnt,g;


uchar suanfa;


bit flag2;


bit flag1=1;//////控制计算器还是液晶调整的状态灯


uint i=0,f,m,g,s,t;// for里的计数值,用于循环


// 用来标记按了什么,如+,-.*,或是/


sbit P2_0=P2^0;// 定义P2.0口用来,当计算值超过15时,P2.0所对应的灯闪几下


sbit P2_1=P2^1;// 定义P2.1口用来,当除数为0时,P2.1所对应的灯闪几下


sbit P2_2=P2^2;


sbit P2_3=P2^3;


uint num[4]={0}; //用于记录外面输入的数字


uint Tablenum;


sbit P3_4=P3^4;


sbit P3_5=P3^5;


void jieguo(void);


void SetTIme(uchar verify);


uchar kbscan(void);///键盘扫描


void Show_TIme(void);////显示时间


void SetTIme(uchar verify);//verify 在这里为调整的意思


uint transfor( uchar key1);


void delay400ms(void) ;


void delay200ms(void);


void delay5ms(void);


void delay_1s(void);


void dlms(void);


void dlms1(void)


{


uint g=20000;


while(--g); //延时100mS钟


}


void clr(void)


{


i=0;


suanfa=0;


Tablenum=0;


for(f=0;f<4;f++)


{


num[f]=0;


}


P2_0=1;


P2_1=1;


P2_2=1;


P2_3=0;


P3_4=0;


P3_5=1;


P0=0xc0;


P3_5=0;


}


//***************************************以下单片机液晶显示****************************************************


void waitLcd() //just wait unTIl 液晶不忙为止


{


char temp;


bit flag=1;


while(flag==1)


{


temp=XBYTE[rc];


if (temp>>7==0) flag=0;


P1=temp;


}


P1=0xff;


}


//just wait until 液晶不忙为止


void WriteCommand_Lcd(bit isCheck,char c)


{


if (isCheck==1) waitLcd();


XBYTE[wc]=c;


}


void writedata(char c)


{


waitLcd();


XBYTE[wd]=c;


}


void LcdInit()


{


delay5ms();


delay5ms();


delay5ms();


WriteCommand_Lcd(0,0x38); //三次显示模式设置,不检测忙信号


delay5ms();


WriteCommand_Lcd(0,0x38);


delay5ms();


WriteCommand_Lcd(0,0x38);


delay5ms();


WriteCommand_Lcd(1,0x38); //显示模式设置,开始要求每次检测忙信号,8位2行5*7


WriteCommand_Lcd(1,0x08); //关闭显示


WriteCommand_Lcd(1,0x01); //清显示


WriteCommand_Lcd(1,0x06); // 文字不动,光标右移


WriteCommand_Lcd(1,0x0C); // 显示开及光标设置


}


void displayListChar(unsigned char X, unsigned char Y, uchar DData)


{


Y &= 0x1;


X &= 0xF;


if (X <= 0xF)


{


Y &= 0x1;


X &= 0xF;


if (Y) X = 0x40;


X = 0x80;


WriteCommand_Lcd(0,X);


writedata(dispbuf[DData]);


}


}


//****************************************以上单片机液晶显示驱动*****************************************************


//*************************************************


//**********************************以下显示时间*****************************************************


void Show_Time(void)


{


displayListChar(0,0,hour/10);


displayListChar(1,0,hour%10);


displayListChar(2,0,10);


displayListChar(3,0,minute/10);


displayListChar(4,0,minute%10);


displayListChar(5,0,10);


displayListChar(6,0,second/10);


displayListChar(7,0,second%10);


}


//**********************************以上显示时间*****************************************************


void main(void)


{


TMOD=0x02; //置自动重装载模式


TH0=0x06; //设初值


TL0=0x06; //设初值


TR0=1; //开始计数


ET0=1; //开定时器/计数器


EA=1; //中断开


delay400ms();//启动等待,等LCM讲入工作状态


LcdInit(); //LCM初始化


P3_4=0;


P2_0=1;


P2_1=1;


P2_2=0;


P2_3=1;


P3_5=1;


P0=0xc0;


P3_5=0;


while(1)


{


uchar key;


key=kbscan();


dlms();


// 0(11100111 0xe7)


///*****************************以下是单片机液晶显示两种状态的切换********************


//***************************************************


if(key==0xe7)


{


dlms();


flag1=~flag1;


key=0x00;


if(flag1==1)


{


P2_0=1;


P2_1=1;


P2_2=0;///液晶状态灯


P2_3=1;


}


if(flag1==0)


{


P2_0=1;


P2_1=1;


P2_2=1;


P2_3=0;///计算器状态灯


}


dlms1();


}


///*****************************以上是单片机液晶显示两种状态的切换


推荐阅读

史海拾趣

EHC(ELECTRONICHARDWARE)公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。EHC公司深知这一点,因此一直将品质管理作为企业发展的重要战略。公司建立了完善的质量管理体系,从原材料采购到生产制造再到产品出厂,每一个环节都经过严格的把控。这种对品质的坚持和追求让EHC公司的产品在市场上赢得了广泛的信任和认可。

AIRPAX公司的发展小趣事

近年来,随着数字化技术的快速发展,AIRPAX也开始积极探索数字化转型之路。公司加大了对智能化、自动化生产线的投入,提高了生产效率和质量。同时,AIRPAX还积极利用大数据、云计算等先进技术,对客户需求和市场趋势进行深入分析,以更好地满足客户需求并推动创新发展。

这些故事只是AIRPAX发展历程中的一部分,它们展示了AIRPAX如何在技术、市场、环保和创新等多个方面取得了显著成就。然而,随着电子行业的不断发展和竞争的加剧,AIRPAX仍需继续努力,以保持其在电气保护领域的领先地位。

Abracon公司的发展小趣事

进入21世纪,AIRPAX开始积极拓展全球市场。通过与各国企业的合作与交流,AIRPAX的产品逐渐进入欧洲、亚洲等地区,服务于更多国家的客户。同时,AIRPAX还积极寻求与其他行业领先企业的战略合作,共同推动电气保护技术的发展。这些合作不仅提升了AIRPAX的品牌影响力,也为其带来了更多的商业机会。

Apacer公司的发展小趣事

在各大电子展会上,Apacer宇瞻科技也频繁亮相,展示其最新技术和产品。在某次台北世界贸易中心的展会上,宇瞻科技展示了一款高端DDR3内存,其频率高达1600MHz,带宽达到了惊人的12800MB/s。这一产品吸引了众多观众的关注,也进一步彰显了宇瞻科技在内存模组领域的领先地位。

这五个故事只是Apacer宇瞻科技发展历程中的一部分,但它们足以展现出公司从创立到崛起的艰辛与辉煌。在未来的发展中,相信宇瞻科技将继续凭借其卓越的技术实力和持续的创新精神,为电子行业的发展贡献更多力量。

Fairview Microwave Inc公司的发展小趣事

Fairview Microwave Inc公司成立于1992年,最初只是一个由几位工程师组成的小团队,他们致力于开发高质量的射频和微波组件。在当时,微波技术正逐渐在通信、雷达和卫星通信等领域得到广泛应用,但市场上缺乏高性能、可靠的组件供应商。Fairview Microwave看到了这个市场空白,决定从适配器、连接器和衰减器等基础组件入手,凭借精湛的技术和不断的创新,逐渐在行业内树立了良好的口碑。

Arctic Silicon Devices公司的发展小趣事

在电子行业的发展过程中,创新合作是推动产业进步的重要动力。Arctic Silicon Devices积极与高校、科研机构等合作,共同开展技术研发和人才培养。通过共享资源、互通有无,公司不仅获得了更多的创新灵感和技术支持,还推动了整个电子行业的技术进步和产业升级。

问答坊 | AI 解惑

S12单片机模块应用及程序下载调试

摘要:    本文对邀请赛选用的主控芯片MC9S12DG128单片机的一些外围接口模块作了介绍,包括功能上的描述和例程及初始化的过程,对一些参赛队伍中遇到的Flash锁死问题也提供了解决的方案。 关键词:    &nb ...…

查看全部问答>

PSD813F2在FPGA配置中的应用

摘要:可编程外围器件PSD应用于单片机系统后,简化了单片机外围电路的设计,增加了系统的可靠性;利用PSD与单片机组成的系统,通过计算机串口对FPGA进行实时在线编程、仿真和配置。 关键词:可编程外围器件(PSD) 在应用可编程(IAP) 可编程门阵 ...…

查看全部问答>

ARM Corte-M3内核微控制器快速入门与应用

[ 本帖最后由 小瑞 于 2009-12-1 09:27 编辑 ]…

查看全部问答>

怎么样在任务栏上显示PDA电量?

怎么样在任务栏上显示PDA电量?…

查看全部问答>

低价转让fpga开发板

1.jpg (22.51 KB) 2010-9-21 11:23 2.jpg (19.75 KB) 2010-9-21 11:23   ...…

查看全部问答>

EEWORLD联系贴

          大家好,我有个建议一直想说,又担心大家分歧太大,一直没说,不过思来想去,还是说出来让大家分析一下是否可行,众人拾材火焰高吗,         & ...…

查看全部问答>

2812 AD 转换问题

用2812的例程调试AD程序,能运行,就是得不到正确的结果。 我有以下几个问题: (1).  DEC2812进行AD转换时,输入信号怎么连接?ADCLO要接模拟地吗?开发板上ADCLO并没有与模拟地连接 (2)AD转换后的结果是12位,ADC转换结果缓冲寄存 ...…

查看全部问答>

哪位高手给讲讲定时器?

我现在用的是5502的板子,在板上UARTONCHIP测试程序中,GPT_Config  MyGptConfig {0,0,0,0,0,0x56c4,0x0003,0...}函数中的0x56c4,0x0003是怎样计算出来的?能不能把具体的计算过程告诉我?我对这个问题已经困惑很久了,查了很多的资料 ...…

查看全部问答>

机房监控

机房监控机房监控JCD-PSMS8.0监控项目:1、供配电监控市电输入交流监控三相电压、电流、有关功率、功率因数等;以及对配电柜内8个开关进行监控,可查看所监测配电 线路的参数。相应的参数应存有历史曲线,可查看该参数的历史曲线,可通过IE浏览器 ...…

查看全部问答>

这个是什么情况??

我的信息肿么变成这样了?好久就注册了啊?…

查看全部问答>