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

2007-8-24 08:47 6392 5 2 分类: MCU/ 嵌入式

  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

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

wb_chen_387386550 2018-8-18 07:57

怎么显示异常?
相关推荐阅读
用户741296 2008-10-08 10:31
在搞51跑TCP/IP的东西……
    换了工作,也换了城市。    在这个公司,开始着手整51跑TCP/IP的东西,感觉好费劲!但必须整,这对自己也是个提高啊!     以后在ARM中也会用到TCP这一块,不如提前整整,先给后面最...
用户741296 2008-08-28 15:28
ASN.1学习笔记
ASN.1即抽象语法符号,用来定义应用程序数据和表示协议数据单元的抽象语言。优点是独立于机器、语言及应用程序的内部表示。适用于描述现代通信中复杂的、变化的、可扩展的数据结构。比如3G和VoIP均采用了...
用户741296 2008-07-16 16:26
辞职了!哈哈……
 辞职了!这是最后一次以这家公司员工的身份这里发帖。心里轻松许多……虽然辞职了,但心里是非常喜悦的!离开了这个让自己心里非常不爽的公司。但有一点不可否认,就是我在这里学到了很多。我不是忘恩负义,只是这...
用户741296 2008-04-11 15:00
这个项目终于接近尾声了!
    又是很久沒有發日誌了!    主要是由於這段時間忙著趕一個項目。終於算是接近尾聲了,因為現在正在測試,肯定後面還有一些工作要做。    這個項目其實也沒有什麽,通過雙串口實現上下行的通訊連接,...
用户741296 2008-02-29 15:54
好久没有写东西了!
    好久没有在这里写东西了,想写点什么。那就汇总一下近来的工作吧!    年前一段时间一直在整SD卡的相关工作,其实很早一段时间就开始整了,只是没有东西才没有及时动手,但一直在研究相关资料。所以,...
用户741296 2008-01-02 10:59
崭新的2008已经开始!
    崭新的2008已经开始!    在2008,世界瞩目中国。2008是属于中国的!北京奥运会,将会把中国带向世界,也会把世界带回中国。    让我们在2008,让中国在2008,展现自我,展现辉...
我要评论
1
5
关闭 站长推荐上一条 /3 下一条