我要通过数码管来显示内容,所以我要先了解数码。
数码管有共阴极和共阳极两种,如果单片机直接驱动我会选共阴极。
数码管内部由发光二极管组成,所谓的共阴极就是同一位的8个发光二极管连接在一起,下图是简化成2位数码管的原理图。
我们先将数码管分为2部分,一个是控制显示内容,一个是控制显示位。
控制方式:
先把所有的显示脚(C1-C4)先设置为1,这样我们无论怎么改变显示内容,数码管都是灭的。
接下来我们把我们想显示的内容设置上去,比如1,那就是A和B都显示设置为1。
如果我们先在第一位显示,那C1=0;如果要在第三位显示那就是C3=0,其他保持1.
如果我们要4位显示不同的内容,那我们就要采取“扫描”。比如:我们要显示6789,那先在第一位显示“6”;
等1ms后,关闭,在第二位显示“7”
等1ms后,关闭,在第三位显示“8”
等1ms后,关闭,在第四位显示“9”
等1ms后,关闭,在第一位显示“6”
..
如此循环就可以看到“6789”
#
typedefunsignedcharuint8_t;
typedefunsignedintuint16_t;
typedefunsignedlonguint32_t;
uint16_tdisplay_t;//数码管切换用,0显示第一位,1显示第二位
uint32_ttime_1MS;//1ms计数
uint8_tLEDDI1[10]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F};
uint8_tLEDDI2[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
uint8_tLEDw[4];//显示数码管各位数值
//数码管显示共阴级
//从左到右位依次1,2,3,4
sbitLED_C1=P2^4;//位控制1
sbitLED_C2=P2^5;//位控制2
sbitLED_C3=P2^6;//位控制3
sbitLED_C4=P2^7;//位控制4
voidTimer0_Init(void)//1毫秒@11.0592MHz
{
AUXR|=0x80;//定时器时钟1T模式
TMOD=0xF0;//设置定时器模式
TL0=0xCD;//设置定时初值
TH0=0xD4;//设置定时初值
TF0=0;//清除TF0标志
TR0=1;//定时器0开始计时
ET0=1;//使能定时器0中断
EA=1;
}
voidTimer0_interrupt_handle(void)interrupt1//定时器中断处理
{
/*这部分暂时可以不用看
if((time_sys==2)||(time_sys==4))
{time_1MS++;
if(KEY1==0)
{time_1MS=time_1MS+100;
//if(time_OUT++2000)time_sys=5;
}
}
*/
if(display_t++=4)display_t=0;
switch(display_t)
{
case0:
LED_C1=1;LED_C2=1;LED_C3=1;LED_C4=1;
P1=LEDw[0];
LED_C1=0;
break;
case1:
LED_C1=1;LED_C2=1;LED_C3=1;LED_C4=1;
P1=LEDw[1];
LED_C2=0;
break;
case2:
LED_C1=1;LED_C2=1;LED_C3=1;LED_C4=1;
P1=LEDw[2];
LED_C3=0;
break;
case3:
LED_C1=1;LED_C2=1;LED_C3=1;LED_C4=1;
P1=LEDw[3];
LED_C4=0;
break;
}
}
voidmain(void)
{
//定时器初始化
Timer0_Init();
LEDw[0]=LEDDI1[6];
LEDw[1]=LEDDI1[7];
LEDw[2]=LEDDI1[8];
LEDw[3]=LEDDI1[9];
while(1)
{
/*
if(time_1MS10000)LEDw[0]=0;
elseLEDw[0]=LEDDI1[time_1MS/10000];
LEDw[1]=LEDDI1[time_1MS/1000%10];
LEDw[2]=LEDDI1[time_1MS/100%10];
LEDw[3]=LEDDI2[time_1MS/10%10];
*/
}
}
[免责声明]本文来源于网络,不代表本站立场,如转载内容涉及版权等问题,请联系我们会予以删除相关文章,保证您的权利。转载请注明出处






