利用矩阵按键和LCD1602实现计算器功能,要使用LCD1602代码(加减除、十进制和二进制转换) 注:除法运算结果显示保留两位小数
时间: 2024-02-06 21:12:37 浏览: 87
C语言十进制、复数、矩阵计算器实现
好的,这是一个比较复杂的问题,需要进行详细的说明。首先,矩阵按键是一种常见的输入设备,通过矩阵按键可以实现数字、运算符号等的输入。而LCD1602是一种常见的输出设备,可以用来显示计算器的运算结果和操作指令。
为了实现计算器的功能,我们需要编写一个程序,包括以下几个部分:
1. 矩阵按键的输入处理:通过扫描矩阵按键,获取用户输入的数字和运算符号,存储到一个缓冲区中。
2. 数字和运算符的处理:根据用户输入的数字和运算符,进行相应的处理,例如进行加减乘除运算,或者进行十进制和二进制之间的转换。
3. LCD1602的显示处理:根据计算器的运算结果和操作指令,将相应的信息显示到LCD1602上。
下面是一个简单的C语言程序,可以实现上述功能:
```
#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '*', '/', '.', 'C', 'B', '='};
uchar code lcd_init[] = {0x38, 0x0c, 0x06, 0x01};
uchar code lcd_line[] = {0x80, 0xc0};
uchar input[16];
uchar result[16];
uchar op;
uchar pos;
bit dot_flag;
uchar cursor_pos;
uint num;
void delay(uint n)
{
uint i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 125; j++);
}
void lcd_write(uchar dat, bit cmd)
{
uchar high, low;
high = dat >> 4;
low = dat & 0x0f;
if (cmd)
P1 = 0x00;
else
P1 = 0x01;
P0 = high;
P2 = 0x01;
delay(1);
P2 = 0x00;
P0 = low;
P2 = 0x01;
delay(1);
P2 = 0x00;
}
void lcd_clear()
{
lcd_write(0x01, 1);
delay(10);
}
void lcd_gotoxy(uchar x, uchar y)
{
if (y == 0)
lcd_write(lcd_line[0] + x, 1);
else
lcd_write(lcd_line[1] + x, 1);
}
void lcd_puts(uchar *s)
{
while (*s)
{
lcd_write(*s++, 0);
delay(1);
}
}
void lcd_init()
{
uchar i;
for (i = 0; i < sizeof(lcd_init); i++)
{
lcd_write(lcd_init[i], 1);
delay(1);
}
}
uchar get_key()
{
uchar i, j, key;
P3 = 0x0f;
for (i = 0; i < 4; i++)
{
P3 = ~(0x01 << i);
for (j = 0; j < 4; j++)
{
if (!(P3 & (0x10 << j)))
{
delay(5);
if (!(P3 & (0x10 << j)))
{
key = i * 4 + j;
return key;
}
}
}
}
return 0xff;
}
void input_num(uchar key)
{
if (pos < 14 && !(key == 13 && dot_flag))
{
if (key == 13)
dot_flag = 1;
input[pos++] = table[key];
lcd_write(table[key], 0);
}
}
void input_op(uchar key)
{
if (pos > 0 && !((input[pos - 1] == '+' || input[pos - 1] == '-' || input[pos - 1] == '*' || input[pos - 1] == '/') && (key == '+' || key == '-' || key == '*' || key == '/')))
{
if (input[pos - 1] == '.')
pos--;
if (op != '=')
{
num = atoi(input);
switch (op)
{
case '+':
sprintf(result, "%.2f", (float)num + (float)atof(input + cursor_pos));
break;
case '-':
sprintf(result, "%.2f", (float)num - (float)atof(input + cursor_pos));
break;
case '*':
sprintf(result, "%.2f", (float)num * (float)atof(input + cursor_pos));
break;
case '/':
sprintf(result, "%.2f", (float)num / (float)atof(input + cursor_pos));
break;
}
lcd_gotoxy(0, 1);
lcd_puts(result);
cursor_pos = pos = strlen(result);
}
input[pos++] = table[key];
lcd_write(table[key], 0);
op = key;
dot_flag = 0;
}
}
void input_cmd(uchar key)
{
if (key == 14)
{
lcd_clear();
pos = op = cursor_pos = dot_flag = 0;
}
else if (key == 15)
{
if (pos > 0)
{
if (input[pos - 1] == '.')
dot_flag = 0;
input[--pos] = '\0';
lcd_gotoxy(pos, 0);
lcd_puts(" ");
}
}
else if (key == 16)
{
if (op != '=')
{
num = atoi(input);
switch (op)
{
case '+':
sprintf(result, "%.2f", (float)num + (float)atof(input + cursor_pos));
break;
case '-':
sprintf(result, "%.2f", (float)num - (float)atof(input + cursor_pos));
break;
case '*':
sprintf(result, "%.2f", (float)num * (float)atof(input + cursor_pos));
break;
case '/':
sprintf(result, "%.2f", (float)num / (float)atof(input + cursor_pos));
break;
}
lcd_gotoxy(0, 1);
lcd_puts(result);
cursor_pos = pos = strlen(result);
}
op = '=';
dot_flag = 0;
}
}
void main()
{
uint i;
pos = op = cursor_pos = dot_flag = 0;
lcd_init();
while (1)
{
i = get_key();
if (i != 0xff)
{
if (i >= 0 && i <= 9 || i == 13)
input_num(i);
else if (i >= 10 && i <= 13)
input_op(i);
else if (i >= 14 && i <= 16)
input_cmd(i);
}
}
}
```
以上是一个简单的计算器程序,可以实现加减乘除、十进制和二进制之间的转换等功能,并通过LCD1602显示计算结果和操作指令。如果需要更详细的说明,请告诉我。
阅读全文