日志档案

发表于 2007-8-24 8:47:56

0

标签: LED  动态扫描  

LED数码管动态扫描显示数字(C语言)

  1. #include <reg51.h>
  2. sbit P00 = P0 ^ 0;
  3. sbit P01 = P0 ^ 1;
  4. sbit P02 = P0 ^ 2;
  5. sbit P03 = P0 ^ 3;
  6. int DATA_LED[11] =
  7. {
  8.    //0~9的数码管段码 A0H,BBH,62H,2AH,39H,2CH,24H,BAH,20H,28H   根据具体电路而定,不通用
  9.    0xA0,  //0
  10.    0xBB,  //1
  11.    0x62,  //2
  12.    0x2A,  //3
  13.    0x39,  //4
  14.    0x2C,  //5
  15.    0x24,  //6
  16.    0xBA,  //7
  17.    0x20,  //8
  18.    0x28,  //9
  19.    0xFF
  20. };
  21. void delay(int m)   //延时程序,延时m*0.5毫秒
  22. {
  23.    unsigned int i;
  24.    unsigned int j;
  25.    for (i = 0; i < m; i++)
  26.    {
  27.      for (j = 0; j < 500; j++){}
  28.    }
  29. }
  30. void led(int n)    //数码管显示及数据处理程序
  31. {
  32.    P1 = 0xFF;
  33.    P1 = DATA_LED[n % 10];  //个位
  34.    P00 = 0;
  35.    delay(1);
  36.    P00 = 1;
  37.    P1 = 0xFF;
  38.    P1 = DATA_LED[n / 10 % 10];  //十位
  39.    P01 = 0;
  40.    delay(1);
  41.    P01 = 1;
  42.    P1 = 0xFF;
  43.    P1 = DATA_LED[n / 100 % 10];   //百位
  44.    P02 = 0;
  45.    delay(1);
  46.    P02 = 1;
  47.    P1 = 0xFF;
  48.    P1 = DATA_LED[n / 1000 % 10];   //千位
  49.    P03 = 0;
  50.    delay(1);
  51.    P03 = 1;
  52. }
  53. void main(void)
  54. {
  55.    while (1)
  56.    {
  57.      led(404);  //显示数字404,实际显示的是0404,需要在led()函数中判断,没有千位的情况,不是让显示成0
  58.    }
  59. }

      原理很简单,这是LED动态显示方式, 当P1为高电平,P0为低电平是,灯就亮。显示写成了函数led(),调用很方便,这个还没有解决小数的问题,不过,把原理弄懂了,其他的理解起来就会很快了。

     我这里是给P1赋值, 例如P1=0xBB,换成二进制,P1=10111011,可以看出刚好是八位,那P1^0=1;P1^1=1,P1^2=0…… ,不用分别给每个口赋值,把这个理解了就懂了。

   P1 = 0xFF; //每次一定要重新赋值,不然可能会出现显示全是8的情况


   P1 = DATA_LED[n / 1000 % 10];    //千位的数字对应的数码管段码


   P03 = 0;     //前面有定义 sbit P03 = P0 ^ 3,就是把P0.3接低电平


   delay(1);    //采用空循环执行延时1*0.5毫秒,再关闭显示下一位,利用人眼的视觉滞留,这种动态变换就感觉不到了,12MHz的晶体振荡器


   P03 = 1;   //每次显示完了一定要接高电平,不然会显示成全是8

系统分类: 单片机   |   用户分类: 程序设计   |   来源: 整理   |   【推荐给朋友】

    阅读(1539)    回复(1)  

投一票您将和博主都有获奖机会!

  • wjfziliao@163.com

    2008-1-16 15:14:34

    实际情况下,没法用啊

    能给一个好用的吗