TM1640芯片驱动
DIN:串行数据输入,输入数据在 SCLK 的低电平变化,在 SCLK 的高电平被传输。
SCLK:在上升沿输入数据 。
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "global.h"
#include "string.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define DATA_COMMEND 0x40 //数据控制命令 0100 0000 自动地址 0100固定地址
#define DISP_CLOSE 0x80 //显示关
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint8_t DisplayBuff[14];
//uint8_t DisplayBuffFinal[14];
uint8_t DispOpenValue = 0x8f; //显示开 1000 1011 脉冲宽度为10/16
const uint8_t Mmap_Tab[] = {0x01, 0x02, 0x04 ,0x08 ,0x10, 0x20, 0x40, 0x80};
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
static void DispData_Mmap();
//void DispData_Trans();
//void DispData_BitTrans(); //位地址转换
/* Public functions ----------------------------------------------------------*/
/*******************************************************************************
函数:初始化端口
参数:
返回值:无
********************************************************************************/
void TM1640_PORT_INIT(void)
{
GPIO_Init(TM1640_CLK_GPIO_PORT, TM1640_CLK_GPIO_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW);
TM1640_DIN_OUT_MODE;
}
/*******************************************************************************
函数:延时函数 ms MS
参数:
返回值:无
*******************************************************************************/
void TM1640_Delayms(uint8_t ms)
{
unsigned short jj;
for (jj = 1; jj <= ms; jj++)
{
nop();
}
}
/*******************************************************************************
函数:命令传输开始标志
参数:
返回值:无
*******************************************************************************/
void TM1640_Start()
{
TM1640_CLK_LOW;
TM1640_Delayms(5);
TM1640_DIN_HIGH;
TM1640_Delayms(5);
TM1640_CLK_HIGH;
TM1640_Delayms(10);
TM1640_DIN_LOW;
TM1640_Delayms(5);
}
/*******************************************************************************
函数:命令传输结束
参数:
返回值:无
*******************************************************************************/
void TM1640_End()
{
TM1640_CLK_LOW;
TM1640_Delayms(5);
TM1640_DIN_LOW;
TM1640_Delayms(5);
TM1640_CLK_HIGH;
TM1640_Delayms(10);
TM1640_DIN_HIGH;
TM1640_Delayms(5);
}
/*******************************************************************************
函数:写一字节函数
参数:dat---写入的一字节数据
返回值:无
*******************************************************************************/
void TM1640_Write_Byte(unsigned char dat)
{
uint8_t i;
//START 有效 DIO输入的第一个字节作为指令//有效的片选信号
for (i = 0; i < 8; i++)
{
TM1640_CLK_LOW;
if (dat & 0x01)
{
TM1640_DIN_HIGH;
}
else
{
TM1640_DIN_LOW; //先写低位
}
TM1640_Delayms(10);
TM1640_CLK_HIGH; //时钟上升沿,送入一位数据
TM1640_Delayms(10);
dat >>= 1;
}
TM1640_CLK_LOW;
TM1640_Delayms(5);
}
/*******************************************************************************
函数:固定地址一显示函数
参数: *dat---显示数据的数组指针
返回值:无
*******************************************************************************/
void TM1640_Write_String()
{
uint8_t i;
DispData_Mmap();
// DispData_Trans();
// DispData_BitTrans();
TM1640_Start();
TM1640_Write_Byte(DATA_COMMEND);
TM1640_End();
TM1640_Delayms(5);
TM1640_Start();
TM1640_Write_Byte(0xc0);
for(i=0; i<14; i++)
{
TM1640_Write_Byte(DisplayBuff[i]);
// TM1640_Write_Byte(g_SystemDisplayData.Buffer[i]);
}
TM1640_End();
TM1640_Delayms(5);
TM1640_Start();
TM1640_Write_Byte(DispOpenValue); //显示开
TM1640_End();
}
/*******************************************************************************
函数:TM1640的初始化函数
参数:无
返回值:无
*******************************************************************************/
void TM1640_Init(void)
{
TM1640_PORT_INIT();
TM1640_Start();
TM1640_Write_Byte(DispOpenValue); //显示关 1000 0000
TM1640_End();
TM1640_Delayms(5);
}
/*******************************************************************************
函数:显示映射函数(由于硬件设计不合理 所以需要进行相应的转换)
返回值:无
*******************************************************************************/
static void DispData_Mmap()
{
uint8_t i,j;
for(i=0; i<=13; i++)
{
if(i <= 7) //前8字节沿对角线对换
{
for(j=0; j<=7; j++)
{
if(g_SystemDisplayData.Buffer[j] & Mmap_Tab[i])
{
DisplayBuff[i] |= Mmap_Tab[j];
}
else
{
DisplayBuff[i] &= ~Mmap_Tab[j];
}
}
}
else
{
DisplayBuff[i] = g_SystemDisplayData.Buffer[i];
}
}
}
//void DispData_Trans() //段地址转换
//{
// DisplayBuffFinal[0] = DisplayBuff[3];
// DisplayBuffFinal[1] = DisplayBuff[4];
// DisplayBuffFinal[2] = DisplayBuff[12];
// DisplayBuffFinal[3] = DisplayBuff[10];
// DisplayBuffFinal[4] = DisplayBuff[1];
// DisplayBuffFinal[5] = DisplayBuff[2];
// DisplayBuffFinal[6] = DisplayBuff[9];
// DisplayBuffFinal[7] = DisplayBuff[13];
// DisplayBuffFinal[8] = DisplayBuff[0];
// DisplayBuffFinal[9] = DisplayBuff[11];
// DisplayBuffFinal[10] = DisplayBuff[8];
// DisplayBuffFinal[11] = DisplayBuff[7];
// DisplayBuffFinal[12] = DisplayBuff[5];
// DisplayBuffFinal[13] = DisplayBuff[6];
//}
//
//
//void DispData_BitTrans() //位地址转换
//{
// uint8_t i;
//
// memset(DisplayBuff,0,sizeof(DisplayBuff));
//
// for(i=0; i<14; i++)
// {
// DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[1]) >>1); //bit 0
// DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[0]) <<1); //bit 1
// DisplayBuff[i] |= (DisplayBuffFinal[i] & Mmap_Tab[2]); //bit 2
// DisplayBuff[i] |= (DisplayBuffFinal[i] & Mmap_Tab[3]); //bit 3
// DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[6]) >>2); //bit 4
// DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[7]) >>2); //bit 5
// DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[5]) <<1); //bit 6
// DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[4]) <<3); //bit 7
// }
//}
LCD显示--TM1640芯片驱动程序,布布扣,bubuko.com
原文地址:http://blog.csdn.net/a656343072/article/details/38733693