×
单片机 > 单片机程序设计 > 详情

基于51单片机12864简易计算器

发布时间:2020-06-22 发布时间:
|
终于写计算器了,其实计算器老早就写好了的,只是那会一直在忙考试还有实验室项目,所以没能空出时间来写博客。现在寒假在家,终于可以静心的学点东西了。
    下面就先写点自己写这个程序的过程。其实这是个单片机课的期末课题,但是没有几个能写的好的。计算器其实要考虑周全也是很复杂的,。但我们只要求做简易计算器,所以我的计算器只有整数加减乘除,带负数功能。经过检验,实用性还是可以的。
这个程序的整体思路很简单,主要是一些细节的处理。
思路是,先矩阵键盘扫描,监测运算符号按下,存储两个运算数,计算结果,整个过程的实时显示。
先是矩阵键盘扫描,我以前一直用的郭天祥教的方法,这种方法很好理解,但是缺点是代码太长了,于是我上网去找一种简单的矩阵键盘扫描。(相比于埋头苦想,有时候去网上找方法也是不错的)
void keyscan()
{
uchar h,l;
if(keypress())
{
 
P3=0X0F;
_nop_(); 
h=P3;
h&=0X0F;//读取按键所在‘行’
 
P3=0XF0;
_nop_();
_nop_();
l=P3;
l&=0XF0;//读取按键所在‘列’
key=h+l;//最后相加作为SWITCH CASE的选择
//这种扫描过程很清楚明了是吧
  switch(key)
 {
       case 0xEE:key=1;Input[i]='1';break;// 1
   case 0xDE:key=4;Input[i]='4';break;// 4
   case 0xBE:key=7;Input[i]='7';break;// 7
   case 0x7E:key=0;Input[i]='0';break; /// 0
   case 0xED:key=2;Input[i]='2';break;// 2
   case 0xDD:key=5;Input[i]='5';break;// 5
   case 0xBD:key=8;Input[i]='8';break; // 8
   case 0x7D:key=16;i--;break; // = 16
   case 0xEB:key=3;Input[i]='3';break; // 3
   case 0xDB:key=6;Input[i]='6';break; // 6
   case 0xBB:key=9;Input[i]='9';break; // 9
   case 0x7B: clear();break; // c 17
   case 0xE7:key=18;Input[i]='+';n=i;break; // + 18
   case 0xD7:key=19;Input[i]='-';n=i;break;// - 19
   case 0xB7:key=20;Input[i]='*';n=i;break; // * 20
   case 0x77:key=21;Input[i]='/';n=i;break; // /   21
   default:key=22;  
 
 i++;   
while(keypress());
}
}
我的keyscan()函数就出来了。。。
把每次按键的数存入数组,然后一直显示数组成员就可以达到实时显示输入数字的效果了。
void jisuan(int n,int l,uchar yusuan)
{
int a=0,b=0,c=0,result;
uchar x;
for(x=0;x
{
a+=(Input[x]-'0')*pow(10,n-x-1);
}
for(x=n+1;x
{
b+=(Input[x]-'0')*pow(10,l-x-1);
}
// write_num(0,1,a);
// write_num(0,2,b);
switch(yusuan)
{
 
   case '+':result=a+b;write_num(0,1,result); break; // + 18
   case '-':result=a-b;write_num(0,1,result);break;// - 19
   case '*':result=a*b;write_num(0,1,result);break; // * 20
   case '/':result=a/b;write_num(0,1,result);break; // /   21
}
}
这个就是计算函数了,里面的
a+=(Input[x]-'0')*pow(10,n-x-1);
b+=(Input[x]-'0')*pow(10,l-x-1);
这是用来计算输入数值的,这个应该可以理解
最后是主函数:
void main()
Lcd_Init(); 
// write_string(0,3,"check ok");
while(1)
{
keyscan();
write_string(0,0,Input);
if(key==16)
{
l=i;  
if(n>0&&n!=i-1)
{
switch(Input[n])
{  
   case '+':jisuan(n,l,'+'); break; // + 18
   case '-':jisuan(n,l,'-');break;// - 19
   case '*':jisuan(n,l,'*');break; // * 20
   case '/':jisuan(n,l,'/');break; // /   21
}
}
else
{
write_string(0,1,"ERROR");
}  
}
delayms(1);
}
while(1);
}
 
 
简易计算器的51程序就此结束了
关键字:51单片机  12864  简易计算器 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会