数码管原理和驱动程序

扶醉桌前 提交于 2019-12-02 14:30:00

数码管:数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。管中充以低压气体,通常大部分为氖加上一些汞和/或氩。给某一个阴极充电,数码管就会发出颜色光,视乎管内的气体而定,一般都是橙色或绿色

 

 

在进行相关程序下载之前,需要先对开发板的各种跳线进行设置

  1. 确保数码管上方的两个条线正常插入

  

    2.断开位于摇杆上方的CAN总线跳线(CAN所使用的I/O端口与数码管复用)

 

    3.断开核心板右侧三列跳线最左侧最后一行的跳线(扬声器跳线),否则将会产生杂音

       

 

数码管电路原理图(总图):

 

数码管部分详细电路图:

 

SCLK和DIN与TM1640芯片连接情况如下:

  • SCLK(时钟同步线)
  • DIN(数据线)

 

TM1640是LED(发光二极管)专用的驱动控制专用电路,内部集成有MCU数字接口、数据锁存器、LED驱动等电路,主要用于LED显示屏驱动;TM1640最大可驱动16位的8段数码管

 

 

数码管的两种显示方式:静态显示和动态显示

 

静态显示:静态显示是指每个数码管的每一段码都有一个I/O口对其驱动,其优点是编程简单,显示亮度高,缺点是占用I/O多

 

动态显示:动态显示是指将每个数码管的8个显示的同名端连接在一起,并且每个数码管的公共极增加位元控制电路,当开发板输出字形码时,所有的数码管接收到的字形码信息是相同的,但是具体哪个数码管显示字码由控制电路控制;控制电路通过分时控制,使得数码管轮流显示,每个数码管显示的时间为1~2ms,由于人眼的视觉暂留效应,尽管数码管并非同时显示,但是人眼观察到的就是稳定的显示,其优点是占用I/O少,功耗低,单软件编程更加复杂

 

数码管连接电路原理图

 

 

数码管上方的八个流水灯的连接方式如下图说示:

通过和上方数码管的连接方式可以推断出,其显示等效于一个数字位

 

主函数内容如下:

while(1){
	if(RTC_Get()==0){ //读出RTC时间
		TM1640_display(0,rday/10);	//天
		TM1640_display(1,rday%10+10);
		TM1640_display(2,rhour/10); //时
		TM1640_display(3,rhour%10+10);
		TM1640_display(4,rmin/10);	//分
		TM1640_display(5,rmin%10+10);
		TM1640_display(6,rsec/10); //秒
		TM1640_display(7,rsec%10);
		
		TM1640_led(c); //与TM1640连接的8个LED全亮
		c<<=1; //数据左移 流水灯
		if(c==0x00)c=0x01; //8个灯显示完后重新开始
		delay_ms(125); //延时
	}
}

 

主函数中的程序较为简单,主要是使用RTC_Get()读取RTC的值,再将该值显示

 

函数说明:TM1640_display()的功能是在数码管中显示数字,0~7为数码管编号,第二个参数为十进制数字0~9

注意:如果想要将数码管的小数点显示,只需将第二个参数 +10,例如:参数为11,将显示1.

如果想要数码管中内容不显示,第二个参数填入20即可

 

TM1640_led()函数的功能是控制数码管下方的LED灯显示,参数为16进制数(0x--),以控制8个led的显示

可以通过程序中以下语句实现流水灯的显示效果:

TM1640_led(c); //与TM1640连接的8个LED全亮
c<<=1; //数据左移 流水灯
if(c==0x00)c=0x01; //8个灯显示完后重新开始
delay_ms(125); //延时

 

 

TM1640的默认通信速度为1(最快),但是通信速度过快会导致通信不稳定

将0x88,  0x89,  0x8a,  0x8b,  0x8c,  0x8d,  0x8e,  0x8f其中一个数据在数码管初始化函数TM1640_Init函数中调用TM1640_write函数,即可调节数码管的亮度

 

疑问:为什么TM1640_write可以用来调节数码管的亮度?

该图为TM1640的官方文档给出的数码管写SRAM固定地址模式,由图可知,第一个写入的数据command1用以设置数据(数码管亮度),接下来写入的command2为写入数据data1的地址、接着写入data2、data3……

 

TM1640_display()函数的详细内容如下(定义语句位于TM1640.c文件中):

void TM1640_display(u8 address,u8 date){ //固定地址模式的显示输出
 	const u8 buff[21]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,
        0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00};
    
        //数字0~9及0~9加点显示段码表
        //---------------   0    1    2    3    4    5    6    7    
        8    9    0.   1.   2.   3.   4.   5.   6.   7.   8.   9.   无   
   
       TM1640_start();
       TM1640_write(0xC0+address);	         //传显示数据对应的地址
       TM1640_write(buff[date]);				 //传1BYTE显示数据
       TM1640_stop();
}

 

 

在该函数中,又调用了TM1640_write()函数,函数定义如下:

void TM1640_write(u8 date){	//写数据(低层)
	u8 i;
	u8 aa;
	aa=date;
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0)); //接口输出0	
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0)); //接口输出0	
	for(i=0;i<8;i++){
		GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0)); //接口输出0	
		delay_us(DEL);

		if(aa&0x01){
			GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(1)); //接口输出高电平1	
			delay_us(DEL);
		}else{
			GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0)); //接口输出0	
			delay_us(DEL);
		}
		GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(1)); //接口输出高电平1	
		delay_us(DEL);
		aa=aa>>1;
   }
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0)); //接口输出0	
	GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0)); //接口输出0	
}

 

程序使用for循环,使用>>将aa的值不断左移,循环8次来控制8个数码管的显示情况

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!