基于单片机的智能计算器(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(); }
}