最新单片机简易计算器C代码.docx

上传人:b****6 文档编号:6586539 上传时间:2023-01-08 格式:DOCX 页数:20 大小:17.14KB
下载 相关 举报
最新单片机简易计算器C代码.docx_第1页
第1页 / 共20页
最新单片机简易计算器C代码.docx_第2页
第2页 / 共20页
最新单片机简易计算器C代码.docx_第3页
第3页 / 共20页
最新单片机简易计算器C代码.docx_第4页
第4页 / 共20页
最新单片机简易计算器C代码.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

最新单片机简易计算器C代码.docx

《最新单片机简易计算器C代码.docx》由会员分享,可在线阅读,更多相关《最新单片机简易计算器C代码.docx(20页珍藏版)》请在冰豆网上搜索。

最新单片机简易计算器C代码.docx

最新单片机简易计算器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(num1

LCD_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;cnt1

switch(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

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

当前位置:首页 > 幼儿教育

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

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