1 利用键盘及数码管作为计算机的输入及显示模块
2 能进行10以内的减减乘除的基本运算,按键有0~9+-*/=
3 有清零“CR”按键
4 有记忆功能键 M+ RM M-,可以保存、显示并运用存储数据进行计算
M+:记忆当前数字,「加入」累加数字当中。
M-:记忆当前数字,以负数的形式「加入」累加数字当中。换句话说,就是把总数扣除当前数字的意思。
MR:Memory Recall的意思,将当前计算出来的数字呈现出来。
本实验旨在设计并实现一个简易计算器,能够通过键盘输入进行基本的加、减、乘、除运算,并通过数码管显示计算结果。计算器还应具备清零功能以及存储和调用中间计算结果的记忆功能。
单片机:STC89C52RC
键盘:4x4矩阵键盘
数码管:共阴极七段数码管
其他器件:电阻、电容、跳线等
矩阵键盘:将键盘的行连接到P1.0至P1.3,列连接到P1.4至P1.7。
数码管:数码管的段选端连接到P0口,位选端连接到P2口。
独立按键:三个独立按键分别连接到P3.0、P3.1和P3.2,用于实现M+、M-、MR功能。
通过P1口控制矩阵键盘,逐行扫描键盘,判断按键按下情况。通过行列信号组合,确定具体按键值。
cvoid KeyScan() {
keyboPORT = 0xf0;
if (keyboPORT != 0xf0) {
delay(5);
if (keyboPORT != 0xf0) {
switch (keyboPORT) {
case 0xe0: KeyValue = 0; break;
case 0xd0: KeyValue = 1; break;
case 0xb0: KeyValue = 2; break;
case 0x70: KeyValue = 3; break;
}
keyboPORT = 0x0f;
switch (keyboPORT) {
case 0x0e: KeyValue = KeyValue; break;
case 0x0d: KeyValue += 4; break;
case 0x0b: KeyValue += 8; break;
case 0x07: KeyValue += 12; break;
}
while (keyboPORT != 0x0f);
}
}
}
通过捕获键盘输入,存储表达式,然后进行加、减、乘、除运算,并显示结果。
cfloat CalculateSeries(char *exprs_str) {
float Series_result = 0.0;
switch (exprs_str[1]) {
case '+': Series_result = (exprs_str[0] - '0') + (exprs_str[2] - '0'); break;
case '-': Series_result = (exprs_str[0] - '0') - (exprs_str[2] - '0'); break;
case '*': Series_result = (exprs_str[0] - '0') * (exprs_str[2] - '0'); break;
case '/': Series_result = (exprs_str[0] - '0') / (exprs_str[2] - '0'); break;
}
return Series_result;
}
通过数码管显示结果,使用四位数码管分别显示千位、百位、十位和个位的数值。
cvoid Display_Result(float d) {
long temp = (long) (d * 10);
// 显示个位
P0 = 0xff;
P2 = ~0x8;
P0 = ~LEDData[temp % 10];
delay(1);
// 显示十位
P0 = 0xff;
P2 = ~0x4;
P0 = ~(LEDData[temp % 100 / 10] | 0x80);
delay(1);
// 显示百位
P0 = 0xff;
P2 = ~0x2;
P0 = ~LEDData[temp % 1000 / 100];
delay(1);
// 显示千位
P0 = 0xff;
P2 = ~0x1;
P0 = ~LEDData[temp % 10000 / 1000];
delay(1);
}
实现M+、M-、MR功能,通过独立按键输入控制,分别执行累加、累减和显示存储结果。
cvoid main() {
float result = 0.0, display_value = 0, temp = 0.0;
char expression[5], inputChar;
unsigned char key;
while (1) {
KeyScan();
if (KeyValue != 0xff) {
inputChar = MAP[KeyValue];
KeyValue = 0xff;
if ((inputChar >= '0') && (inputChar <= '9')) {
expression[count++] = inputChar;
display_value = inputChar - '0';
} else if (strchr("+-*/=", inputChar)) {
expression[count++] = inputChar;
if (inputChar == '=') {
result = CalculateSeries(expression);
display_value = result;
temp = result;
count = 0;
}
} else if (inputChar == 'R') {
result = 0;
display_value = result;
temp = 0;
count = 0;
}
}
key = KeySscanSI();
if (key != 0xff) {
switch (key) {
case 1: temp += CalculateSeries(expression); display_value = temp; count = 0; break;
case 2: temp -= CalculateSeries(expression); display_value = temp; count = 0; break;
case 3: display_value = temp; break;
}
}
Display_Result(display_value);
}
}
通过本次实验,成功实现了一个简易计算器的设计,能够进行基本的算术运算,并通过数码管显示结果。键盘输入和数码管显示配合良好,记忆功能有效。进一步的优化可以考虑增强运算功能,支持更复杂的表达式计算。
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!