void TM1638_LEDCC(unsigned char LEDnums) { unsigned char i; TM1638_WriteCOM(0x40); // 设置地址自增 STB=0; // 拉低片选线,开始写数据 TM1638_Write(0xc0); // 写首地址 for(i=0; i<LEDnums; i++) { // 写显示数据 TM1638_Write(led_buffer[i]); TM1638_Write(led_buffer[i+8]); } for(i=LEDnums; i<8; i++) { TM1638_Write(0); TM1638_Write(0); } STB=1;
时间: 2023-05-22 21:06:56 浏览: 37
这是一个基于 TM1638 的 LED 控制函数,通过向 TM1638 发送指令和数据来控制 LED 的亮灭。函数的参数 LEDnums 表示要控制的 LED 的数量,led_buffer 是一个数组,存储着要显示的 LED 图案的数据。函数的具体实现是先写入地址,再将 LED 的显示数据写入到指定的地址中,最后将剩余的地址填充为 0。
相关问题
用51单片机控制tm1638 显示实时变化的电压和电流 的代码
好的,下面是一个简单的示例代码,用于控制TM1638显示实时变化的电压和电流。请注意,这只是一个示例代码,你需要根据具体的硬件和需求进行修改和优化。
```
#include <reg51.h>
// 定义TM1638引脚
sbit TM1638_DIO = P1^0;
sbit TM1638_CLK = P1^1;
sbit TM1638_STB = P1^2;
// 定义电压和电流引脚
sbit VOLTAGE_PIN = P2^0;
sbit CURRENT_PIN = P2^1;
// 定义变量
unsigned int voltage = 0;
unsigned int current = 0;
// TM1638初始化函数
void TM1638_Init()
{
TM1638_STB = 1;
TM1638_CLK = 0;
TM1638_DIO = 0;
TM1638_SendCommand(0x8f); // 显示模式设置,开启显示
TM1638_SendCommand(0x40); // 地址设置,从地址00开始
TM1638_SendCommand(0x80); // 设置亮度
}
// TM1638发送命令函数
void TM1638_SendCommand(unsigned char command)
{
unsigned char i;
TM1638_STB = 0;
for (i = 0; i < 8; i++)
{
TM1638_CLK = 0;
TM1638_DIO = (command & 0x01);
command >>= 1;
TM1638_CLK = 1;
}
}
// TM1638发送数据函数
void TM1638_SendData(unsigned char address, unsigned char data)
{
TM1638_STB = 0;
TM1638_SendCommand(0x44);
TM1638_STB = 0;
TM1638_SendCommand(0xC0 | address);
TM1638_SendCommand(data);
TM1638_STB = 1;
}
// 读取电压函数
unsigned int ReadVoltage()
{
unsigned int voltage = 0;
// 读取电压值,并进行处理
// 这里需要根据具体的电路和传感器来进行实现
// 这里简单地将读取到的模拟值乘以10,得到电压值
voltage = ADC_Read(0) * 10;
return voltage;
}
// 读取电流函数
unsigned int ReadCurrent()
{
unsigned int current = 0;
// 读取电流值,并进行处理
// 这里需要根据具体的电路和传感器来进行实现
// 这里简单地将读取到的模拟值乘以100,得到电流值
current = ADC_Read(1) * 100;
return current;
}
// 主函数
void main()
{
TM1638_Init(); // 初始化TM1638
while(1)
{
voltage = ReadVoltage(); // 读取电压值
current = ReadCurrent(); // 读取电流值
// 将电压值和电流值转换成需要显示的数据
// 这里简单地将电压值和电流值转换成4位数字进行显示
TM1638_SendData(0, voltage / 1000);
TM1638_SendData(1, (voltage / 100) % 10);
TM1638_SendData(2, (voltage / 10) % 10);
TM1638_SendData(3, voltage % 10);
TM1638_SendData(4, current / 1000);
TM1638_SendData(5, (current / 100) % 10);
TM1638_SendData(6, (current / 10) % 10);
TM1638_SendData(7, current % 10);
}
}
```
以上代码只是一个简单的示例,具体的实现过程还需要根据你使用的具体硬件和传感器进行调整和修改。希望这个示例代码能够对你有所帮助。
用51单片机控制tm1638 显示实时电压
好的,我会尽力回答您的问题。首先,您需要连接51单片机和TM1638模块。接下来,您需要编写程序来读取电压并将其显示在TM1638上。
以下是一个示例程序,用于读取电压并将其显示在TM1638上:
```c
#include <reg51.h>
#define CLK P3_6
#define DIO P3_5
#define STB P3_4
void delay(unsigned int i)
{
while(i--);
}
void TM1638_Write(unsigned char data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
CLK = 0;
DIO = (data & 0x01);
data >>= 1;
CLK = 1;
}
}
void TM1638_Init(void)
{
STB = 0;
TM1638_Write(0x8f);
STB = 1;
}
void TM1638_Display(unsigned char *p)
{
unsigned char i;
STB = 0;
TM1638_Write(0x40);
for(i = 0; i < 8; i++)
{
TM1638_Write(p[i]);
}
STB = 1;
}
unsigned int Get_ADC_Result(void)
{
unsigned int val;
ADC_CONTR = 0x80; //启动ADC转换
while(!(ADC_CONTR & 0x20)); //等待转换完成
val = ADC_RES;
val = (val << 2) + ADC_RESL;
return val;
}
void main()
{
unsigned char i;
unsigned int voltage;
unsigned char display_buf[8];
TM1638_Init();
while(1)
{
voltage = Get_ADC_Result();
voltage = voltage * 5 / 1024; //换算成电压,单位为V
display_buf[0] = 0x3f;
display_buf[1] = 0x06;
display_buf[2] = 0x5b;
display_buf[3] = 0x4f;
display_buf[4] = 0x66;
display_buf[5] = 0x6d;
display_buf[6] = 0x7d;
display_buf[7] = 0x07;
for(i = 0; i < 8; i++)
{
if(i == 2)
{
display_buf[i] = 0x00; //清空小数点
}
else if(i == 4)
{
display_buf[i] = 0x00; //清空单位
}
else if(i == 6)
{
display_buf[i] = 0x00; //清空千位
}
else if(i == 7)
{
display_buf[i] = voltage % 10; //个位
}
else
{
display_buf[i] = voltage / 10; //十位、百位
voltage /= 10;
}
display_buf[i] = display_buf[i] | 0x80; //打开对应的LED
}
TM1638_Display(display_buf);
delay(10000);
}
}
```
在这个程序中,我们使用了51单片机的ADC模块来读取电压值,并使用TM1638模块来显示电压值。我们将电压值乘以5并除以1024,以将其转换为电压值。我们还使用了TM1638的LED来显示电压值的小数点和单位,并使用7个数码管来显示电压值的整数部分。我们每100ms更新一次显示值。
希望这个程序能对您有所帮助!