51单片机按键输入2-4位的两个正整数用数码管先显示最大公约数2s,然后显示最小公倍数2s,然后显示约数个数2s, 最后显示这个数的平方根,可以为小数,依次循环的代码
时间: 2023-10-02 08:06:51 浏览: 139
以下是基于51单片机的按键输入2-4位的两个正整数用数码管先显示最大公约数2s,然后显示最小公倍数2s,然后显示约数个数2s,最后显示这个数的平方根,可以为小数,依次循环的代码:
```c
#include <reg52.h>
#include <math.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
sbit button = P3^2;
uchar code table[] = { // 字符表
0xc0, // 0
0xf9, // 1
0xa4, // 2
0xb0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xf8, // 7
0x80, // 8
0x90, // 9
};
void delay(uint x) { // 延迟函数
uint i, j;
for (i = x; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void display(uchar num) { // 数码管显示函数
LSA = table[num/1000]; // 千位
LSB = table[num%1000/100]; // 百位
LSC = table[num%100/10]; // 十位
P2 = table[num%10]; // 个位
}
uchar getGcd(uchar a, uchar b) { // 获取最大公约数
uchar temp;
while (b != 0) {
temp = b;
b = a % b;
a = temp;
}
return a;
}
uchar getLcm(uchar a, uchar b) { // 获取最小公倍数
return a * b / getGcd(a, b);
}
uchar getDivisorCount(uchar num) { // 获取约数个数
uchar i, count = 0;
for (i = 1; i <= num; i++) {
if (num % i == 0) {
count++;
}
}
return count;
}
float getSqrt(uchar num) { // 获取平方根
return sqrt(num);
}
void main() {
uchar num1, num2;
float result;
while (1) {
if (button == 0) { // 判断按键是否按下
delay(10); // 延迟去抖动
if (button == 0) { // 再次判断是否按下
num1 = P1; // 获取第一个数
while (button == 0); // 等待按键释放
delay(10); // 延迟去抖动
if (button == 0) { // 判断是否按下
num2 = P1; // 获取第二个数
while (button == 0); // 等待按键释放
display(getGcd(num1, num2)); // 显示最大公约数
delay(2000); // 显示2s
display(getLcm(num1, num2)); // 显示最小公倍数
delay(2000); // 显示2s
display(getDivisorCount(num1)); // 显示约数个数
delay(2000); // 显示2s
result = getSqrt(num1); // 获取平方根
display(result * 100); // 显示平方根
delay(2000); // 显示2s
}
}
}
}
}
```
需要注意的是,该代码中使用了数码管进行数值的显示,需要根据具体连接方式进行调整。另外,由于51单片机没有浮点数运算功能,因此在获取平方根时直接使用了math库中的sqrt函数,最后将结果乘以100后进行显示。
阅读全文