历史上的今天

今天是:2024年11月13日(星期三)

2019年11月13日 | 单片机做简易计算器源码(矩阵键盘输入+1602显示)

发布者:幸福家庭 来源: 51hei关键字:单片机  简易计算器  矩阵键盘  1602显示 手机看文章 扫描二维码
随时随地手机看文章

需要准备的元器件:
1.stc89c52rc (本源码使用的mcu)
2.1602液晶模块
3.4*4矩阵键盘 
单片机最小系统就可以,然后需要16个微动开关做成4*4矩阵键盘 。
         我用的lcd  io定义为sbit rw=P3^6;
                                       sbit rs=P3^5;
                                       sbit e=P3^4;觉得接线不方便的可以改 。
4*4矩阵键盘的定义  S16 S12 S8 S4分别是1 2 3 +
                                S15 S11 S7 S3分别是4 5 6 - -
                                S14 S10 S6 S2分别是7 8 9 *
                                S13 S9 S5 S1分别是0  CLR  =  /


附:4*4矩阵键盘的原理图,单片机最小系统,程序源码。
注:源码来自X宝的一家店铺
 
单片机源程序如下:

/* 实现两个数的运算,每个数的位数至少可以八位  */

#include                        

typedef unsigned char uint8;

typedef unsigned int uint16;


sbit rw=P3^6;

sbit rs=P3^5;

sbit e=P3^4;

sbit led=P3^7;


sbit beep=P2^0;

uint8 key,num;

uint8 fuhao;//定义具体的那个符号,是加减还是乘除。

uint8 flag;        //定义有没有按下符号键,这个是统称

long a,b,c,d;        //定义运算数据的第一个和第二个及等于的数变量

uint8 k; //定义小数点后面显示的位数

uint8 biao;


