本文是基于STM32F103单片机实现的,手册有写固定模式,和地址自加模式。本文采用固定模式,原因是方便改动。实现代码如下:
TM1640.C
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "TM1640.h"
#include "SysTick.h"
void TM1640_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(SLK_PORT_RCC|DAT_PORT_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推晚输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_10); // SCLK
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_11); //DAT
TM1640Start();
TM1640WriteByte(TM1640MEDO_ADD); //设置数据,0x40,0x44分别对应地址自动加一和固定地址模式
TM1640Stop();
TM1640Start();
TM1640WriteByte(TM1640MEDO_DISPLAY); //控制显示,开显示,0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f分别对应脉冲宽度为:
//------------------1/16, 2/16, 4/16, 10/16, 11/16, 12/16, 13/16, 14/16 //0x80关显示
TM1640Stop();
}
/****************************************
起始函数
***************************************/
void TM1640Start(void)
{
SLK = 1;
delay_us(2);
DAT=1;
delay_us(2) ;
DAT=0;
delay_us(2);
}
/*************************************
结束函数
***************************************/
void TM1640Stop(void)
{
SLK= 0;
delay_us(2);
DAT= 0;
delay_us(2);
SLK = 1;
delay_us(2);
DAT= 1;
}
/*************************************
TM1640WriteByte
写一字节数据 date 为所要写的数据
***************************************/
void TM1640WriteByte(u8 date)
{
u8 i;
for(i=0;i<8;i++)
{
SLK=0;
delay_us(2);
if(date & 0x01) //先低位后高位
{
DAT= 1;
delay_us(3);
} else
{
DAT=0;
delay_us(3);
}
date = date >> 1; //数据右移一位
SLK = 1;
delay_us(3);
}
}
void Write_Com(uint8_t date)//发送命令字
{
TM1640Start();
TM1640WriteByte(date);
TM1640Stop();
}
void cls_TM1640(void)//清屏函数
{
unsigned char i;
Write_Com(0x40);//连续地址模式
TM1640Start();
TM1640WriteByte(0xc0);
for(i=0;i<16;i++)
{
TM1640WriteByte(0x00);
}
TM1640Stop();
}
void Flow_Water_TM1640(void)//流水灯函数
{
unsigned char i;
Write_Com(0x40);//连续地址模式
TM1640Start();
TM1640WriteByte(0xc0);
for(i=0;i<16;i++)
{
TM1640WriteByte(0x00);
delay_ms(100);
TM1640WriteByte(0xff);
delay_ms(100);
TM1640WriteByte(0x00);
delay_ms(100);
TM1640WriteByte(0xff);
delay_ms(100);
TM1640WriteByte(0x00);
//
}
TM1640Stop();
}
///***************************************
//发送数组
//Addr1640:起始地址值
//*a : 所要发送的数组
//ValueLong:想要发送的数据长度
//适用于地址自加1模式
//**************************************/
//void TM1640_SendData(u8 Addr1640,u8 *a,u8 ValueLong)
//{
// u8 i;
// TM1640Start();
// TM1640WriteByte(Addr1640);
//
// for(i=0;i
TM1640.H
#ifndef __TM1640_H__
#define __TM1640_H__
#include "stm32f10x.h"
#include "system.h"
/*
控制显示:
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f 0x0X(这里X代表十六进制的任意值)
1/16, 2/16, 4/16, 10/16, 11/16, 12/16, 13/16, 14/16, 关灯
0x40,0x44 分别对应 地址自动加1 和 固定地址
*/
#define TM1640MEDO_ADD 0x44
#define TM1640MEDO_DISPLAY_OFF 0x80
#define TM1640MEDO_DISPLAY 0x8c
#define TM1640_LEDPORT 0xC8 //定义IO接口
#define SLK_PORT GPIOB
#define SLK_PORT_RCC RCC_APB2Periph_GPIOB
#define SLK_PIN GPIO_Pin_10
#define DAT_PORT GPIOB
#define DAT_PORT_RCC RCC_APB2Periph_GPIOB
#define DAT_PIN GPIO_Pin_11
#define SLK PBout(10) //输出
#define DAT PBout(11)
void TM1640_Init(void);
void TM1640Start(void);
void TM1640Stop(void);
void TM1640WriteByte(u8 date);
void TM1640_SendData(u8 Addr1640,u8 *a,u8 DataLong);
void TM1640_led(u8 addr, u8 date);
void TM1640_display(u8 address,u8 date);
void TM1640_Set_SMG(void);
void TM1640_led_display(void);
void TM1640_clear(void);
void Write_Com(uint8_t date);
void cls_TM1640(void);
void init_TM1640(void);
void Flow_Water_TM1640(void);
#endif