基于51单片机的简易计算器4*4矩阵键盘+6位数码管显示+蜂鸣器, 2、功能要求: (1)根据自己的设计,进行矩阵键盘功能划分,包括数字键和功能键; (2)功能键除了加减乘除外,还应包括清零键和是否开启按键音提示键; (3)开启按键音提示后,操作其他按键要发出提示音; (4)能够完成16位以内的加减乘除运算; (5)可自行增加其他功能,如多按键操作等。 P0口通过两个74HC573锁存器分别连接数码管的段码线和位选线,通过P2.6和P2.7控制锁存器的锁存与否(当L引脚为高电平,输出等于输入;当L为低电平,输出保持不变),简述设计思路和写出C语言代码
时间: 2023-11-27 09:04:44 浏览: 273
设计思路:
1.将矩阵键盘的4行4列分别连接到单片机的P1口上,通过轮询的方式扫描按键状态。
2.将数码管的段码线和位选线分别连接到两个74HC573锁存器的输出端,通过控制锁存器的锁存与否来控制数码管的显示。
3.通过P2.6和P2.7控制74HC573锁存器的锁存与否,实现数据的输入和输出。
4.根据按键状态和功能键状态,进行加减乘除运算,并将结果显示在数码管上。
5.增加按键音提示功能,通过蜂鸣器控制器发出提示音。
C语言代码:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar keyscan()
{
uchar flag = 0;
uchar temp = 0;
P1 = 0x0F;
if(P1 != 0x0F)
{
delay(1000);
if(P1 != 0x0F)
{
temp = P1;
P1 = 0xF0;
temp |= P1;
flag = 1;
}
}
return flag ? temp : 0;
}
void delay(uint i)
{
while(i--);
}
void display(uchar num, uchar pos)
{
P2 &= 0x3F;
P0 = table[num];
P2 |= (pos << 6);
}
void main()
{
uchar keyvalue = 0;
uchar keyflag = 0;
uchar num1 = 0;
uchar num2 = 0;
uchar oper = 0;
bit soundflag = 0;
while(1)
{
keyvalue = keyscan();
if(keyvalue)
{
keyflag = 1;
delay(1000);
if(keyvalue == 0x0E)
{
oper = '+';
}
else if(keyvalue == 0x0D)
{
oper = '-';
}
else if(keyvalue == 0x0B)
{
oper = '*';
}
else if(keyvalue == 0x07)
{
oper = '/';
}
else if(keyvalue == 0x0F)
{
num1 = 0;
num2 = 0;
oper = 0;
soundflag = 0;
}
else if(keyvalue == 0x0A)
{
soundflag = ~soundflag;
}
else
{
if(oper == 0)
{
num1 = keyvalue;
}
else
{
num2 = keyvalue;
}
}
}
if(!keyvalue && keyflag)
{
keyflag = 0;
switch(oper)
{
case '+': display(num1 + num2, 0); break;
case '-': display(num1 - num2, 0); break;
case '*': display(num1 * num2, 0); break;
case '/': display(num1 / num2, 0); break;
default: display(num1, 0); break;
}
if(soundflag)
{
P3 = 0x01;
delay(500);
P3 = 0x00;
}
}
}
}
```
阅读全文