在51单片机的数码管的应用开发中一些小的细节还是应该注意到的。

其中位选信号应该在段选之前打开,下面是一段示例代码(我用的是国信长天开发板):

  1. #include<reg51.h>  //   包含51单片机寄存器定义的头文件  
  2. #include<intrins.h> 
  3. #define uint unsigned int       
  4. sbit buzz=P0^6; 
  5. /**************************************************  
  6. 函数功能:d延时函数,延时一段时间  
  7. ***************************************************/  
  8.   void delay(int x)          //延时Xms 
  9. {  
  10.    uint i,j;  
  11.    for(i=0;i<x;i++)  
  12.     for(j=0;j<120;j++);         //大约1ms 
  13.            
  14. }  
  15. /**************************************************  
  16. 函数功能:主函数  
  17. ***************************************************/  
  18. void main(void)  
  19. {  
  20.   unsigned char temp;  
  21.   unsigned char code  
  22.   Tab[]={0x80,0xc0,0xc6,0x92,0xf9};     
  23.                //数码管显示0~9的段码表,程序运行中当数组值不发生变化时 
  24.                //前面加关键字code ,可以大大节约单片机的存储空间  
  25.   P2=0xa0;     //令蜂鸣器的锁存器打开 
  26.   buzz=0;      //关闭蜂鸣器               
  27.   temp=0x01;      //设定中间变量temp 
  28.   while(1)      //无限循环  
  29.    { int i;    
  30.      for(i=0;i<5;i++)  
  31.       {       
  32.          P2=0xc0;      //位选,令com公共端的锁存器打开 
  33.          P0=temp;      //控制哪个数码管亮 
  34.  
  35.              P2=0xe0;     //令数码管的锁存器打开 
  36.                  P0=Tab[i];            //让P0口输出数字的段码  
  37.  
  38.           //   temp=temp<<1;       //左移一位 与下句效果效果相同 
  39.          temp=_crol_(temp,1);  //左移一位 
  40.          delay(100);          //调用延时函数  
  41.        }     
  42.       temp=0x01;              //当移到最左端时,再设定temp,重新开始 
  43.    }   
  44. }  
  45.   

由于段选信号,位选信号都是从P0端送出,所以在同一时刻只能是输出位选信号或者是段选信号。此刻位选,段选的刷新频率是一致的。

就本例来说,段选信号的作用在delay(3)的时刻分别显示8,0,C,5,1。既是说假如八个数码管同时选通,那么显示的是8 0 C 5 1依次间隔delay(3)时间的显示。 位选的作用就是让不同的数码管显示不同的字段,本身在一个时刻只能显示一个数码管,结果整个效果是五个数码管显示80C51,ps:如果扫描6个数码管那么显示的就是80c518.