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 07:06:56 浏览: 73
这是一个基于 TM1638 的 LED 控制函数,通过向 TM1638 发送指令和数据来控制 LED 的亮灭。函数的参数 LEDnums 表示要控制的 LED 的数量,led_buffer 是一个数组,存储着要显示的 LED 图案的数据。函数的具体实现是先写入地址,再将 LED 的显示数据写入到指定的地址中,最后将剩余的地址填充为 0。
相关问题
c51 tm1638例程
以下是基于C51单片机和TM1638芯片的例程:
```
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY_1 = P3^2;
sbit KEY_2 = P3^3;
sbit KEY_3 = P3^4;
sbit KEY_4 = P3^5;
sbit KEY_5 = P3^6;
sbit KEY_6 = P3^7;
sbit STB = P2^0;
sbit CLK = P2^1;
sbit DIO = P2^2;
uchar code digit[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};
uchar num[8] = {0,0,0,0,0,0,0,0};
uchar key_value = 0;
uchar scan_key = 0;
void delay(uint ms)
{
uint i, j;
for(i=0; i<ms; i++)
{
for(j=0; j<114; j++);
}
}
void delay_us(uint us)
{
while(us--);
}
void tm1638_write(uchar command)
{
uchar i;
CLK = 0;
for(i=0; i<8; i++)
{
DIO = command & 0x01;
command = command >> 1;
CLK = 1;
CLK = 0;
}
}
void tm1638_display(uchar *p)
{
uchar i;
tm1638_write(0x40);
STB = 1;
STB = 0;
tm1638_write(0xC0);
for(i=0; i<8; i++)
{
tm1638_write(*(p+i));
}
STB = 1;
}
uchar tm1638_read()
{
uchar i, dat = 0;
for(i=0; i<8; i++)
{
CLK = 0;
dat = dat >> 1;
if(DIO)
{
dat |= 0x80;
}
CLK = 1;
}
return dat;
}
void tm1638_init()
{
tm1638_write(0x8F);
}
void key_scan()
{
KEY_1 = 0;
if(KEY_1 == 0)
{
while(KEY_1 == 0);
key_value = 1;
scan_key = 1;
}
KEY_2 = 0;
if(KEY_2 == 0)
{
while(KEY_2 == 0);
key_value = 2;
scan_key = 1;
}
KEY_3 = 0;
if(KEY_3 == 0)
{
while(KEY_3 == 0);
key_value = 3;
scan_key = 1;
}
KEY_4 = 0;
if(KEY_4 == 0)
{
while(KEY_4 == 0);
key_value = 4;
scan_key = 1;
}
KEY_5 = 0;
if(KEY_5 == 0)
{
while(KEY_5 == 0);
key_value = 5;
scan_key = 1;
}
KEY_6 = 0;
if(KEY_6 == 0)
{
while(KEY_6 == 0);
key_value = 6;
scan_key = 1;
}
}
void main()
{
uchar i;
tm1638_init();
while(1)
{
if(scan_key == 1)
{
switch(key_value)
{
case 1:
num[0]++;
if(num[0] > 9) num[0] = 0;
break;
case 2:
num[1]++;
if(num[1] > 9) num[1] = 0;
break;
case 3:
num[2]++;
if(num[2] > 9) num[2] = 0;
break;
case 4:
num[3]++;
if(num[3] > 9) num[3] = 0;
break;
case 5:
num[4]++;
if(num[4] > 9) num[4] = 0;
break;
case 6:
num[5]++;
if(num[5] > 9) num[5] = 0;
break;
}
scan_key = 0;
}
for(i=0; i<8; i++)
{
tm1638_display(&digit[num[i]]);
delay(5);
}
key_scan();
}
}
```
该例程实现了一个计数器,通过TM1638芯片控制8个7段数码管的显示,同时可以通过6个按键来控制数字的增加。在程序中,使用了一个num数组来存储8个数字,每次按下按键后,根据按键编号来对应修改数组中的元素值,最后将数组中的8个数字依次显示在数码管上。
在程序中,还实现了一个key_scan函数来检测按键是否被按下,并根据按键编号来设置key_value变量的值。同时,为了防止按键抖动,使用了一个scan_key变量来记录是否已经检测到按键被按下,以便在下一次循环中进行处理。
需要注意的是,在使用TM1638芯片时,需要通过SPI接口来与其进行通信,具体的通信方式和协议可以参考TM1638的数据手册。在该程序中,使用了tm1638_write、tm1638_read和tm1638_display函数来实现与TM1638芯片的通信。其中,tm1638_write函数用于向TM1638芯片发送命令,tm1638_read函数用于从TM1638芯片读取数据,tm1638_display函数用于将8个数字依次显示在数码管上。
用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更新一次显示值。
希望这个程序能对您有所帮助!
阅读全文