自己写了个简单版的超级计算器程序,只能实现最多五位整数的加减乘除,而且不可以用于负数的运算,仅仅用于参考。
制作出来的实物图如下:
单片机源程序如下:
- #include<reg52.h>
- #include "matrixkey.h"
- #include "tm1638.h"
- /*制作一个简易计算器。 要求: a. 实现两个数字的 100 以内加减乘除,结果只保留整数即可;
- b. 先输入一个数字,下运算符按键时,数码管清零,然后输入下一个 数字,按下等于号按键后,显示运算结果。
- 并且,中间若出现输入错 误,可以利用删除按键,进行一位一位地删除更改。*/
- #define u8 unsigned char
- #define u16 unsigned int
- u8 code distab[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
- u8 DYGSS[8];//第一个数
- u8 DEGSS[8];//第二个数
- u16 dygs;//第一个数
- u16 degs;//第二个数
- u16 result;//结果
- u8 state; //state分为1 2 3
- u8 jisuan;//jisuan分为 1 2 3 4 加减乘除
- u8 weishu1=0;//第一个数的位数
- u8 weishu2=0;//第二个数的位数
- u8 hym;//hym为按键件吗
- void Init_Tab();
- void Input_dygs();//输入第一个数
- void Input_degs();//输入第二个数DYGS
- void Tuige(u8 len,u8 *P);
- void Endline();//显示结果
- void Display(u8 len,u8 *P);//显示中途
- u16 Calculate();//计算
- void CLRTAB();
- void Init_Tab();
- void main()
- {
- // u8 i;//万能变量
- init_TM1638();
- while(1)
- {
- Init_Tab();
- Input_dygs();
- Input_degs();
- Endline();
- }
- }
- void Input_dygs()//输入第一个数
- {
- while(state==1)
- {
- hym=Keyscan();
- if(hym!=88)
- {
- if(hym<=9)
- {
- weishu1++;
- DYGSS[weishu1]=DYGSS[weishu1-1];
- DYGSS[weishu1-1]=hym;
- }
- if(hym==10)
- {
- weishu1--;
- CLRTAB();
- }
- switch(hym)
- {
- case 12:jisuan=1;state=2;break;
- case 13:jisuan=2;state=2;break;
- case 14:jisuan=3;state=2;break;
- case 15:jisuan=4;state=2;break;
- default:break;
- }
- }
- Display(weishu1,DYGSS);
- }
- CLRTAB();
- }
- void Input_degs()//输入第二个数DYGS
- {
- while(state==2)
- {
- hym=Keyscan();
- if(hym!=88)
- {
- if(hym<=9)
- {
- weishu2++;
- DEGSS[weishu2]=DEGSS[weishu2-1];
- DEGSS[weishu2-1]=hym;
- }
- if(hym==10)
- {
- weishu2--;
- CLRTAB();
- }
- if(hym==11)
- {
- state=3;
- result=Calculate();
- }
- }
- Display(weishu2,DEGSS);
- }
- CLRTAB();
- }
- void Tuige(u8 len,u8 *P)
- {
- len--;
- P[len]=0;
- }
- void Endline()//显示结果
- {
- while(state==3)
- {
- hym=Keyscan();
- if(hym==10)
- {
- state=1;
- }
- Write_DATA(3*2,distab[result/10000]);
- Write_DATA(4*2,distab[result%10000/1000]);
- Write_DATA(5*2,distab[result%1000/100]);
- Write_DATA(6*2,distab[result%100/10]);
- Write_DATA(7*2,distab[result%10]);
- }
- CLRTAB();
- }
- void Display(u8 len,u8 *P)//显示中途
- {
- u8 i;
- for(i=0;i<len;i++)
- {
- Write_DATA((7-i)*2,distab[P[len-1-i]]);
- }
- }
- u16 Calculate()//计算
- {
- u8 i;
- u16 hymm;
- for(i=0;i<weishu1;i++)
- {
- dygs+=DYGSS[i];
- dygs*=10;
- }
- for(i=0;i<weishu2;i++)
- {
- degs+=DEGSS[i];
- degs*=10;
- }
- dygs/=10;
- degs/=10;
- switch(jisuan)
- {
- case 1:hymm=dygs+degs;break;
- case 2:hymm=dygs-degs;break;
- case 3:hymm=dygs*degs;break;
- case 4:hymm=dygs/degs;break;
- }
- return hymm;
- }
- void CLRTAB()
- {
- u8 ii;
- for(ii=0;ii<8;ii++)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有程序51hei提供下载:
简单版计算器.zip
(44.35 KB, 下载次数: 29)
|