帮我写一个关于89c51利用protetus仿真数码管可以任意显示0-9的8位数字的keil5程序(电路选用两个7seg-cc共阴极四位数码管和89c51单片机,程序要求有unsigned char 和取余和除字符函数)
时间: 2024-09-23 19:02:07 浏览: 45
单片机一位数码管循环显示0~9实验_into3fo_51仿真_
5星 · 资源好评率100%
在Keil uVision 5环境下编写89C51单片机(如8051)控制共阴极数码管显示0-9的程序,通常会涉及到七段码显示器的理解以及基本的I/O操作。这里是一个简化的示例代码,使用unsigned char和取余数、除法运算符功能:
```c
#include <reg51.h> // 引入8051寄存器库
// 定义数码管的段地址
#define SEG_0 P0_0
#define SEG_1 P0_1
#define SEG_2 P0_2
#define SEG_3 P0_3
#define SEG_4 P0_4
#define SEG_5 P0_5
#define SEG_6 P0_6
#define SEG_7 P0_7
#define SEG_DP P2_0 // 数码管小数点
// 取余数和整除函数
unsigned char divide(unsigned int dividend, unsigned int divisor) {
return dividend / divisor;
}
unsigned char modulo(unsigned int dividend, unsigned int divisor) {
return dividend % divisor;
}
void displayNumber(unsigned char num) {
// 共阴极数码管显示逻辑
if (num >= 10) { // 十位
SEG_DP = 0; // 小数点关闭
switch(num / 10) {
case 1: SEG_4 = 1; break; // 1
case 2: SEG_2 = 1; break; // 2
case 3: SEG_3 = 1; break; // 3
case 4: SEG_4 = 1; SEG_7 = 1; break; // 4
case 5: SEG_5 = 1; break; // 5
case 6: SEG_6 = 1; break; // 6
case 7: SEG_7 = 1; break; // 7
case 8: SEG_6 = 1; SEG_7 = 1; break; // 8
case 9: SEG_6 = 1; break; // 9
}
} else { // 个位
SEG_DP = 1; // 小数点打开
switch(num) {
case 0: SEG_0 = 1; break;
case 1: SEG_1 = 1; break;
case 2: SEG_2 = 1; break;
case 3: SEG_3 = 1; break;
case 4: SEG_4 = 1; break;
case 5: SEG_5 = 1; break;
case 6: SEG_6 = 1; break;
case 7: SEG_7 = 1; break;
}
}
}
int main(void) {
while(1) {
// 示例:循环显示从0到9
for(unsigned char i = 0; i <= 9; ++i) {
displayNumber(i);
__delay_ms(100); // 稍微延时,方便观察变化
}
}
return 0;
}
阅读全文