uint8 dat1[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据


void delay(uint16 i)

{

        while(i--);

}

void lcdwrc(uint8 c)

{

        delay(1000);

        rs=0;

        rw=0;

        e=0;

        P0=c;

        e=1;

        delay(1000);

        e=0;

}

void lcdwrd(uint8 dat)

{

        delay(1000);

        rs=1;

        rw=0;

        e=0;

        P0=dat;

        e=1;

        delay(1000);

        e=0;

        rs=0;

}


void lcdinit()

{

        delay(1500);

        lcdwrc(0x38);

        delay(500);

        lcdwrc(0x38);

        delay(500);

        lcdwrc(0x38);

        delay(500);

        lcdwrc(0x38);

        lcdwrc(0x08);

        lcdwrc(0x01);

        lcdwrc(0x06);

        lcdwrc(0x0c);

        key=0;

        num=0;

        flag=0;

        fuhao=0;

        a=0;

        b=0;

        c=0;

        d=0;

        biao=0;

        led=0;


}


void keyscan()

{

        P1=0xfe;   //令第一行为0,然后判断是哪一列按下

        if(P1!=0xfe)

        {

                delay(1000);

                if(P1!=0xfe)

                {

                        key=P1&0xf0;

                        switch(key)

                        {

                                case 0xe0: num=0;break;          //1

                                case 0xd0: num=1;break;          //2

                                case 0xb0: num=2;break;          //3

                                case 0x70: num=3;break;          //加

                        }

                }

                while(P1!=0xfe);

                if(num==0||num==1||num==2)         //确认第一行的数1,2,3

                {

                        if(flag==0)         //没有按下符号键

                        {

                                //led=1;

                                a=a*10+dat1[num];        

                        }

                        else

                        {

                                //led=1;

                                b=b*10+dat1[num];

                        }

                

                }

                if(num==3)

                {

                        //led=0;

                        flag=1;

                        fuhao=1;//加号+        

                }

                lcdwrd(0x30+dat1[num]);

        }



        P1=0xfd;                                //令第二行为0,判断是哪一列按下

        if(P1!=0xfd)

        {

                delay(1000);

                if(P1!=0xfd)

                {

                        key=P1&0xf0;

                        switch(key)

                        {

                                case 0xe0: num=4;break;          //4

                                case 0xd0: num=5;break;          //5

                                case 0xb0: num=6;break;          //6

                                case 0x70: num=7;break;          //减—

                        }        

                }

                while(P1!=0xfd);

                if(num==4||num==5||num==6)

                {

                        if(flag==0)         //没有按下符号键

                        {

                                //led=1;

                                a=a*10+dat1[num];        

                        }

                        else

                        {

                                //led=1;

                                b=b*10+dat1[num];

                        }                        

                }

                else

                {

                        flag=1;

[1] [2] [3] [4]
关键字:单片机  简易计算器  矩阵键盘  1602显示 引用地址:单片机做简易计算器源码(矩阵键盘输入+1602显示)

上一篇:完美搞定keil error C100: unprintable character 0xA3 skipped
下一篇:温度监控器单片机设计

推荐阅读

美国中期选举落定,民主党重掌众议院。美国政治生态的气候变化,正在一个中国商人的产业上方逐渐形成云层。这个商人,便是台湾首富郭台铭。        郭董在美国的生意前途难料         去年7月份,富士康董事长郭台铭宣布将在美国威斯康辛州投资100亿美元建设一座液晶面板生产工厂,并因此获得时任威斯康辛州长沃克“这是一个伟大的商人”...
能量转换效率是一个重要的指标,各制造商摩拳擦掌希望在95%的基础上再有所提升。为了实现这一提升,开始逐渐采用越来越复杂的转换拓扑,如移相全桥(PSFB)和LLC变换器。而且二极管将逐渐被功耗更低的MOSFET所取代,宽带隙(WBG)器件更是以其惊人的开关速度被誉为未来的半导体业明珠。然而,最终用户要放眼全局,更关心的是整个系统或流程的效率,即在履...
据外媒computerworld报道,Google的自制处理器可能会在几个月内开始出现在Pixel产品中,这可能会对设备的发展产生有意义的变化。他们表示,芯片是智能手机中很重要的部分,它是我们倍受宠爱的移动设备的心脏,也拥有很高的技术含量。在他们看来,谷歌自定义的Pixel芯片的已成为人们首要考虑的问题,其原因有两个:首先,整个苹果公司发生了一场具有魔力和...
11月12日,鸿海精密披露了第三季度业绩,受益于iPhone13系列机型的强劲需求,该公司当期业绩超出市场预期。数据显示,鸿海精密第三季度实现净利润370亿元新台币(约合13亿美元),高于分析师平均预期的324亿元新台币。销售额为1.4万亿元新台币,创历史新高。值得关注的是,鸿海精密表示,随着消费电子和计算业务的下滑,公司第四季度业绩同比将出现下滑。...

史海拾趣

问答坊 | AI 解惑

芯片封装技术简述

【来源:电子技术信息网】 自从美国Intel公司1971年设计制造出4位微处a理器芯片以来,在20多年时间内,CPU从Intel4004、80286、80386、80486发展到Pentium和PentiumⅡ,数位从4位、8位、16位、32位发展到64位;主频从几兆到今天的400MHz以上 ...…

查看全部问答∨

3G LTE新兴技术

在3GPP中,3G LTE的正式名称是3G Long Term Evolution(LTE),即3GPP长期演进(LTE)项目。       3GPP长期演进(LTE)项目是近两年来3GPP启动的最大的新技术研发项目,以OFDM/FDMA为核心的技术,与其说是3G技术的“演进”(evolution) ...…

查看全部问答∨

samsung2451下的wince6.0速度比wince5.0慢问题

最近在samsung2451下跑wince6.0,通过播放器发现明显比wince5.0慢很多,不知是wince6.0本身比wince5.0慢,还是其它什么原因?…

查看全部问答∨

负反馈不能产生自激振荡?

模电书上说在负反馈放大电路中,输入信号为零时,因为某种电扰动(如合闸通电),其中含有频率为f0的信号,使得AF的附加相移达到180°或-180°,@负反馈变成了正反馈,如果|AF|>1,则产生了自激振荡。我不明白的是,如果@处条件不成立,也就是不 ...…

查看全部问答∨

使用 LM Flash Programer 下载程序出错

使用 LM Flash Programer 下载程序 错误编号1 [ 本帖最后由 Study_Stellaris 于 2011-9-19 16:52 编辑 ]…

查看全部问答∨

89美金FPGA开发板申请

我想在FPGA世界里遨游,…

查看全部问答∨

adc时钟

adc时钟里面有个uclk,是指哪个时钟?还有他的采样周期怎么算,shot哪个怎么算  谢谢…

查看全部问答∨

【C2000 LaunchPad】单相交流电压+电流表__工程创建篇

总贴位置:https://bbs.eeworld.com.cn/viewthread.php?tid=369113&page=1&extra=page%3D2#pid1466612         【C2000 LaunchPad】单相交流电压+电流表      以前一直用CCS3.3。最近装了个 ...…

查看全部问答∨

MSP430G2542可以支持多少个触摸按键?

如题,我看到一些资料说有的可以支持最多16个触摸按键,是普通的带中断的IO口充放电方式检测的,不知道2542能多少…

查看全部问答∨

攒人气!!晒晒DIY的ALTERA FPGA开发板

攒人气!!晒晒DIY的ALTERA FPGA开发板,希望得到大家指正…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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