基于511602的可连续运算计算器.docx

上传人:b****2 文档编号:23158945 上传时间:2023-05-08 格式:DOCX 页数:17 大小:37.19KB
下载 相关 举报
基于511602的可连续运算计算器.docx_第1页
第1页 / 共17页
基于511602的可连续运算计算器.docx_第2页
第2页 / 共17页
基于511602的可连续运算计算器.docx_第3页
第3页 / 共17页
基于511602的可连续运算计算器.docx_第4页
第4页 / 共17页
基于511602的可连续运算计算器.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

基于511602的可连续运算计算器.docx

《基于511602的可连续运算计算器.docx》由会员分享,可在线阅读,更多相关《基于511602的可连续运算计算器.docx(17页珍藏版)》请在冰豆网上搜索。

基于511602的可连续运算计算器.docx

基于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();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 教育学心理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1