51单片机按键输入2-4位的两个数, 用数码管先显示最大公约数2s,然后显示最小公倍数2s,然后显示约数个数2s, 最后显示这个数的平方根,可以为小数,依次循环的代码
时间: 2023-09-28 22:11:57 浏览: 62
51单片机4位数码管按键显示
下面是基于51单片机的按键输入2-4位数的最大公约数、最小公倍数、约数个数和平方根的循环代码。其中,使用了数码管进行显示。
```c
#include <reg51.h>
#include <math.h>
// 定义数码管连接的端口
#define DIGIT_PORT P0
// 定义数码管连接的共阴极
#define DIGIT_COMMON 0
// 定义按键连接的端口
#define KEY_PORT P1
// 定义数码管显示的数字
unsigned char digits[] = {
// 0~9
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
// A~F
0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
};
// 定义延时函数
void delay(unsigned int t) {
unsigned int i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 125; j++);
}
// 定义数码管显示函数
void display(unsigned char data) {
DIGIT_PORT = digits[data];
delay(1);
}
// 定义获取按键输入的函数
unsigned int getKeyInput() {
unsigned int value = 0;
unsigned char key;
do {
// 读取按键输入
key = KEY_PORT & 0xf0;
// 判断是否有按键按下
if(key != 0xf0) {
delay(5);
key = KEY_PORT & 0xf0;
if(key != 0xf0) {
// 获取按键对应的数字
key = KEY_PORT & 0xf0;
switch(key) {
case 0xe0: value = value * 10 + 1; break;
case 0xd0: value = value * 10 + 2; break;
case 0xb0: value = value * 10 + 3; break;
case 0x70: value = value * 10 + 4; break;
}
// 显示输入的数字
display(value % 10);
}
}
} while(value < 10 || value > 9999);
return value;
}
// 定义求最大公约数的函数
unsigned int gcd(unsigned int a, unsigned int b) {
unsigned int t;
while(b != 0) {
t = b;
b = a % b;
a = t;
}
return a;
}
// 定义求最小公倍数的函数
unsigned int lcm(unsigned int a, unsigned int b) {
return a * b / gcd(a, b);
}
// 定义求约数个数的函数
unsigned int divisorCount(unsigned int n) {
unsigned int i, count = 0;
for(i = 1; i <= n; i++) {
if(n % i == 0)
count++;
}
return count;
}
// 定义求平方根的函数
float squareRoot(unsigned int n) {
return sqrt(n);
}
void main() {
unsigned int value;
unsigned int i, j;
while(1) {
// 获取输入的数字
value = getKeyInput();
// 显示最大公约数
for(i = 0; i < 2; i++) {
display(gcd(value, value / 2));
delay(500);
}
// 显示最小公倍数
for(i = 0; i < 2; i++) {
display(lcm(value, value / 2));
delay(500);
}
// 显示约数个数
for(i = 0; i < 2; i++) {
display(divisorCount(value));
delay(500);
}
// 显示平方根
float result = squareRoot(value);
unsigned int integerPart = (unsigned int)result;
unsigned int decimalPart = (unsigned int)((result - integerPart) * 100);
for(i = 0; i < 2; i++) {
display(integerPart % 10);
delay(500);
display(10); // 显示小数点
delay(500);
display(decimalPart % 10);
delay(500);
}
}
}
```
需要注意的是,在求平方根时,使用了math.h头文件中的sqrt函数,因此需要在编译时链接该库。
阅读全文