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芯片驱动程序
时间: 2024-10-11 10:27:59