基于单片机的智能计算器(AT89C51、LCD1602、矩阵键盘)
想要更多项目私wo!!!
一、简介
此电路由AT89C51最小系统、LCD1602液晶显示模块和矩阵键盘模块组成。
二、执行效果
三、部分代码
/* S16 S12 S8 S4分别是123+S15 S11 S7 S3分别是456-S14 S10 S6 S2分别是789*S13 S9 S5 S1分别是0 CLR = /*//*想要更多项目私wo!!!*//* 实现两个数的运算,每个数的位数至少可以八位 */#include<reg52.h>#include"lcd.h"typedef unsigned char uint8;typedef unsigned int uint16;sbit led=P3^7;sbit beep=P2^0;uint8 key,num;uint8 fuhao;//定义具体的那个符号,是加减还是乘除。uint8 flag;//定义有没有按下符号键,这个是统称long a,b,c,d;//定义运算数据的第一个和第二个及等于的数变量uint8 k; //定义小数点后面显示的位数uint8 biao;void delay(uint16 i){while(i--);}void keyscan(){P1=0xfe; //令第一行为0,然后判断是哪一列按下if(P1!=0xfe){delay(1000);if(P1!=0xfe){key=P1&0xf0;switch(key){case 0xe0: num=0;break; //1case 0xd0: num=1;break; //2case 0xb0: num=2;break; //3case 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; //4case 0xd0: num=5;break; //5case 0xb0: num=6;break; //6case 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;fuhao=2;//带表减号}lcdwrd(0x30+dat1[num]);}P1=0xfb; //令第三行为0,判断哪一列按下if(P1!=0xfb){delay(1000);if(P1!=0xfb){key=P1&0xf0;switch(key){case 0xe0: num=8;break; //7case 0xd0: num=9;break; //8case 0xb0: num=10;break; //9case 0x70: num=11;break; //乘*}}while(P1!=0xfb);if(num==8||num==9||num==10){if(flag==0) //没有按下符号键{//led=1;a=a*10+dat1[num];}else{//led=1;b=b*10+dat1[num];}}else{flag=1;fuhao=3;//带表乘号*}lcdwrd(0x30+dat1[num]);}}void main(){lcdinit();while(1){keyscan();}}