简易计算器”。其中的数字显示模块要求使用8个共阴极数码管作为计算结果显示,并将任意3位数显示在数码管上。试使用C51编写程序实现上述功能。
时间: 2024-03-14 18:43:23 浏览: 89
好的,这是一个关于简易计算器的C51程序示例:
```c
#include <reg52.h> // 引入STC单片机头文件
#define uchar unsigned char // 定义unsigned char类型的宏uchar
#define uint unsigned int // 定义unsigned int类型的宏uint
// 数码管共阴极连接方式,定义各位数码管对应的端口
sbit dula = P2^6;
sbit wela = P2^7;
uchar code table[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
// 按键连接方式,定义各个按键对应的端口
sbit key1 = P3^0; // 数字1
sbit key2 = P3^1; // 数字2
sbit key3 = P3^2; // 数字3
sbit key4 = P3^3; // 加号
sbit key5 = P3^4; // 数字4
sbit key6 = P3^5; // 数字5
sbit key7 = P3^6; // 数字6
sbit key8 = P3^7; // 减号
void delay(uint i) // 延时函数
{
uint j;
while(i--)
{
for(j = 0; j < 125; j++);
}
}
void display(uint num) // 数字显示函数
{
wela = 0; // 打开位选锁存器
P0 = 0x01; // 选中第一位数码管
wela = 1; // 关闭位选锁存器
dula = 0; // 打开段选锁存器
P0 = table[num / 100]; // 显示百位
dula = 1; // 关闭段选锁存器
delay(1); // 延时1ms
wela = 0; // 打开位选锁存器
P0 = 0x02; // 选中第二位数码管
wela = 1; // 关闭位选锁存器
dula = 0; // 打开段选锁存器
P0 = table[num / 10 % 10]; // 显示十位
dula = 1; // 关闭段选锁存器
delay(1); // 延时1ms
wela = 0; // 打开位选锁存器
P0 = 0x04; // 选中第三位数码管
wela = 1; // 关闭位选锁存器
dula = 0; // 打开段选锁存器
P0 = table[num % 10]; // 显示个位
dula = 1; // 关闭段选锁存器
delay(1); // 延时1ms
}
void main()
{
uint num1 = 0, num2 = 0, result = 0; // 定义两个运算数和结果
uchar op = 0; // 定义运算符
while(1)
{
if(key1 == 0) // 数字1按下
{
delay(10); // 延时去抖
if(key1 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 1; // 更新第一个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key2 == 0) // 数字2按下
{
delay(10); // 延时去抖
if(key2 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 2; // 更新第一个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key3 == 0) // 数字3按下
{
delay(10); // 延时去抖
if(key3 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 3; // 更新第一个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key4 == 0) // 加号按下
{
delay(10); // 延时去抖
if(key4 == 0) // 再次判断按键状态
{
op = '+'; // 设置运算符为加号
num2 = num1; // 备份第一个运算数
num1 = 0; // 重置第一个运算数
display(num1); // 数码管显示0
}
}
if(key5 == 0) // 数字4按下
{
delay(10); // 延时去抖
if(key5 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 4; // 更新第一个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key6 == 0) // 数字5按下
{
delay(10); // 延时去抖
if(key6 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 5; // 更新第一个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key7 == 0) // 数字6按下
{
delay(10); // 延时去抖
if(key7 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 6; // 更新第一个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key8 == 0) // 减号按下
{
delay(10); // 延时去抖
if(key8 == 0) // 再次判断按键状态
{
op = '-'; // 设置运算符为减号
num2 = num1; // 备份第一个运算数
num1 = 0; // 重置第一个运算数
display(num1); // 数码管显示0
}
}
if(op == '+') // 加法运算
{
if(key1 == 0) // 数字1按下
{
delay(10); // 延时去抖
if(key1 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 1; // 更新第二个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key2 == 0) // 数字2按下
{
delay(10); // 延时去抖
if(key2 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 2; // 更新第二个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key3 == 0) // 数字3按下
{
delay(10); // 延时去抖
if(key3 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 3; // 更新第二个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key4 == 0) // 等号按下
{
delay(10); // 延时去抖
if(key4 == 0) // 再次判断按键状态
{
result = num1 + num2; // 计算结果
display(result); // 数码管显示结果
num1 = result; // 更新第一个运算数为结果
op = 0; // 重置运算符
}
}
}
if(op == '-') // 减法运算
{
if(key5 == 0) // 数字4按下
{
delay(10); // 延时去抖
if(key5 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 4; // 更新第二个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key6 == 0) // 数字5按下
{
delay(10); // 延时去抖
if(key6 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 5; // 更新第二个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key7 == 0) // 数字6按下
{
delay(10); // 延时去抖
if(key7 == 0) // 再次判断按键状态
{
num1 = num1 * 10 + 6; // 更新第二个运算数
display(num1); // 数码管显示更新后的数值
}
}
if(key8 == 0) // 等号按下
{
delay(10); // 延时去抖
if(key8 == 0) // 再次判断按键状态
{
result = num2 - num1; // 计算结果
display(result); // 数码管显示结果
num1 = result; // 更新第一个运算数为结果
op = 0; // 重置运算符
}
}
}
}
}
```
这个程序可以让你使用8个共阴极数码管进行加减法计算。你可以根据需求修改程序中的数字显示内容。
阅读全文