历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-11-13 来源:51hei

需要准备的元器件:
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;

推荐阅读

史海拾趣

AD Semiconductor公司的发展小趣事

AD Semiconductor是一家专注于模拟和数字混合信号集成电路的设计、生产和销售的公司。以下是该公司发展的五个相关故事:

  1. 公司成立与初期发展: AD Semiconductor成立于1990年,总部位于美国马萨诸塞州。公司的创始人具有丰富的集成电路设计和制造经验,致力于开发高性能、高可靠性的模拟和数字混合信号芯片。初期,公司主要专注于功率管理、数据转换和信号处理等领域。

  2. 技术创新与产品推出: AD Semiconductor在技术创新方面取得了多项突破,不断推出具有领先性能的芯片产品。公司的产品涵盖了模拟转换器、运算放大器、数据采集系统、功率管理器等多个系列,广泛应用于通信、工业控制、汽车电子等领域。

  3. 市场拓展与国际化发展: 随着产品线的不断完善和市场认可度的提升,AD Semiconductor逐步拓展了国内外市场。公司在美国、中国、欧洲等地设立了销售和技术支持中心,与全球各地的客户建立了合作关系。通过与国际合作伙伴的合作,AD Semiconductor的产品远销至全球各地,赢得了广泛的市场认可。

  4. 并购与战略合作: 为了加强自身的技术实力和市场地位,AD Semiconductor进行了一系列的并购和战略合作。其中最重要的是2015年,AD Semiconductor收购了一家专注于RF和微波集成电路设计的公司,进一步拓展了在无线通信领域的业务布局。

  5. 持续创新与未来展望: AD Semiconductor致力于持续创新,不断推出符合市场需求的新产品和解决方案。公司将继续加强技术研发投入,提升产品性能和稳定性,以满足客户在不断变化的市场需求。未来,AD Semiconductor将继续致力于成为模拟和数字混合信号领域的领先企业,并为全球客户提供更加优质的产品和服务。

E-T-A [E-T-A Circuit Breakers]公司的发展小趣事

进入1950年代,E-T-A公司开始关注固态远程电源控制器(SSRPCs)的研发。这一创新技术为电气系统提供了更加可靠和高效的电源管理方案。公司投入大量资源进行研发,成功推出了多款固态远程电源控制器产品,这些产品在市场上获得了广泛认可,并为公司带来了可观的收益。

Crouzet公司的发展小趣事

Crouzet公司,这家以生产自控产品为主的跨国公司,于1921年正式成立。创立之初,Crouzet主要专注于自控产品的研发和生产,凭借其卓越的技术和创新能力,很快在市场中占据了一席之地。公司逐渐扩大生产规模,提升产品质量,赢得了客户的信赖。

General Dynamics SATCOM Technologies公司的发展小趣事

Crouzet一直致力于产品创新和技术研发。公司的产品线不断丰富,涵盖了自动控制元件、智能控制器、可编程逻辑控制器、触摸屏、测量传感器、模拟和数字电子元件等多种产品。这些产品广泛应用于汽车、化工、电力、机械、消费电子、空调和冷库、石油和天然气等多个行业,为客户提供了高效、可靠的自动化解决方案。

福斯特(FIRST)公司的发展小趣事
ESP系统通常采用CAN总线协议进行数据传输。CAN总线是一种广泛应用于汽车领域的串行通信协议,具有高速、可靠、抗干扰能力强等特点。
Cypress(赛普拉斯)公司的发展小趣事

Cypress公司成立于1982年,总部设在美国加州的San Jose。创业之初,公司专注于高速CMOS SRAM、EEPROM、PAL器件和TTL逻辑器件的设计和开发。这一时期,Cypress通过引入创新的技术和产品设计,在竞争激烈的电子芯片市场中逐渐崭露头角。公司凭借对技术的持续投入和积累,为未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

用Nokia 3310 液晶自制温度计

想像一下,如果有这么一个“裸体”温度计,就放在自己家里的书柜上,等朋友来了,一定会吸引不少眼光,你也可以借机炫耀一番。 不过放在家里的话,有可能曝光率不够高,那我们就随身携带好了,就像劳力士一样,经常“不经意”的掏出来看看:P ...…

查看全部问答>

大家一起晒晒示波器的美图吧~~~~

做个东西,就要做的精美,没有外表怎么成? 咱们可以晒晒示波器的美图,供坛子里做示波器的筒子们学学。 先抛个砖: …

查看全部问答>

STC12c5a单片机外扩flash,使用XBYTE读取flash的数据

我最近遇到一个问题,请教各位高手。 STC12c5a单片机,外扩flash,p0口复用为低8位地址线和8位数据位,p2为高8位地址线。 我使用XBYTE读取flash的数据,总有读错的情况发生。程序如下: ReadData=XBYTE[BankAddress];   _nop_(); & ...…

查看全部问答>

怎样设置ivt bluesoleil蓝牙局域网?

网线做的局域网我是能设的,但是想用蓝牙做,怎么设都不行,请教啦,…

查看全部问答>

硬盘的内部逻辑结构

   大家好,我最近在学习硬盘的逻辑结构时遇到了很大的麻烦。由于我从Google和百度上搜的资料太零散,太浅,学习不系统,导致对这方面的知识理解混乱。于是我想求助在这方面擅长的朋友,能否提供一些系统的资料,先行谢过了。…

查看全部问答>

转让南京万利51仿真器

本人有南京万利51仿真器一台. 8成新(用过一个多月). 欲转让给需要者. 仿真器见以下连接. http://www.manley.com.cn/chinese/ice/se52hu.htm 联系: littleliu97@sohu.com…

查看全部问答>

STM32用到的TFT屏幕资料及例程.欢迎补充

既然有人需要TFT屏 资料.放假在家也没什么事.整理一下自己手头有的吧.做个抛砖引玉.希望大家能吧自己方便分享的资料都上传上传~…

查看全部问答>

可以给推荐个这样的BOOST电路吗

求推荐这样一个BOOST电路。(不能外加电源)输入电压范围是17~170V,输出28V。由于这个范围太大,想进行两级变换,前级BOOST升压,将17~34V升到34V,后级将34~170降为28V。前端设计一个BOOST电路,当输入为17~34V时通过BOOST进行升压;当输入为34~1 ...…

查看全部问答>