Advertisement

LCD显示--TM1640芯片驱动程序

阅读量:

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
    
 //   }
    
 //}
    
    
    
    

全部评论 (0)

还没有任何评论哟~