51单片机八位数码管同时显示
时间: 2023-06-13 17:04:51 浏览: 151
51单片机使用8个数码管,在8个数码管上分别显示“12345678”这八个数字。
5星 · 资源好评率100%
51单片机八位数码管同时显示需要使用到多路数码管显示驱动芯片,如常用的TM1638、MAX7219等。以下是使用TM1638驱动芯片的示例代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit TM1638_DIO = P1^0; // 定义TM1638数据线引脚
sbit TM1638_CLK = P1^1; // 定义TM1638时钟线引脚
sbit TM1638_STB = P1^2; // 定义TM1638片选线引脚
uchar code DIGITS[] = { // 定义数字0-9、A-F的编码
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f,
0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
void delay(uint ms) // 延时函数
{
uint i, j;
for(i=0; i<ms; i++)
for(j=0; j<125; j++);
}
void TM1638_SendByte(uchar data) // 发送一个字节数据
{
uchar i;
for(i=0; i<8; i++) {
TM1638_DIO = (data & 0x01);
data >>= 1;
TM1638_CLK = 1;
_nop_();
_nop_();
TM1638_CLK = 0;
}
}
void TM1638_SendCommand(uchar command) // 发送命令
{
TM1638_STB = 0;
TM1638_SendByte(command);
TM1638_STB = 1;
}
void TM1638_Init() // 初始化TM1638
{
TM1638_SendCommand(0x8f); // 打开显示,设置亮度为最高
TM1638_SendCommand(0x44); // 设置地址自动加1
TM1638_STB = 0;
TM1638_SendByte(0xc0); // 设置起始地址为0
for(uchar i=0; i<16; i++)
TM1638_SendByte(0x00); // 清空显示缓存
TM1638_STB = 1;
}
void TM1638_Display(uchar* digits) // 显示函数
{
TM1638_STB = 0;
TM1638_SendByte(0xc0); // 设置起始地址为0
for(uchar i=0; i<8; i++) {
TM1638_SendByte(digits[i]); // 发送显示数据
TM1638_SendByte(DIGITS[10+i]); // 发送小数点数据(没有小数点可省略)
}
TM1638_STB = 1;
}
void main()
{
uchar digits[8] = { // 要显示的数字
1, 2, 3, 4, 5, 6, 7, 8
};
TM1638_Init(); // 初始化TM1638
while(1) {
TM1638_Display(digits); // 显示数字
delay(100); // 延时100ms
}
}
```
在上述代码中,通过定义TM1638_DIO、TM1638_CLK、TM1638_STB三个引脚来控制TM1638驱动芯片的数据、时钟和片选信号。在TM1638_Init()函数中,设置了TM1638的工作模式、亮度和起始地址,并清空了显示缓存。在TM1638_Display()函数中,通过循环发送8位数字数据和小数点数据来实现八位数码管的显示。在主函数中,循环调用TM1638_Display()函数并延时100ms来更新显示内容。
阅读全文