在51单片机的数码管的应用开发中一些小的细节还是应该注意到的。
其中位选信号应该在段选之前打开,下面是一段示例代码(我用的是国信长天开发板):
- #include<reg51.h> // 包含51单片机寄存器定义的头文件
- #include<intrins.h>
- #define uint unsigned int
- sbit buzz=P0^6;
- /**************************************************
- 函数功能:d延时函数,延时一段时间
- ***************************************************/
- void delay(int x) //延时Xms
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<120;j++); //大约1ms
- }
- /**************************************************
- 函数功能:主函数
- ***************************************************/
- void main(void)
- {
- unsigned char temp;
- unsigned char code
- Tab[]={0x80,0xc0,0xc6,0x92,0xf9};
- //数码管显示0~9的段码表,程序运行中当数组值不发生变化时
- //前面加关键字code ,可以大大节约单片机的存储空间
- P2=0xa0; //令蜂鸣器的锁存器打开
- buzz=0; //关闭蜂鸣器
- temp=0x01; //设定中间变量temp
- while(1) //无限循环
- { int i;
- for(i=0;i<5;i++)
- {
- P2=0xc0; //位选,令com公共端的锁存器打开
- P0=temp; //控制哪个数码管亮
- P2=0xe0; //令数码管的锁存器打开
- P0=Tab[i]; //让P0口输出数字的段码
- // temp=temp<<1; //左移一位 与下句效果效果相同
- temp=_crol_(temp,1); //左移一位
- delay(100); //调用延时函数
- }
- temp=0x01; //当移到最左端时,再设定temp,重新开始
- }
- }
由于段选信号,位选信号都是从P0端送出,所以在同一时刻只能是输出位选信号或者是段选信号。此刻位选,段选的刷新频率是一致的。
就本例来说,段选信号的作用在delay(3)的时刻分别显示8,0,C,5,1。既是说假如八个数码管同时选通,那么显示的是8 0 C 5 1依次间隔delay(3)时间的显示。 位选的作用就是让不同的数码管显示不同的字段,本身在一个时刻只能显示一个数码管,结果整个效果是五个数码管显示80C51,ps:如果扫描6个数码管那么显示的就是80c518.