最新单片机简易计算器C代码.docx
《最新单片机简易计算器C代码.docx》由会员分享,可在线阅读,更多相关《最新单片机简易计算器C代码.docx(20页珍藏版)》请在冰豆网上搜索。
最新单片机简易计算器C代码
单片机简易计算器C代码
*****************************************************************************/
#include
#include
#include
#defineucharunsignedchar
#defineDATA=P0
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;
/*----------------------------函数声明------------------------------*/
voiddelay(unsignedinti);
ucharkeyscan(void);
voidLCD_Init(void);
bitLCD_Busy(void);
voidLCD_Write_CMD(ucharcommand);
voidLCD_Write_DATA(uchardate);
/*----------------------------delay------------------------------*/
voiddelay(unsignedinti)//延时函数
{
while(i--);
}
/*----------------------------keyscan------------------------------*/
ucharkeyscan(void)//逐行扫描法
{
ucharH_line,L_line,Num=0;//行列值
P3=0x1e;//行线第一条为0
L_line=P1&0x1f;//读入列线值
if(L_line!
=0x1f)//先检测有无按键按下
{
delay(100);//去抖
L_line=P1&0x1f;//读入列线值
if(L_line!
=0x1f)
{
switch(L_line)
{
case0x0f:
Num='7';break;//7按下相应的键显示相对应的码值
case0x17:
Num='8';break;//8
case0x1b:
Num='9';break;//9
case0x1d:
Num='F';break;//F
case0x1e:
Num='+';break;//+
}
while(P1!
=0xff)//一次按键检测,松手跳出循环
{
H_line=P3&0x1f;
}
}
}
delay(50);
P3=0x1d;//行线第二条为0
L_line=P1&0x1f;//读入列线值
if(L_line!
=0x1f)//先检测有无按键按下
{
delay(100);//去抖
L_line=P1&0x1f;//读入列线值
if(L_line!
=0x1f)
{
switch(L_line)
{
case0x0f:
Num='4';break;//4按下相应的键显示相对应的码值
case0x17:
Num='5';break;//5
case0x1b:
Num='6';break;//6
case0x1d:
Num='E';break;//E
case0x1e:
Num='-';break;//-
}
while(P1!
=0xff)//一次按键检测,松手跳出循环
{
H_line=P3&0x1f;
}
}
}
delay(50);
P3=0x1b;//行线第三条为0
L_line=P1&0x1f;//读入列线值
if(L_line!
=0x1f)//先检测有无按键按下
{
delay(100);//去抖
L_line=P1&0x1f;//读入列线值
if(L_line!
=0x1f)
{
switch(L_line)
{
case0x0f:
Num='1';break;//1按下相应的键显示相对应的码值
case0x17:
Num='2';break;//2
case0x1b:
Num='3';break;//3
case0x1d:
Num='D';break;//D
case0x1e:
Num='*';break;//*
}
while(P1!
=0xff)//一次按键检测,松手跳出循环
{
H_line=P3&0x1f;
}
}
}
delay(50);
P3=0x17;//行线第四条为0
L_line=P1&0x1f;//读入列线值
if(L_line!
=0x1f)//先检测有无按键按下
{
delay(100);//去抖
L_line=P1&0x1f;//读入列线值
if(L_line!
=0x1f)
{
switch(L_line)
{
case0x0f:
Num='0';break;//0按下相应的键显示相对应的码值
case0x17:
Num='A';break;//A
case0x1b:
Num='B';break;//B
case0x1d:
Num='C';break;//C
case0x1e:
Num='/';break;///
}
while(P1!
=0xff)//一次按键检测,松手跳出循环
{
H_line=P3&0x1f;
}
}
}
delay(50);
P3=0x0f;//行线第五条为0
L_line=P1&0x1f;//读入列线值
if(L_line!
=0x1f)//先检测有无按键按下
{
delay(100);//去抖
L_line=P1&0x1f;//读入列线值
if(L_line!
=0x1f)
{
switch(L_line)
{
case0x0f:
Num='b';break;//b按下相应的键显示相对应的码值
case0x17:
Num='o';break;//o
case0x1b:
Num='h';break;//h
case0x1d:
Num='R';break;//R
case0x1e:
Num='=';break;//=号
}
while(P1!
=0xff)//一次按键检测,松手跳出循环
{
H_line=P3&0x1f;
}
}
}
while(Num!
=0)
returnNum;
}
/*-------------------------LCD_Init---------------------*/
voidLCD_Init(void)
{
EN=0;
LCD_Write_CMD(0x38);
delay(15);
LCD_Write_CMD(0x38);
delay(15);
LCD_Write_CMD(0x38);
delay(15);
LCD_Write_CMD(0x0d);
delay(15);
LCD_Write_CMD(0x06);
delay(15);
LCD_Write_CMD(0x01);
}
/*-------------------------LCD_Busy---------------------*/
bitLCD_Busy(void)
{
bitresult;
RS=0;//读指令
RW=1;
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P0&0x80);
EN=0;
returnresult;
}
/*----------------------LCD_Write_CMD----------------------------*/
voidLCD_Write_CMD(ucharcommand)
{
bitBusy_flag;
Busy_flag=LCD_Busy();
while(Busy_flag)
Busy_flag=LCD_Busy();//判
RS=0;
RW=0;
EN=1;
P0=command;
delay(100);
EN=0;
}
/*----------------------LCD_Write_DATA----------------------------*/
voidLCD_Write_DATA(uchardate)
{
bitBusy_flag;
Busy_flag=LCD_Busy();
while(Busy_flag)
Busy_flag=LCD_Busy();//判断LCD是否忙碌
RS=1;
RW=0;
EN=1;
P0=date;
delay(10);
EN=0;
}
/*----------------------------main--------------------------------*/
voidmain(void)
{
ucharkey;
longintnum1=0,num2=0,result=0;
intcnt1=0,cnt2=0,k;
unsignedintflagcal=0,flagtrs=0;//运算符标志
ucharrem0,rem1,rem2;//存放运算符
charnum;
unsignedchardataStr1[10]={0};//存放数据
LCD_Init();
LCD_Write_CMD(0x80);//设置显示位置(第一行开头)
delay(500);
LCD_Write_DATA('0');//测试用
LCD_Write_CMD(0x80);
while
(1)
{
key=keyscan();
if(key=='R')
{
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x80);
LCD_Write_DATA('0');
LCD_Write_CMD(0x80);
break;
}
/*-------------------------------基本运算------------------------------*/
if(!
(key=='o'||key=='b'||key=='h'))
{
if(flagtrs==1)//进制转换启动条件
{
Str1[cnt1++]=key;//能存上了
if(rem1=='o')
{
if(key>='A'&&key<='F')
{
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x80);
LCD_Write_DATA('E');
LCD_Write_DATA('r');
LCD_Write_DATA('r');
delay(500000);
cnt1=0;
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x80);
LCD_Write_DATA('0');
LCD_Write_CMD(0x80);
break;
}
}
if(rem1=='b')
{
if((key>='A'&&key<='F')||(key>='2'&&key<='9'))
{
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x80);
LCD_Write_DATA('E');
LCD_Write_DATA('r');
LCD_Write_DATA('r');
delay(500000);
cnt1=0;
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x80);
LCD_Write_DATA('0');
LCD_Write_CMD(0x80);
break;
}
}
if(key>='A'&&key<='F')
{
LCD_Write_DATA(key);
}
}
if(key>='0'&&key<='9')
{
LCD_Write_DATA(key);
if(flagcal==0)
{
num1=num1*10+key-'0';
if(num1>99999999||num1<-99999999)//溢出错误
{
LCD_Write_CMD(0x01);
delay(5);
LCD_Write_CMD(0x80);
delay(5);
LCD_Write_DATA('E');
delay(5);
LCD_Write_DATA('r');
delay(5);
LCD_Write_DATA('r');
break;
num1=0;
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x80);
LCD_Write_DATA('0');
LCD_Write_CMD(0x80);
}
}
else
{
num2=num2*10+key-'0';
if(num2>99999999||num2<-99999999)//溢出错误
{
LCD_Write_CMD(0x01);
delay(5);
LCD_Write_CMD(0x80);
LCD_Write_DATA('E');
delay(5);
LCD_Write_DATA('r');
delay(5);
LCD_Write_DATA('r');
break;
num2=0;
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x80);
LCD_Write_DATA('0');
LCD_Write_CMD(0x80);
}
}
}
if(key=='+'||key=='-'||key=='*'||key=='/')
{
LCD_Write_DATA(key);
LCD_Write_CMD(0xc0);
flagcal=1;
switch(key)
{
case'+':
rem0='+';break;
case'-':
rem0='-';break;
case'*':
rem0='*';break;
case'/':
rem0='/';break;
}
}
if(key=='=')
{
LCD_Write_DATA('=');
LCD_Write_CMD(0x8f);
LCD_Write_CMD(0x04);
switch(rem0)
{
case'+':
result=num1+num2;num2=0;num1=0;break;
case'-':
if(num1>=num2)result=num1-num2;elseresult=num2-num1;break;
case'*':
result=num1*num2;num2=0;num1=0;break;
case'/':
if(num2!
=0)result=num1/num2;elseresult=999999999;num2=0;num1=0;break;
default:
result=num1;break;
}
if(result>99999999||result<-99999999)//溢出错误
{
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x80);
LCD_Write_DATA('E');
LCD_Write_DATA('r');
LCD_Write_DATA('r');
break;
result=0;
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x80);
LCD_Write_DATA('0');
LCD_Write_CMD(0x80);
}
for(;result!
=0;)
{
num=result%10+'0';
LCD_Write_DATA(num);
result/=10;
}
if(num1LCD_Write_DATA('-');
}
}
/*-----------------------------------进制转换------------------------------*/
else
{
if(flagtrs==0)
{
LCD_Write_DATA(key);
flagtrs=1;
switch(key)
{
case'o':
rem1='o';break;
case'b':
rem1='b';break;
case'h':
rem1='h';break;
}
}
else
{
LCD_Write_DATA(key);
flagtrs=2;
switch(key)
{
case'o':
rem2='o';break;
case'b':
rem2='b';break;
case'h':
rem2='h';break;
}
if(rem1=='o'&&rem2=='b')//10-2
{
LCD_Write_CMD(0xc0);
LCD_Write_DATA('o');
LCD_Write_DATA('-');
LCD_Write_DATA('b');
LCD_Write_CMD(0x8f);
LCD_Write_CMD(0x04);
cnt2=cnt1-1;
num1=cnt1+'0';
LCD_Write_DATA('b');
num1=0;
//num=cnt2+'0';
//LCD_Write_DATA(num);//测试用。
。
发现Str里面没有数据
/*for(cnt1=0;cnt1<=cnt2;cnt1++)
{
num1=num1*10+Str1[cnt1]-'0';
}
for(;num1!
=0;)//测试正确
{
num=num1%2+'0';
LCD_Write_DATA(num);
num1=num1/2;
}*/
num1=0;
}
if(rem1=='o'&&rem2=='h')//10-16
{
LCD_Write_CMD(0xc0);
LCD_Write_DATA('o');
LCD_Write_DATA('-');
LCD_Write_DATA('h');
LCD_Write_CMD(0x8f);
LCD_Write_CMD(0x04);
cnt2=strlen(Str1);
for(cnt1=0;cnt1{
num1=num1*10+Str1[cnt1]-'0';
}
for(;num1!
=0;)
{
num=num1/16+'0';
LCD_Write_DATA(num);
num1=num1%16;
}
num1=0;
}
if(rem1=='h'&&rem2=='b')//16-2
{
LCD_Write_CMD(0xc0);
LCD_Write_DATA('h');
LCD_Write_DATA('-');
LCD_Write_DATA('b');
LCD_Write_CMD(0x8f);
LCD_Write_CMD(0x04);
cnt2=strlen(Str1);
for(cnt1=0;cnt1switch(Str1[cnt1])
{
case'F':
LCD_Write_DATA('1');LCD_Write_DATA('1');LCD_Write_DATA('1');LCD_Write_DATA('1');break;
case'E':
LCD_Write_DATA('1');LCD_Write_DATA('1');LCD_Write_DATA('1');LCD_Write_DATA('0');break;
case'D':
LCD_Write_DATA('1');LCD_Write_DATA('1');LCD_Write_DATA('0');LCD_Write_DATA('1');break;
case'C':
LCD_Write_DATA('1');LCD_Write_DATA('1');LCD_Write_DATA('0');LCD_Write_DATA('0');break;
case'B':
LCD_Write_DATA('1');LCD_Write_DATA('0');LCD_Write_DATA('1');LCD_Write_DATA('1');break;
case'A':
LCD_Write_DATA('1');LCD_Write_DATA('0');LCD_Write_DATA('1');LCD_Write_DATA('0');break;
case'9':
LCD_Write_DATA('1');LCD_Write_DATA('0');LCD_Write_DATA('0');LCD_Write_DATA('1');break;
case'8':
LCD_Write_DATA('1');LCD_Write_DATA('0');LCD_Write_DATA('0');LCD_Write_DATA('0');break;
case'7':
LCD_Write_DATA('0');LCD_Write_DATA('1');LCD_Write_DATA('1');LCD_Write_DATA('1');break;
case'6':
LCD_Write_DATA('0');LCD_Write_DATA('1');LCD_Write_DATA('1');LCD_Write_DATA('0');break;
case'5':
LCD_Write_DATA('0');LCD_Write_DATA('1');LCD_Write_DATA('0');LCD_Write_DATA('1');break;
case'4':
LCD_Write_DATA('0');LCD_Write_DATA('1');LCD_Write_DATA('0');LCD_Write_DATA('0');break;
case'3':
LCD_Write_DATA('0');LCD_Write_DATA('0');LCD_Write_DATA('1');LCD_Write_DATA('1');break;
c