单片机键盘输入小数的程序
时间: 2024-01-07 16:04:47 浏览: 124
JISUANQI.rar_小数计算器_计算器 小数点
下面是一个使用4x4矩阵键盘输入小数的例子:
```c
#include <REG51.H>
//定义键盘按键对应的值
unsigned char code KEY_TABLE[] = {
'1', '2', '3', 'A',
'4', '5', '6', 'B',
'7', '8', '9', 'C',
'*', '0', '#', 'D'
};
//函数声明
unsigned char key_scan();
float get_float_number();
void main()
{
float num;
while(1)
{
num = get_float_number(); //获取小数
P1 = (unsigned char)(num * 100); //将小数值输出到P1口
}
}
//键盘扫描函数
unsigned char key_scan()
{
unsigned char row, col;
unsigned char key_code = 0xFF;
//按行扫描键盘
for(row = 0; row < 4; row++)
{
P2 = ~(1 << row);
delay_ms(5);
//检测列是否有按键按下
if((P2 & 0x0F) != 0x0F)
{
//按键按下,确定列号
col = P2 & 0x0F;
//确定按键值
key_code = KEY_TABLE[row * 4 + col];
break;
}
}
return key_code;
}
//获取小数函数
float get_float_number()
{
unsigned char key_value;
float num = 0;
unsigned char dot_pos = 0;
unsigned char dot_count = 0;
while(1)
{
key_value = key_scan(); //扫描按键
if(key_value != 0xFF) //如果检测到按键按下
{
if(key_value == '#') //按下#键,输入结束
{
break;
}
else if(key_value == '*') //按下*键,删除上一位输入
{
num = (int)(num / 10);
dot_pos--;
if(dot_pos < 0)
{
dot_pos = 0;
}
}
else if(key_value == '.') //按下.键,设置小数点位置
{
dot_pos = dot_count;
}
else //输入数字
{
if(dot_count <= 2) //最多只能输入两位小数
{
if(dot_count == 0) //整数部分
{
num = num * 10 + (key_value - '0');
}
else //小数部分
{
num = num + (key_value - '0') * 0.1;
}
dot_count++;
}
}
delay_ms(100); //延时消除抖动
}
//显示当前输入的小数
P1 = (unsigned char)(num * 100); //将小数值输出到P1口
if(dot_pos == dot_count) //显示小数点
{
P1 |= 1 << 7;
}
}
return num;
}
//延时函数
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
```
在上面的代码中,使用get_float_number函数获取小数值。在函数中,通过循环调用key_scan函数来扫描按键。如果检测到按键按下,根据按键值来更新小数值和小数点位置。同时,在显示小数值时,根据小数点位置来显示小数点。在主函数中,不断调用get_float_number函数获取小数值,并将其输出到P1口。请注意,由于单片机的计算精度有限,输入的小数值可能会存在误差。
阅读全文