查看:5590|回复:4
AVR单片机简单计算器的实现仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
复制代码
所有资料51hei提供下载:
mega16 计算器.zip(135.42 KB, 下载次数: 77)
单片机源程序如下:
- #include "mega16.h"
- #include "1602.h"
- #include "key.h"
- float k1,k2; //记录最终输入运算的两个数
- uint one,two,three,four; //记录每次输入的数字
- uint flag; //计数标志位
- uint flag1,flag2; //第一个数 第二个数 完成标志位
- uint flag3;//记录加减乘除标志位
- long Result; //最后运算的结果
- void main()
- {
- init(); //液晶初始化
- // write_com(0x80+15);
- // write_date('0');
- Init_Keypad(); //键盘初始化
- flag1 = 1;
- while(1)
- {
- Key_Event(); //扫描键盘
-
- if(key_Flag == 1)
- {
- key_Flag = 0;
- if(key_val< = 10) //小于10 则为需要的数字
- {
-
- if(flag1) //flag1为1 表示正在输入第一个数字
- {
- switch(flag)
- {
- case 0:
- flag = 1;
- one = key_val%10;
- write_com(0x80+6);
- write_date(tab[key_val]);
- k1 = (float)one;
- break;
- case 1:
- flag = 2;
- two = key_val%10;
- write_com(0x80+7);
- write_date(tab[key_val]);
- k1 = (float)(one*10 + two);
- break;
- case 2:
- flag = 3;
- three = key_val%10;
- write_com(0x80+8);
- write_date(tab[key_val]);
- k1 = (float)(one*100 + two * 10 + three);
- break;
- case 3:
- flag = 4;
- four = key_val%10;
- write_com(0x80+9);
- write_date(tab[key_val]);
- k1 = (float)(one*1000 + two * 100 + three*10 + four);
- break;
- case 4:
- flag = 0;
- break;
- }
- }
-
-
-
-
-
- if(flag2) //flag2为1 表示正在输入第2个数字
- {
- switch(flag)
- {
- case 0:
- flag = 1;
- one = key_val%10;
- write_com(0x80+12);
- write_date(tab[key_val]);
- k2 = (float)one;
- break;
- case 1:
- flag = 2;
- two = key_val%10;
- write_com(0x80+13);
- write_date(tab[key_val]);
- k2 = (float)(one*10 + two);
- break;
- case 2:
- flag = 3;
- three = key_val%10;
- write_com(0x80+14);
- write_date(tab[key_val]);
- k2 = (float)(one*100 + two * 10 + three);
- break;
- case 3:
- flag = 4;
- four = key_val%10;
- write_com(0x80+15);
- write_date(tab[key_val]);
- k2 = (float)(one*1000 + two * 100 + three*10 + four);
- break;
- case 4:
- flag = 0;
- break;
- }
- }
-
-
- }
-
-
-
- else if(key_val>=13 || key_val< = 16) //判断运算符
- {
- flag1 = 0;
- flag2 = 1;
- flag = 0;
- switch(key_val)
- {
- case 13:
- write_com(0x80+11);
- write_date('+');
- flag3 = 1;
- break;
- case 14:
- write_com(0x80+11);
- write_date('-');
- flag3 = 2;
- break;
- case 15:
- write_com(0x80+11);
- write_date('*');
- flag3 = 3;
- break;
- case 16:
- write_com(0x80+11);
- write_date('/');
- flag3 = 4;
- break;
- }
- }
-
-
- if(key_val == 12) //等于
- {
- switch(flag3)
- {
- case 1:
-
- Result = k1 + k2;
- write_com(0xc0);
-
write_date(tab[Result/100000]);
-
write_date(tab[Result%100000/10000]);
-
write_date(tab[Result%10000/1000]);
-
write_date(tab[Result%1000/100]);
-
write_date(tab[Result%100/10]);
-
write_date(tab[Result%10]);
- break;
- case 2:
- Result = k1 - k2;
- write_com(0xc0);
- if(Result< 0)
- {
- write_date('-');
- Result = 0 - Result;
-
- }
-
write_date(tab[Result/100000]);
-
write_date(tab[Result%100000/10000]);
-
write_date(tab[Result%10000/1000]);
-
write_date(tab[Result%1000/100]);
-
write_date(tab[Result%100/10]);
-
write_date(tab[Result%10]);
-
- break;
- case 3:
-
- Result = k1 * k2;
- write_com(0xc0);
-
write_date(tab[Result/100000]);
-
write_date(tab[Result%100000/10000]);
-
write_date(tab[Result%10000/1000]);
-
write_date(tab[Result%1000/100]);
-
write_date(tab[Result%100/10]);
-
write_date(tab[Result%10]);
- break;
- case 4:
- //write_com(0x80+11);
- //write_date('/');
- Result = k1*100 / k2;
- write_com(0xc0);
-
//write_date(tab[Result/100000]);
-
//write_date(tab[Result%100000/10000]);
-
write_date(tab[Result%10000/1000]);
-
write_date(tab[Result%1000/100]);
- write_date('.');
-
write_date(tab[Result%100/10]);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
所有资料51hei提供下载:
mega16 计算器.zip(135.42 KB, 下载次数: 77)