我用C语言编了一个计算器单片机程序,可是总是实现不了功能,不知道是什么原因,请高手赐解。

2024-12-31 13:52:32
推荐回答(3个)
回答1:

你这样的书写方式太乱了。你要把你的计算器模块化。
1.键盘输入。不知道你的这个是不是4*4矩阵键盘,键盘输入应该作为一个单独的模块。
void _delayKey(unsigned int i) { while(i--);}
unsigned char catchKey(){
unsigned char cord_h,cord_l;//行列值中间变量

KEYPORT=0x0f; //低位线输出全为1 ,高位线为0
cord_h=KEYPORT&0x0f; //读入低位线值
if(cord_h!=0x0f){ //低位线值变化,有按键输入
KEYPORT=0xf0; //低位线输出全为0 ,高位线为1
cord_l=KEYPORT&0xf0; //读入高位线值
if(cord_l==0xf0){ //无法捕捉了提前释放了
return 0xff;
}

_delayKey(200);
do{
KEYPORT=0x0f;
}while(KEYPORT!=0x0f);//捕捉释放

return cord_h+cord_l;//键盘最后组合码值

}

return 0xff; //返回无键盘输入值
}
比如我写的这个键盘扫描函数。(开始学习单片机的时候写的,应该还可以继续完善。)
通过获取catchKey()的返回值就可以确定是否有键盘输入,输入的是什么键。
键盘输入的值要自己根据单片机连接自己找到。
我的键值是
#define NOPRESS 0xff //无按下
#define KEY0 0xee //0
#define KEY1 0xde //1
#define KEY2 0xbe //2
#define KEY3 0x7e //3
#define KEY4 0xed //4
#define KEY5 0xdd //5
#define KEY6 0xbd //6
#define KEY7 0x7d //7
#define KEY8 0xeb //8
#define KEY9 0xdb //9
#define KEYA 0xbb //a
#define KEYB 0x7b //b
#define KEYC 0xe7 //c
#define KEYD 0xd7 //d
#define KEYE 0xb7 //e
#define KEYF 0x77 //f
按键的排列顺序
0 1 2 3
4 5 6 7
8 9 a b
c d e f
这是我键盘的排列。4*4矩阵键盘。
2.计算程序。
//按键定义
#define NUM1 KEY0
#define NUM2 KEY1
#define NUM3 KEY2
#define NUM4 KEY4
#define NUM5 KEY5
#define NUM6 KEY6
#define NUM7 KEY8
#define NUM8 KEY9
#define NUM9 KEYA
#define NUM0 KEYC
#define JIA KEY3 //+
#define JIAN KEY7 //-
#define SHENG KEYB //*
#define CHU KEYF // /
#define CLEAN KEYD //C
#define DENG KEYE //==

/*---------------------------------------------
根据键值返回数字
---------------------------------------------*/
unsigned char getValue(unsigned char key){

switch(key){
case NUM0:
return 0;
case NUM1:
return 1;
case NUM2:
return 2;
case NUM3:
return 3;
case NUM4:
return 4;
case NUM5:
return 5;
case NUM6:
return 6;
case NUM7:
return 7;
case NUM8:
return 8;
case NUM9:
return 9;
default:
PrintInt(key);
return 10;
}

}
void main(){

int QianNum = 0x00; //前
unsigned char oper = 0xff;//空
int HouNum = 0x00; //后
unsigned char state = 0;//输入状态 0为正在输入前一个数。1,为字符,2为第二个数

int resoult = 0; unsigned char key,value,num=0;
//初始化显示。 InitDisplay();
PrintInt(0);
while(1){
Display();//不断刷新。
key = catchKey();
switch(key){
case NOPRESS:
break;
case CLEAN:
QianNum = 0;
oper = 0xff;
HouNum = 0;
state = 0;
//ChangePosition(0,0);
PrintInt(0);
break;
case DENG:
switch(oper){
case JIA:
resoult = QianNum+HouNum;
break;
case JIAN:
resoult = QianNum-HouNum;
break;
case SHENG:
resoult = QianNum*HouNum;
break;
case CHU:
resoult = QianNum/HouNum;
break;
}
PrintInt(resoult); //显示结果
//把结果保存为第一个数。
QianNum = resoult;
HouNum = 0;
oper = 0xff;

state = 1;//要输入字符。
break;
case JIA:
oper = JIA;
state = 2;
break;
case JIAN:
oper = JIAN;
state = 2;
break;
case SHENG:
oper = SHENG;
state = 2;
break;
case CHU:
oper = CHU;
state = 2;
break;
default:
value = getValue(key);//获得键的值

switch(state){
case 0:
QianNum = QianNum*10+(int)value;
PrintInt(QianNum);
break;
case 1:
QianNum = 0;
oper = 0xff;
HouNum = 0;
state = 0;
QianNum = (int)value;
PrintInt(QianNum);
break;
case 2:
HouNum = HouNum*10+(int)value;
PrintInt(HouNum);
break;
default:
break;
}
break;
}

}
}

PrintInt是打印整数的函数。就是显示这个整数。

回答2:

你得想办法看到里面的计算结果啊,慢慢调啊

回答3:

你这个键盘 还显示 计算,。哪一个不能啊??