1、最新单片机简易计算器C代码单片机简易计算器C代码*/ #include #include #include #define uchar unsigned char#define DATA=P0sbit RS=P20;sbit RW=P21;sbit EN=P22;/*-函数声明-*/void delay(unsigned int i);uchar keyscan(void);void LCD_Init(void);bit LCD_Busy(void);void LCD_Write_CMD(uchar command);void LCD_Write_DATA(uchar date);/*-del
2、ay-*/void delay(unsigned int i)/延时函数 while(i-);/*-keyscan-*/uchar keyscan(void)/逐行扫描法 uchar H_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) case 0x0f:Num=7;break;/7 按下相应的键显示相对应的码值 cas
3、e 0x17:Num=8;break;/8 case 0x1b:Num=9;break;/9 case 0x1d:Num=F;break;/F case 0x1e: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) case
4、0x0f:Num=4;break;/4 按下相应的键显示相对应的码值 case 0x17:Num=5;break;/5 case 0x1b:Num=6;break;/6 case 0x1d:Num=E;break;/E case 0x1e: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; /读入列线值
5、 if(L_line!=0x1f) switch(L_line) case 0x0f:Num=1;break;/1 按下相应的键显示相对应的码值 case 0x17:Num=2;break;/2 case 0x1b:Num=3;break;/3 case 0x1d:Num=D;break;/D case 0x1e:Num=*;break;/* while(P1!=0xff) /一次按键检测,松手跳出循环 H_line=P3&0x1f; delay(50); P3=0x17; /行线第四条为0 L_line=P1&0x1f; /读入列线值 if(L_line!=0x1f) /先检测有无按键按下
6、delay(100); /去抖 L_line=P1&0x1f; /读入列线值 if(L_line!=0x1f) switch(L_line) case 0x0f:Num=0;break;/0 按下相应的键显示相对应的码值 case 0x17:Num=A;break;/A case 0x1b:Num=B;break;/B case 0x1d:Num=C;break;/C case 0x1e:Num=/;break;/ while(P1!=0xff) /一次按键检测,松手跳出循环 H_line=P3&0x1f; delay(50); P3=0x0f; /行线第五条为0 L_line=P1&0x1f
7、; /读入列线值 if(L_line!=0x1f) /先检测有无按键按下 delay(100); /去抖 L_line=P1&0x1f; /读入列线值 if(L_line!=0x1f) switch(L_line) case 0x0f:Num=b;break;/b 按下相应的键显示相对应的码值 case 0x17:Num=o;break;/o case 0x1b:Num=h;break;/h case 0x1d:Num=R;break;/R case 0x1e:Num=;break;/=号 while(P1!=0xff) /一次按键检测,松手跳出循环 H_line=P3&0x1f; while
8、(Num!=0) return Num;/*-LCD_Init-*/void LCD_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-*/bit LCD_Busy(void) bit result; RS=0; /读指令 RW=1
9、; EN=1; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P0&0x80); EN=0; return result;/*-LCD_Write_CMD-*/void LCD_Write_CMD(uchar command) bit Busy_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-*/void LCD_Writ
10、e_DATA(uchar date) bit Busy_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-*/void main(void) uchar key; long int num1=0,num2=0,result=0; int cnt1=0,cnt2=0,k; unsigned int flagcal=0,flagtrs=0;/运算符标志 uchar rem0,rem1,r
11、em2;/存放运算符 char num; unsigned char data Str110=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 (
12、!(key=o|key=b|key=h) if(flagtrs=1) /进制转换启动条件 Str1cnt1+=key; /能存上了 if(rem1=o) if(key=A&key=A&key=2&key=A&key=0&key99999999|num199999999|num2=num2)result=num1-num2;else result=num2-num1;break; case *:result=num1*num2;num2=0;num1=0;break; case /:if(num2!=0)result=num1/num2;else result=999999999;num2=0;
13、num1=0;break; default :result=num1;break; if(result99999999|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;) nu
14、m=result%10+0; LCD_Write_DATA(num); result/=10; if(num1num2) 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=
15、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=cnt
16、2;cnt1+) num1=num1*10+Str1cnt1-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;cnt1cnt2;cnt
17、1+) num1=num1*10+Str1cnt1-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;cnt1cnt2;cnt1+) switch(St
18、r1cnt1) caseF:LCD_Write_DATA(1);LCD_Write_DATA(1);LCD_Write_DATA(1);LCD_Write_DATA(1);break; caseE:LCD_Write_DATA(1);LCD_Write_DATA(1);LCD_Write_DATA(1);LCD_Write_DATA(0);break; caseD:LCD_Write_DATA(1);LCD_Write_DATA(1);LCD_Write_DATA(0);LCD_Write_DATA(1);break; caseC:LCD_Write_DATA(1);LCD_Write_DAT
19、A(1);LCD_Write_DATA(0);LCD_Write_DATA(0);break; caseB:LCD_Write_DATA(1);LCD_Write_DATA(0);LCD_Write_DATA(1);LCD_Write_DATA(1);break; caseA:LCD_Write_DATA(1);LCD_Write_DATA(0);LCD_Write_DATA(1);LCD_Write_DATA(0);break; case9:LCD_Write_DATA(1);LCD_Write_DATA(0);LCD_Write_DATA(0);LCD_Write_DATA(1);brea
20、k; case8:LCD_Write_DATA(1);LCD_Write_DATA(0);LCD_Write_DATA(0);LCD_Write_DATA(0);break; case7:LCD_Write_DATA(0);LCD_Write_DATA(1);LCD_Write_DATA(1);LCD_Write_DATA(1);break; case6:LCD_Write_DATA(0);LCD_Write_DATA(1);LCD_Write_DATA(1);LCD_Write_DATA(0);break; case5:LCD_Write_DATA(0);LCD_Write_DATA(1);LCD_Write_DATA(0);LCD_Write_DATA(1);break; case4:LCD_Write_DATA(0);LCD_Write_DATA(1);LCD_Write_DATA(0);LCD_Write_DATA(0);break; case3:LCD_Write_DATA(0);LCD_Write_DATA(0);LCD_Write_DATA(1);LCD_Write_DATA(1);break; c
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1