功能详解
本工程在于使用51系列单片机实现多个LED灯的定位显示控制功能
TM1640的初始化
void TM1640_Init(u8 InValue)
{
GPIO_WriteHigh(GPIO4,GPIO_PIN_1); //P41写高 DIN
Delay_Some_Time(1);
GPIO_WriteHigh(GPIO4,GPIO_PIN_0); //P40写高 SCLK
if(InValue == DSPTM1640_DIS) //显示关
{
TM1640Start();//数据写模式设置
TM1640WriteByte(DSP1640_DIS);//显示关控制
TM1640Stop();
}
else
{
TM1640Start();//数据写模式设置
TM1640WriteByte(TM1640_FIEXD);//数据命令设置 地址自动加1
TM1640Stop();
TM1640Start(); //显示亮度设置
TM1640WriteByte(TM1640_DISPLAY); //显示命令控制 脉冲宽度14/16
TM1640Stop();
}
}
TM1640时钟配置
驱动TM1640需要自己按照数据手册配置时钟。时钟信号的配置决定了tm1640的使用。
起始信号
void TM1640Start(void)
{
GPIO_WriteHigh(GPIO4,GPIO_PIN_1); //P41写高 DIN
GPIO_WriteHigh(GPIO4,GPIO_PIN_0); //P40写高 SCLK
Delay_Some_Time(1);
GPIO_WriteLow(GPIO4,GPIO_PIN_1); //p41低电平 DIN
Delay_Some_Time(1);
GPIO_WriteLow(GPIO4,GPIO_PIN_1); //p40低电平 SCLK
Delay_Some_Time(1);
}
写数据
void TM1640WriteByte(u8 date)
{
u8 i;
u8 Tmp;
Tmp=date;
GPIO_WriteLow(GPIO4,GPIO_PIN_1); //p41低电平 DIN
GPIO_WriteLow(GPIO4,GPIO_PIN_0); //p40低电平 SCLK
for(i=0;i<8;i++)
{
GPIO_WriteLow(GPIO4,GPIO_PIN_0); //p40低电平 SCLK
Delay_Some_Time(1);
if(Tmp&0x01)
{
GPIO_WriteHigh(GPIO4,GPIO_PIN_1); //P41写高 DIN
Delay_Some_Time(1);
}
else
{
GPIO_WriteLow(GPIO4,GPIO_PIN_1); //p41低电平 DIN
Delay_Some_Time(1);
}
GPIO_WriteHigh(GPIO4,GPIO_PIN_0); //P40写高 SCLK
Tmp = Tmp>>1;
}
GPIO_WriteLow(GPIO4,GPIO_PIN_0); //p40低电平 SCLK
GPIO_WriteLow(GPIO4,GPIO_PIN_1); //p41低电平 DIN
}
结束信号
void TM1640Stop(void)
{
GPIO_WriteLow(GPIO4,GPIO_PIN_1); //p41低电平 DIN
GPIO_WriteHigh(GPIO4,GPIO_PIN_0); //P40写高 SCLK
Delay_Some_Time(1);
GPIO_WriteHigh(GPIO4,GPIO_PIN_1);
Delay_Some_Time(1);
}
发送显示
void TM1640_display(u8 *a)
{
u8 i;
TM1640Start();
TM1640WriteByte(0x40); //设置起始地址
TM1640Stop();
TM1640Start();
TM1640WriteByte(0xc0);
for(i=0;i<16;i++)
{
TM1640WriteByte(a[i]);
}
TM1640Stop();
TM1640Start();
TM1640WriteByte(0x8b); //设置起始地址
TM1640Stop();
}
IO口的初始化
void TM1640_GPIO_Config(void)
{
GPIO_Init(GPIOx, GPIO_PIN_x,GPIO_MODE_OUT_PP); //控制tm1640引脚 DIN
GPIO_Init(GPIOx, GPIO_PIN_x,GPIO_MODE_OUT_PP); //控制tm1640引脚 SCLK
}
宏定义部分
#define addr_TM1640 (0xc0+0x01)
#define DSPTM1640_DIS 0
#define DSPTM1640_ENB 1
//模式设置
#define TM1640_ADD 0x40 //宏定义 自动加一模式
#define TM1640_FIEXD 0x44 //宏定义 固定地址模式
#define DSP1640_DIS 0x80 //宏定义 亮度 关
#define TM1640_DISPLAY 0x8f //宏定义 亮度 11/16 脉冲宽度可调节
定位具体灯珠,实现控制
#define DSPTM1640_DIS 0
u8 R_level[48] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
}
void deal_Disp()
{
u8 i,j;
u8 current_level = 0; //当前档位
u16 led_data[8]={0};
u8 F[4] = {0};
while(1)
{
disp_level(current_level);
//-----------------TM1640-----------------//
for(i = 0; i < 8; ++i)
{
for(j = 0; j < 4; ++j)
{
//i 1
F[j] = ( ((R_level[((i*4)+j)*2] & 0xF0) >> 4) == current_level )//0 8
|(( (R_level[((i*4)+j)*2] & 0x0F) == current_level) << 1) //0 8
|(( ((R_level[((i*4)+j)*2 +1] & 0xF0) >> 4) == current_level) << 2)//0 9
|(( (R_level[((i*4)+j)*2 +1] & 0x0F)== current_level) << 3);//i1 j3 15
}
led_data[i] = (F[1]<<12) | (F[0]<<8) | (F[3]<<4)| (F[2]);
}
//最后、显示
TM1640_display((u8*)led_data);
}
void main(void)
{
TM1640_GPIO_Config();
TM1640_Init(DSPTM1640_DIS); //TM1640初始化
while(1)
{
deal_Disp();
}
}
结束!!!