数码管:数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。管中充以低压气体,通常大部分为氖加上一些汞和/或氩。给某一个阴极充电,数码管就会发出颜色光,视乎管内的气体而定,一般都是橙色或绿色
在进行相关程序下载之前,需要先对开发板的各种跳线进行设置
- 确保数码管上方的两个条线正常插入
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个数码管的显示情况
来源:https://blog.csdn.net/Wangguang_/article/details/102775148