CT107D竞赛板数码管的基础了解和应用

发布时间 2024-01-01 20:59:09作者: 跃升体

经LED和蜂鸣器的学习
译码器已经有了一定了解
这板子的数码管是共阳的
共阳:所有二极管阳极接一起形成com口
Y6控制位数 Y7控制段码


数码管是由一段段的LED组成

由这两图知通过寄存器可控制段码
由此实现数码管所显示的内容
列:
已知共阳 所以P0口输入低电平
就可点亮数码管的LED

译码器的十六进制是从高往低的
列:
P07 P06 P05 P04 P03 P02 P01 P00
0 0 0 0 0 0 0 0
0X81=1000 0001
若要显示6
除B dp 外都要打开
B= P01
dp=P07
则为0x82



由上图的关系可选择数码管的位数

数码管动态
是通过利用人的视觉暂留和发光二级管的余辉效应使
轮流点亮的单个数码管实现多位数码管显示的效果

如何实现数码管的动态显示
一般要使数码管显示2018
在静态显示中则需要
位选四个数码管 位选com1 com2 com3 com4
在P0 P1 P2 P4 四个I/O口中
分别输入2 0 1 8的段码

在动态中则需
位选一个com1
向P0口输入2的段码
延迟20毫秒
再位选com2
向P0口输入0的段码
延迟20毫秒
再位选com3
向P0口输入1的段码
延迟20毫秒
再位选com4
向P0口输入8的段码
延迟20毫秒

若有 乱码 则要消影
消影:位选 段选 清零 位选 段选
清零:清零段选 加个一毫秒的延迟 否则灯会变暗
这样就实现数码管的动态显示
来显示2018

通过动态显示可更节省I/O口
来实现数码管的显示

静态代码

include<STC15F2K60S2.H>

unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0x86,0x8e,
0xbf,0x7f};

	 void delay(unsigned int t)
	 {
		 while(t--);
		 while(t--);
	 }
	 
	 void initHC138(unsigned char n)
		 {
			 switch(n)
			 {
				 case 4:
					 P2=(P2&0x1f) | 0x80;
				 break;
				 case 5:
					 P2=(P2&0x1f) | 0xa0;
				 break;
				 case 6:
					 P2=(P2&0x1f) | 0xc0;
				 break;
				 case 7:
					 P2=(P2&0x1f) | 0xe0;
				 break;
		 }
	 }
	 
	void showSMG_Bit(unsigned char dat,unsigned pos)
	 {
		 initHC138(6);//数码管位置
		 P0=0x01 << pos;
		 initHC138(7);//数码管内容
		 P0=dat;
	 }
	 
	 void SMG_Static()
	 {
		 unsigned char i,j;
		 for(i=0 ; 1<8; i++)
		 {
			 for(j=0; j<10; j++)
			 {
			 showSMG_Bit(SMG_duanma[j],i);
			 delay(60000);
			 
		 }
	 }
		  for(j=0; j<16; j++)
		{
		 initHC138(6);//数码管位置
		 P0=0xff;
			delay(60000);
		 initHC138(7);//数码管内容
		 P0=SMG_duanma[j];
			delay(60000);
    delay(60000);				
		 }
 }
	 
	 
	 
	 
	 void main ()
	 {
		 showSMG();
		 while(1)
		 {
			 
		 }
	 `

动态代码
`#include<STC15F2K60S2.H>

unsigned char yue = 1;
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
void selectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0X1f) | 0x80;
break;
case 5:
P2 = (P2 & 0X1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0X1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0X1f) | 0xe0;
break;
}

}

void DisplaySMG_Bit(unsigned char value, unsigned char pos)
{
selectHC573(6);
P0 = 0X01 << pos;
selectHC573(7);
P0 = value;

}

void DisplaySMG(unsigned int t)
{
while(t--);
}

void Display_Dynamic()
{
DisplaySMG_Bit(SMG_duanma[2],0);
DisplaySMG(500);
DisplaySMG_Bit(SMG_duanma[0],1);
DisplaySMG(500);
DisplaySMG_Bit(SMG_duanma[1],2);
DisplaySMG(500);
DisplaySMG_Bit(SMG_duanma[8],3);
DisplaySMG(500);

 DisplaySMG_Bit(SMG_duanma[16],4);
  DisplaySMG(500);
 DisplaySMG_Bit(SMG_duanma[16],5);
  DisplaySMG(500);
 
 DisplaySMG_Bit(SMG_duanma[yue/10],6);
  DisplaySMG(500);
 DisplaySMG_Bit(SMG_duanma[yue%10],7);
  DisplaySMG(500);

}

void Delay(unsigned char t)
{
while(t--);
{
Display_Dynamic();
}
}
void main ()
{
while(1)
{
Display_Dynamic();
yue++;
if(yue > 12)
{
yue = 1;
}
Delay(100);
}
}`