51单片机数码管动态扫描C程序

#include <reg51.h>

sbit P00 = P0 ^ 0;
sbit P01 = P0 ^ 1;
sbit P02 = P0 ^ 2;
sbit P03 = P0 ^ 3;

int DATA_LED[11] =
{
//0~9的数码管段码 A0H,BBH,62H,2AH,39H,2CH,24H,BAH,20H,28H   根据具体电而定,不通用
   0xA0,   //0
   0xBB,   //1
   0x62,   //2
   0x2A,   //3
   0x39,   //4
   0x2C,   //5
   0x24,   //6
   0xBA,   //7
   0x20,   //8
   0x28,   //9
   0xFF
};

void delay(int m)   //延时程序,延时m*0.5毫秒
{
   unsigned int i;
   unsigned int j;
   for (i = 0; i < m; i++)
   {
     for (j = 0; j < 500; j++){}
   }
}

void led(int n)     //数码管显示及数据处理程序
{
   P1 = 0xFF;
   P1 = DATA_LED[n % 10];   //个位
   P00 = 0;
   delay(1);
   P00 = 1;

   P1 = 0xFF;
   P1 = DATA_LED[n / 10 % 10];   //十位
   P01 = 0;
   delay(1);
   P01 = 1;

   P1 = 0xFF;
   P1 = DATA_LED[n / 100 % 10];   //百位
   P02 = 0;
   delay(1);
   P02 = 1;

   P1 = 0xFF;
   P1 = DATA_LED[n / 1000 % 10];   //千位
   P03 = 0;
   delay(1);
   P03 = 1;
}

void main(void)
{
   while (1)
   {
     led(404);   //显示数字404,实际显示的是0404,需要在led()函数中判断,没有千位的情况,不是让显示成0
}
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一份蓝桥杯单片机数码管定时器动态扫描的参考代码,供大家参考。 ```c #include <reg51.h> //头文件 // 数码管位选信号 unsigned char code LED_W[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; // 数码管段选信号 unsigned char code LED_D[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 }; // 定时器中断服务函数 void Timer0_ISR() interrupt 1 { static unsigned char count = 0; // 计数器 static unsigned char index = 0; // 位选信号索引,表示当前显示的是哪一位数码管 count++; // 计数器加1 if (count >= 100) { // 计数器达到100时,表示100ms已经过去了 count = 0; // 计数器清零 P0 = LED_W[index]; // 先将位选信号输出到P0口 P2 = LED_D[index]; // 再将对应的段选信号输出到P2口 index = (index + 1) % 8; // 索引加1,循环显示8个数码管 } } void main() { TMOD = 0x01; // 定时器0工作在模式1,16位定时器 TH0 = 0xFC; // 定时器初值,定时1ms TL0 = 0x66; ET0 = 1; // 允许定时器0中断 EA = 1; // 允许总中断 TR0 = 1; // 启动定时器0 while(1); // 主函数空循环,等待中断触发 } ``` 该代码中,通过定时器0产生1ms的中断,然后在中断服务函数中动态扫描8个数码管。其中,`LED_W`为数码管的位选信号,`LED_D`为数码管的段选信号。在每次中断服务函数中,先输出位选信号,再输出对应的段选信号,就可以实现数码管动态扫描了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值