51单片机 数码管的显示与译码器
共阳极数组0~9:display[]={0xC0,0xF9,0xA4,0xB0,0x91,0xA2,0x82,0xF8,0x80,0x90}
共阳极数组A~F:display[]={0x88,0x83,0xA6,0xC1,0x86,0x8E}
共阴极数组0~9:display[]={0x3F,0x06,0x5B,0x4F,0x6E,0x6D,0x7D,0x07,0x7F,0x6F}
共阴极数组A~F:display[]={0x77,0x7C,0x59,0x3E,0x79,0x71}
共阴、两组四位一体数码管,位选接74LS138译码器,输入(位选)CBA接P20,P21,P22。段选通过74573后接P1口。
若不使用译码器,可直接将位选段接IO口,赋值改变。
/*******************************************************************************
* 实 验 名 : 动态数码管显示
* 实验说明 : 8位数码管依次显示0~7
* 作 者 : L2
* 时 间 : 2016-08-02
*******************************************************************************/
#include<reg51.h>
#define GPIO_DIG P1 //Digitron 数码管
sbit LSA= P2^0;
sbit LSB= P2^1;
sbit LSC= P2^2;
unsigned char code DIG_CODE[10]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9的显示码
void DigDisplay();
void main(void)
{
while(1)
DigDisplay();
}
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
GPIO_DIG=DIG_CODE[i];//发送段码
j=10000; //扫描间隔时间设定,若减少j,可观察到稳定显示的0~7 (扫描速度太快,人眼识别不了)
while(j--);
GPIO_DIG=0x00;//消隐
}
}