标题:
基于C51单片机计算器
[打印本页]
作者:
bsmn
时间:
2021-3-17 19:36
标题:
基于C51单片机计算器
功能:
可以对两个整数进行加减乘除运算。
计算器.png
(303.51 KB, 下载次数: 58)
下载附件
proteus图
2021-3-17 19:35 上传
程序:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar dis[]="0123456789+-*/=",K;
uint AA,BB;
long int CC;
uchar FH=0;
bit end=0;
sbit EN=P1^2;
sbit RS=P1^0;
sbit RW=P1^1;
void delay(uchar t)
{
uchar i;
while(t--)
for(i=0;i<123;i++);
}
void wcmd(uchar cmd)
{
RS=0;
RW=0;
P0=cmd;
delay(5);
EN=1;
delay(5);
EN=0;
delay(5);
}
void wdat(uchar dat)
{
RS=1;
RW=0;
P0=dat;
delay(5);
EN=1;
delay(5);
EN=0;
delay(5);
}
void init()
{
EN=0;
wcmd(0x06);
delay(5);
wcmd(0x38);
delay(5);
wcmd(0x0e);
delay(5);
wcmd(0x01);
delay(5);
}
void cal() //计算
{ long int temp;char a[12],i,j;
switch(FH)
{
case 1:CC=AA+BB;break;
case 2:if(AA>=BB)CC=AA-BB;else {wdat('-');CC=BB-AA;}break;
case 3:CC=AA*BB;break;
case 4:CC=AA/BB;break;
}
temp=CC;
for(j=0;temp!=0;j++)
{
a[j]=temp%10;
temp=temp/10;
}
for(i=j-1;i>=0;i--)
wdat(a[i]+'0');
AA=BB=CC=FH=0;
end=1;
}
uchar select()
{
uchar ccode,rcode;
P3=0xf0;
if((P3&0xf0)!=0xf0)
{
delay(10);
if((P3&0xf0)!=0xf0) //去抖动误触后再次检测
{
rcode=0xfe; //逐行扫描,从1.0开始
while((rcode&0x10)!=0)
{
P3=rcode;
if((P3&0xf0)!=0xf0)
{
ccode=(P3&0xf0|0x0f);
while((P3&0xf0)!=0xf0);//等待按键放开
return ((~rcode)+(~ccode)); //返回键
}
else
rcode=(rcode<<1)|0x01;
}
}
}
return 0;
}
void key_deal(unsigned char key)
{
if(key!=0)
{ if(end==1)
{wcmd(0x01);end=0;}
switch(key)
{
case 0x11: K=7; break;
case 0x21: K=8; break;
case 0x41: K=9; break;
case 0x81: K=15;FH=0;AA=BB=CC=0;wcmd(0x01);break;//
case 0x12: K=4; break;
case 0x22: K=5; break;
case 0x42: K=6; break;
case 0x82: K=12;FH=3; break;// *
case 0x14: K=1; break;
case 0x24: K=2; break;
case 0x44: K=3; break;
case 0x84: K=13;FH=4; break;// /
case 0x18: K=10;FH=1; break;// +
case 0x28: K=0; break;
case 0x48: K=11;FH=2;break;// -
case 0x88: K=14;wdat(dis[K]);cal();break;//=
default: break; //不是以上数据时,跳出
}
if(K<14)
{
wdat(dis[K]);
}
if(K<10)
{
if(FH==0)
{
AA=AA*10+K;
}
else
{
BB=BB*10+K;
}
}
}
}
void main()
{
uchar key;
init();
wcmd(0x80);
while(1)
{
key=select();
key_deal(key);
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1