基于511602的可连续运算计算器.docx
《基于511602的可连续运算计算器.docx》由会员分享,可在线阅读,更多相关《基于511602的可连续运算计算器.docx(17页珍藏版)》请在冰豆网上搜索。
基于511602的可连续运算计算器
#include
#include
#include
#include
#include
#include"LCD1602.h"
#defineucharunsignedchar
uchark=0,result1;
voidshortdelay(uchari)//短延时
{
for(;i>0;i--);
}
//长延时
voidlongdelay(uinti)
{
uintj;
for(;i>0;i--)
{for(j=100;j>0;j--);}
}
//延时程序
voiddelay(inti)
{intj;
for(;i>0;i--)
for(j=0;j<100;j++);
}
//初试状态
voidio_init()
{P1=0xff;
}
//?
---------------------------键盘扫描部分-----------------------------//
unsignedcharkey_scan()
{unsignedcharkey;
unsignedchartemp;
uintflag;
io_init();
P1=0xf0;
flag=0;
loop:
temp=P1^0xf0;
while(temp)
{
P1=0xfe;
delay
(1);
if((P1&0xfe)!
=0xfe)
switch(P1)
{
case0xee:
key=0x11;flag=1;break;//读7键和值
case0xde:
key=0x12;flag=1;break;
case0xbe:
key=0x13;flag=1;break;
case0x7e:
key=0x14;flag=1;break;//读除键的值
}
if(flag)
gotoexit;
else
P1=0xfd;
delay
(1);
if((P1&0xfd)!
=0xfd)
switch(P1)
{
case0xed:
key=0x21;flag=1;break;
case0xdd:
key=0x22;flag=1;break;
case0xbd:
key=0x23;flag=1;break;
case0x7d:
key=0x24;flag=1;break;//读4到乘的键值
}
if(flag)
gotoexit;
else
P1=0xfb;
delay
(1);
if((P1&0xfb)!
=0xfb)
switch(P1)
{
case0xeb:
key=0x31;flag=1;break;
case0xdb:
key=0x32;flag=1;break;
case0xbb:
key=0x33;flag=1;break;
case0x7b:
key=0x34;flag=1;break;//读1到减的键值
}
if(flag)
gotoexit;
else
P1=0xf7;
delay
(1);
if((P1&0xf7)!
=0xf7)
switch(P1)
{
case0xe7:
key=0x41;flag=1;break;//后退
case0xd7:
key=0x42;flag=1;break;//0
case0xb7:
key=0x43;flag=1;break;//等于
case0x77:
key=0x44;flag=1;break;//加
}
exit:
returnkey;
}
if(temp==0)
gotoloop;
}
//---------------------------------键盘扫描完--------------------------------------------//
//---------------------------------显示初始化?
----------------------------------------//
//P0口初始化
voidinitpindata(biti)
{
if(i==1)pindata=0xff;
elsepindata=0X00;
}
//寄存器选择信号
voidsetRS(biti)
{
if(i==1)pinRS=1;
elsepinRS=0;
}
//读写操作控制
voidsetRW(biti)
{
if(i==1)pinRW=1;
elsepinRW=0;
}
//使能信号
voidsetE(biti)
{
if(i==1)pinE=1;
elsepinE=0;
}
//读BF以及AC的值
uintread_BF_AC()
{
uinttemp;
initpindata
(1);
setRS(0);
setRW
(1);
setE
(1);
shortdelay
(1);
temp=pindata;
shortdelay(10);
setE(0);
return(temp);
}
//判忙
bitstatuscheck()
{
return((bit)(read_BF_AC()&0x80));
}
//写指令函数
voidwriteinstruc(uintinstruc)
{
while(statuscheck());
initpindata(0);
setRS(0);
setRW(0);
setE(0);
pindata=instruc;
//shortdelay
(1);
setE
(1);
shortdelay(10);
setE(0);
}
//写数据到RAM
voidwritedata(uintdata1)
{
initpindata(0);
setRS
(1);
setRW(0);
setE(0);
pindata=data1;
setE
(1);
shortdelay(10);
setE(0);
}
//从RAM中读数据函数
uintreaddata(void)
{
uinttemp;
initpindata
(1);
setRS
(1);
setRW
(1);
setE
(1);
shortdelay
(1);
temp=pindata;
shortdelay(10);
setE(0);
return(temp);
}
//显示程序X为行号,Y为列号,date为要显示的数据
voiddispcharacter(intx,uinty,uintdata1)
{
uinttemp;
while(statuscheck());
temp=y&0x0f;
x&=0x01;
if(x)temp|=0x40;
setDDRAM_Add(temp);
writedata(data1);
//writedata(data1);
}
//LCD复位函数
voidLCDreset()
{
clearscreen();
cursorreturn();
}
//LCD初始化
voidinitLCD()
{
LCDreset();
inputmode(0x06);//增量方式,不移位
dispcontrol(0x0c);//显示开,光标关,闪烁关
functionset(0x38);//8位,2行,5*7
}
//-----------------------------------准备工作完成-----------------------------------//
//-----------------------------------计算器-----------------------------------------//
compute(charkey1,i)
{
signedcharm,n,c,act;
longintnum1,num2,result;
signedcharstr[4][4]={{'7','8','9','/'},
{'4','5','6','*'},
{'1','2','3','-'},
{'c','0','=','+'}};
signedcharstr1[11],string1[2];
m=(key1&0xf0);
m=m/16;
m=m-1;
n=key1&0x0f;
n=n-1;
c=str[m][n];
sprintf(string1,"%c",c);
strcat(str1,string1);
if((c=='+')||(c=='-')||(c=='*')||(c=='/'))
{
act=c;
num1=atoi(str1);
memset(str1,0,11);
memset(string1,0,2);
}
if(c=='=')
{
num2=atoi(str1);
switch(act)
{
case'+':
{if(k==0)
{result=num1+num2;k++;break;}
else
{result+=num2;k++;break;}
}
case'-':
{if(k==0)
{result=num1-num2;k++;break;}
else
{result-=num2;k++;break;}
}
case'*':
{if(k==0)
{result=num1*num2;k++;break;}
else
{result*=num2;k++;break;}
}
case'/':
{if(k==0)
{result=num1/num2;k++;break;}
else
{result/=num2;k++;break;}
}
}
}
if(c=='c')
{
act=0;
num1=str1[0];
num1=str1[8];
memset(str1,0,11);
memset(string1,0,2);
num1=str1[0];
num1=str1[8];
k=0;
}
longdelay(350);
switch(key1)//显示部分
{case0x11:
dispcharacter(0,i,'7');i++;break;
case0x12:
dispcharacter(0,i,'8');i++;break;
case0x13:
dispcharacter(0,i,'9');i++;break;
case0x14:
dispcharacter(0,i,'/');i++;break;
case0x21:
dispcharacter(0,i,'4');i++;break;
case0x22:
dispcharacter(0,i,'5');i++;break;
case0x23:
dispcharacter(0,i,'6');i++;break;
case0x24:
dispcharacter(0,i,'*');i++;break;
case0x31:
dispcharacter(0,i,'1');i++;break;
case0x32:
dispcharacter(0,i,'2');i++;break;
case0x33:
dispcharacter(0,i,'3');i++;break;
case0x34:
dispcharacter(0,i,'-');i++;break;
case0x41:
clearscreen();break;
case0x42:
dispcharacter(0,i,'0');i++;break;
case0x43:
dispcharacter(0,i,'=');i++;
m=result/10000;
result1=result%10000;
if(m!
=0||result==0)
{
n=0;
m=m+'0';
dispcharacter(0,i,m);i++;
}
m=result1/1000;
result1=result1%1000;
if(m!
=0||n==0)
{
m=m+'0';
n=0;
dispcharacter(0,i,m);i++;
}
m=result1/100;
result1=result1%100;
if(m!
=0||n==0)
{
m=m+'0';
n=0;
dispcharacter(0,i,m);i++;
}
m=result1/10;
result1=result1%10;
if(m!
=0||n==0)
{
m=m+'0';
n=0;
dispcharacter(0,i,m);i++;
}
m=result1;
if(m!
=0||n==0)
m=m+'0';
dispcharacter(0,i,m);i++;break;
case0x44:
dispcharacter(0,i,'+');i++;break;
}
return(i);
}
//---------------------------------------------------------------------------------//
//-------------------------------------主函数---------------------------------------//
voidmain()
{
charkey1,i;
start:
initpindata(0);
P2=0X00;
initLCD();
i=0;
scan:
key1=key_scan();
i=compute(key1,i);
if(key1==0x41)
gotostart;
else
gotoscan;
}
#defineuintunsignedint
#defineucharunsignedchar
sbitpinRS=P2^0;
sbitpinRW=P2^1;
sbitpinE=P2^2;
#definepindataP0
#defineclearscreen()writeinstruc(0x01)
#definecursorreturn()writeinstruc(0x02)
#defineinputmode(temp)writeinstruc(temp)
//temp取值如下:
//0x04:
减量方式,不移位
//0x05:
减量方式,移位
//0x06:
增量方式,不移位
//0x07:
增量方式,移位
#definedispcontrol(temp)writeinstruc(temp)
//temp取值如下:
//0x08:
显示关,光标关,闪烁关
//0x0c:
显示关,光标关,闪烁关
//0x0d:
显示开,光标关,闪烁开
//0x0e:
显示开,光标开,闪烁关
//0x0f:
显示开,光标开,闪烁开
#definedispshift(temp)writeinstruc(temp)
//temp取值如下:
//0x10:
光标左移
//0x14:
光标右移
//0x18:
显示整体左移
//0x1c:
显示整体右移
#definefunctionset(temp)writeinstruc(temp)
//temp取值如下:
//0x20:
4位,1行,5*7
//0x24:
4位,1行,5*10
//0x28:
4位,2行,5*7
//0x2c:
4位,2行,5*10
//0x30:
8位,1行,5*7
//0x34:
8位,1行,5*10
//0x38:
8位,2行,5*7
//0x3c:
8位,2行,5*10
#definesetCGRAM_Add(address)writeinstruc(0x40|address)
#definesetDDRAM_Add(address)writeinstruc(0x80|address)//短延时
//voidshortdelay(uchari);
//长延时
//voidlongdelay(uinti);
//P2口初始化
//voidinitP2(biti);
//寄存器选择信号
//voidsetRS(biti);
//读写操作控制
//voidsetRW(biti);
//使能信号
//voidsetE(biti);
//读BF以及AC的值
//uintread_BF_AC();
//判忙
//bitstatuscheck();
//写指令函数
//voidwriteinstruc(uintinstruc);
//写数据到RAM
//voidwritedata(uintdata1);
//从RAM中读数据函数
//uintreaddata(void);
//显示程序X为行号,Y为列号,date为要显示的数据
//voiddispcharacter(intx,uinty,uintdata1);
//LCD复位函数
//voidLCDreset();