单片机 > 单片机程序设计 > 详情

单片机做简易计算器源码(矩阵键盘输入+1602显示)

发布时间:2020-06-18 发布时间:
|

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



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C8051F020的UART