在上一篇简绍了几个重要的部分,下面先说一下计算器程序的
大体思路
: /这个计算器没有等于键,按下加号或减号相当于等号。/
初始化中断,设置三个变量先用AB表示,值全部为零。 进入输入数字子程序,等待数字输入 数字输入并显示,直到有运算符按下,B为输出值。判断运算符如果是加加号,A=A+B,并让下一个输入的数乘1,显示A,回到数字输入。如果是减号,A=A+B,并让下一个输入的数乘-1,显示A,回到数字输入。如果是乘号,进入乘循环A=A*B,显示A,直到按下加减号。如果是除号,进入除循环A=A/B,显示A,直到按下加减号。 _ _ 理论上,这是一个闭环的循环,可以进行无限次计算,占用内存不会扩大。
相关变量的设置
这是最糟糕的。。。自己贪图省事,设置了一大堆变量。。。 这确实有点乱,一些主要的变量都放在这里,后面子程序还有一堆临时变量。 大家不用看这段,只是说明后面都用到了。。。
#include "reg51.h"
long double S;
long double T;
long double U;
long int Z;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//控制数码管的三位数
sbit ZhengFu=P3^3;//输入正负号的按键,默认输入正数,按下输入负数
int i;
char code DENG_CODE[22]=
{0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x6f,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
//数组,前10个0-9,后10个有小数点下标
#define GPIO_DENG P0//宏定义数码管共阴极(阳极)
#define GPIO_ANJIAN P1//宏定义按键
int h;
long double sz;
unsigned char jia;
unsigned char jian;
unsigned char cheng;
unsigned char chu;
unsigned char dian;
unsigned char KeyValue;
long double A;
unsigned char zhengfu=1;
sbit led=P2^0;//输入负号时的中断指示灯
long double V;
void Delay5ms() 延时函数
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=8;b>0;b--)
for(a=50;a>0;a--);
}
void Delay10ms()//延时函数
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
矩阵按键扫描
void KeyDown()//检测按下的是哪个数
{
GPIO_ANJIAN=0x0f;//之前我先宏定义了GPIO_ANJIAN是八个引脚,现在电位00001111
if(GPIO_ANJIAN!=0x0f)//有按键按下
{
Delay10ms();//延迟防抖动
if(GPIO_ANJIAN!=0x0f)//检测行
{
GPIO_ANJIAN=0X0F;
switch(GPIO_ANJIAN)//选择哪一行
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
GPIO_ANJIAN=0XF0;//反转电位,检测列
Delay10ms();//延时防抖动
switch(GPIO_ANJIAN)//选择哪一列
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((h0)//数大于零时
{
G=S;
while((S |