下面是一个基于Keil开发环境的C51单片机程序,用于实现数码管显示1到9999的变化:
#include <reg51.h>
sbit digit1 = P2^0; // 数码管第一位
sbit digit2 = P2^1; // 数码管第二位
sbit digit3 = P2^2; // 数码管第三位
sbit digit4 = P2^3; // 数码管第四位
unsigned char code digit_table[] =
{
// 0 ~ 9 数码管段码值
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
void display(unsigned int number)
{
unsigned int digit;
digit4 = 1; // 选择第四位数码管
digit3 = 0;
digit2 = 0;
digit1 = 0;
digit = number % 10; // 获取个位数
P1 = digit_table[digit]; // 显示个位数
delay(500); // 显示持续一段时间
digit4 = 0; // 选择第三位数码管
digit3 = 1;
digit2 = 0;
digit1 = 0;
digit = (number / 10) % 10; // 获取十位数
P1 = digit_table[digit]; // 显示十位数
delay(500); // 显示持续一段时间
digit4 = 0; // 选择第二位数码管
digit3 = 0;
digit2 = 1;
digit1 = 0;
digit = (number / 100) % 10; // 获取百位数
P1 = digit_table[digit]; // 显示百位数
delay(500); // 显示持续一段时间
digit4 = 0; // 选择第一位数码管
digit3 = 0;
digit2 = 0;
digit1 = 1;
digit = (number / 1000) % 10; // 获取千位数
P1 = digit_table[digit]; // 显示千位数
delay(500); // 显示持续一段时间
}
void delay(unsigned int time)
{
unsigned int i, j;
for(i=0;i<time;i++)
for(j=0;j<120;j++);
}
void main()
{
unsigned int number = 1;
while(1)
{
display(number); // 显示当前数值
number++; // 数值递增
if(number > 9999)
number = 1; // 数值重置为1
}
}
这个程序使用P1
端口连接到数码管的段选引脚,P2^0
到P2^3
连接到数码管的位选引脚。digit_table
数组保存了0到9的数码管段码值。
display()
函数根据传入的数值,依次选择数码管的位,计算对应的数位,并在对应的数码管上显示。delay()
函数用于延时一段时间以显示数值。
在main()
函数中,通过循环不断递增number
数值,并调用display()
函数显示数值。当number
大于9999时,重新置为1。这样就实现了在数码管上显示1到9999的变化功能。