写一个键盘输入计算器的51单片机程序
时间: 2023-12-01 08:03:06 浏览: 23
以下是一个简单的键盘输入计算器的51单片机程序,可以实现加减乘除四则运算:
```
#include <reg51.h>
sbit k1 = P2^0; // 定义k1按键
sbit k2 = P2^1; // 定义k2按键
sbit k3 = P2^2; // 定义k3按键
sbit k4 = P2^3; // 定义k4按键
sbit k5 = P2^4; // 定义k5按键
sbit k6 = P2^5; // 定义k6按键
sbit k7 = P2^6; // 定义k7按键
sbit k8 = P2^7; // 定义k8按键
sbit lcd_rs = P1^0; // LCD1602的RS引脚
sbit lcd_rw = P1^1; // LCD1602的RW引脚
sbit lcd_en = P1^2; // LCD1602的EN引脚
void delay(unsigned int i) // 延时函数
{
while(i--);
}
void lcd_write_cmd(unsigned char cmd) // 写指令函数
{
lcd_rs = 0;
lcd_rw = 0;
lcd_en = 1;
P0 = cmd;
delay(10);
lcd_en = 0;
}
void lcd_write_data(unsigned char dat) // 写数据函数
{
lcd_rs = 1;
lcd_rw = 0;
lcd_en = 1;
P0 = dat;
delay(10);
lcd_en = 0;
}
void lcd_init() // LCD1602初始化函数
{
lcd_write_cmd(0x38); // 显示模式设置:16×2,5×7点阵,8位数据接口
lcd_write_cmd(0x0c); // 显示控制:显示开,光标关,不闪烁
lcd_write_cmd(0x06); // 输入模式:光标右移,字符不移动
lcd_write_cmd(0x01); // 清屏
}
void lcd_display(unsigned char *str) // LCD1602显示字符串函数
{
while(*str)
{
lcd_write_data(*str++);
}
}
void main()
{
unsigned char num1 = 0; // 存储第一个数字
unsigned char num2 = 0; // 存储第二个数字
unsigned char op = '+'; // 存储运算符,默认为加号
unsigned char result = 0; // 存储运算结果
unsigned char buf[16]; // 存储LCD1602显示的字符串
lcd_init(); // LCD1602初始化
while(1)
{
if(k1 == 0) // 如果按下了数字键1
{
num1 = num1 * 10 + 1; // 将1加到num1中
lcd_display("1"); // LCD1602显示1
delay(1000); // 延时消抖
}
else if(k2 == 0) // 如果按下了数字键2
{
num1 = num1 * 10 + 2; // 将2加到num1中
lcd_display("2"); // LCD1602显示2
delay(1000); // 延时消抖
}
else if(k3 == 0) // 如果按下了数字键3
{
num1 = num1 * 10 + 3; // 将3加到num1中
lcd_display("3"); // LCD1602显示3
delay(1000); // 延时消抖
}
else if(k4 == 0) // 如果按下了加号键
{
op = '+'; // 存储加号运算符
lcd_display("+"); // LCD1602显示加号
delay(1000); // 延时消抖
}
else if(k5 == 0) // 如果按下了数字键4
{
num2 = num2 * 10 + 4; // 将4加到num2中
lcd_display("4"); // LCD1602显示4
delay(1000); // 延时消抖
}
else if(k6 == 0) // 如果按下了数字键5
{
num2 = num2 * 10 + 5; // 将5加到num2中
lcd_display("5"); // LCD1602显示5
delay(1000); // 延时消抖
}
else if(k7 == 0) // 如果按下了数字键6
{
num2 = num2 * 10 + 6; // 将6加到num2中
lcd_display("6"); // LCD1602显示6
delay(1000); // 延时消抖
}
else if(k8 == 0) // 如果按下了等号键
{
switch(op) // 根据运算符进行计算
{
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
default:
break;
}
sprintf(buf, "=%d", result); // 将运算结果转换为字符串
lcd_display(buf); // LCD1602显示运算结果
delay(1000); // 延时消抖
num1 = num2 = result = 0; // 清零
}
else // 如果没有按键按下
{
delay(100); // 延时一段时间
}
}
}
```
需要注意的是,上述程序中的LCD1602显示函数需要根据具体的LCD1602型号和接线来进行调整。同时,由于51单片机计算能力有限,本程序只能进行简单的整数四则运算,不能进行浮点数运算。