Advertisement

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

阅读量:

该代码为TM1721芯片的驱动程序,主要实现了以下功能:初始化端口和定时器、按键扫描、显示控制、PWM输出、以及相关辅助函数。代码中包含多种功能模块,如初始化端口配置、定时器延时、按键扫描、固定地址显示、PWM输出控制等,能够实现芯片的显示控制、按键扫描以及PWM信号的输出。

TM1721芯片驱动

带LCD/LED显示屏驱动以及按键扫描功能:

STB在下降沿初始化串行接口后等待指令。STB作为指令的第一字节。当处理指令期间,其他处理被终止。当STB为高时,CLK和DIO被忽略。时钟上升沿时输入/输出串行数据,从低位开始。输出为开漏N管,需外加拉电阻。

CLK:在时钟上升沿输入/输出串行数据。

DIO:通过时钟上升沿的输入输出串行数据,从低位输入。输出为N管开漏输出类型,需要外接上拉电阻。

复制代码
 #include "global.h"

    
 #include "drv_tm1721.h"
    
 #include "drv_key.h"
    
 /*-------------------------------------------*/
    
 /*驱动包含函数:                             */
    
 /*-------------------------------------------*/
    
 unsigned char ret_var;
    
 #define PWM2_VALUE 0x3f
    
 #define PWM3_VALUE 0x1f                                                                                                                                      
    
 #define MODE_SET    0x30       //显示模式//0011 0000 SW2~3 PWM2~3 KEY0~3
    
 #define PWM_WRITE   0x45       //写PWM寄存器 控制背光 固定地址模式
    
 #define DISP_WRITE  0x44       //0100 0100  显示寄存器数据地址 固定地址
    
 #define KEY_READ    0x46       //读键扫数据 0100 0010 固定地址
    
 DISPLAT_DATA_U DisplayData;
    
  
    
 /******************************************
    
 函数:初始化端口
    
 参数: 
    
 返回值:无
    
 ******************************************/
    
 void TM1721_PORT_INIT(void)
    
 {
    
   GPIO_Init(PANEL_STB_GPIO_PORT, PANEL_STB_GPIO_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW);
    
   GPIO_Init(PANEL_CLK_GPIO_PORT, PANEL_CLK_GPIO_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW);
    
   PANEL_DIO_OUT_MODE;
    
 }
    
  
    
 /******************************************
    
 函数:延时函数
    
 参数: 
    
 返回值:无
    
 ******************************************/
    
 void TM1721_Delay_ms(void)
    
 {
    
   //当将=1的时候,延时1ms
    
   unsigned short jj;
    
   for (jj = 1; jj <= 2; jj++)
    
   {
    
     __asm("NOP");
    
     //WDTCR2 = 0x4E;
    
   }
    
 }
    
  
    
 /******************************************
    
 函数:写一字节函数
    
 参数:dat---写入的一字节数据
    
 返回值:无
    
 ******************************************/
    
 void TM1721_Write_Byte(unsigned char dat)
    
 {
    
   unsigned char i;
    
   //TM1721_Delay_ms(2);  //用于片选信号的延时
    
  
    
   PANEL_STB_LOW;     //STB下降沿后DIO输入的第一个字节作为指令//有效的片选信号
    
   for (i = 0; i < 8; i++)
    
   {
    
     PANEL_CLK_LOW;
    
  
    
     if (dat & 0x01)
    
     {
    
       PANEL_DIO_HIGH;
    
     }
    
     else
    
     {
    
       PANEL_DIO_LOW;     //先写低位
    
     }
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
  
    
     //TM1721_Delay_ms();
    
  
    
     PANEL_CLK_HIGH;    //时钟上升沿,送入一位数据
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     dat >>= 1;
    
   }
    
   PANEL_CLK_LOW;
    
   //TM1721_Delay_ms(2);  //用于片选信号的延时
    
 }
    
  
    
 /********************************************
    
 函数:固定地址一显示函数
    
 参数: *dat---显示数据的数组指针
    
 返回值:无
    
 ********************************************/
    
 void TM1721_Write_String(unsigned char *dat)
    
 {
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(DISP_WRITE); //固定地址方式写数据到显示寄存器//0100 0100
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc0);    //显示寄存器的00H单元开始//SEG0~SEG1  //1100 0000
    
   TM1721_Write_Byte(dat[0]);    //给显示寄存器写入数据
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc1);    //显示寄存器的01H单元
    
   TM1721_Write_Byte(dat[1]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc2);
    
   TM1721_Write_Byte(dat[2]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc3);
    
   TM1721_Write_Byte(dat[3]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc4);
    
   TM1721_Write_Byte(dat[4]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc5);
    
   TM1721_Write_Byte(dat[5]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc6);
    
   TM1721_Write_Byte(dat[6]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc7);
    
   TM1721_Write_Byte(dat[7]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc8);
    
   TM1721_Write_Byte(dat[8]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc9);
    
   TM1721_Write_Byte(dat[9]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xcc);
    
   TM1721_Write_Byte(dat[10]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xcd);
    
   TM1721_Write_Byte(dat[11]);
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0x97);    //显示开//1001 0111     b7b6:10,显示控制;B4:0->0FF,1->ON;B3:0->1/3偏压
    
   PANEL_STB_HIGH;
    
 }
    
  
    
 /*******************************************
    
 函数:PWM输出控制函数
    
 参数:addr---选择哪一路PWM输出:0、1、2、3
    
    dat---输出的PWM的数据
    
 返回值:无
    
 *******************************************/
    
 void TM1721_Write_PWM()
    
 {
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0x45);  //PWM设定、采用固定地址//0100 0101
    
   
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc2);  //PWM控制地址设定//1100 0001      //G
    
   TM1721_Write_Byte(PWM2_VALUE); //(0x2d);//
    
   
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0xc3);  //PWM控制地址设定//1100 0001      //G
    
   TM1721_Write_Byte(PWM3_VALUE); //(0x2d);//
    
 }
    
  
    
 /*******************************************
    
 函数:PWM输出控制函数
    
 参数:addr---选择哪一路PWM输出:0、1、2、3
    
    dat---输出的PWM的数据
    
 返回值:无
    
 *******************************************/
    
 void TM1721_Write_Buzzer(unsigned char color)
    
 {
    
    PANEL_STB_HIGH;
    
    TM1721_Write_Byte(0x45);  //PWM设定、采用固定地址//0100 0101
    
    
    
    PANEL_STB_HIGH;
    
    TM1721_Write_Byte(0xc1);  //PWM控制地址设定//1100 0010     //背光输出配置
    
    TM1721_Write_Byte(color); //(0x2d);//
    
 }
    
  
    
  
    
 /*******************************************
    
 函数:按键扫描位读取函数
    
 参数:无
    
 返回值:read_var
    
 返回值类型:unsigned char
    
 *******************************************/
    
 uint8_t TM1721_Read_Key(void)
    
 {
    
   uint8_t i;
    
   uint8_t read_bit;
    
   uint8_t  ReadValue = 0;    //清零
    
                          //TM1721_Delay_ms(2);      //用于片选信号的延时
    
   PANEL_STB_LOW;
    
   //PANEL_DIO_HIGH;         //初始化数据端口
    
  
    
   for (i = 0; i < 8; i++)
    
   {
    
     PANEL_CLK_LOW;
    
  
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop(); 
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
  
    
     PANEL_CLK_HIGH;        //上升沿
    
  
    
     if (PANEL_DIO_READ & 0x40)
    
    read_bit = 1;
    
     else 
    
    read_bit = 0;
    
  
    
     ReadValue |= (read_bit << i);
    
  
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
     nop();
    
  
    
   }
    
   return (ReadValue);       //传递返回值
    
 }
    
  
    
 /******************************************
    
 函数:按键键值的判断函数
    
 参数:无
    
 返回值:无
    
 *******************************************/
    
 void TM1721_Key_Scan(void)
    
 {
    
   static  unsigned char KEY_VAR[3];   //存放按键键值数组,最多存放3字节的数据,键值缓冲区
    
   unsigned char i;
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(KEY_READ); //读按键指令、地址自动加一
    
  
    
   TM1721_Delay_ms();          //延时
    
  
    
   PANEL_DIO_IN_MODE;
    
  
    
   for (i = 0; i < 3; i++)
    
   {
    
     KEY_VAR[i] = TM1721_Read_Key();  //读取按键键值
    
     TM1721_Delay_ms();         //每读完一字节数据之后,一个小的延时、重要!
    
   }
    
  
    
   PANEL_DIO_OUT_MODE;
    
  
    
   switch (KEY_VAR[0])      //键盘只有KEY0~2 3路输入 01110111
    
   {
    
   case 0x01:  //KEY_EVENT_CRISPER_CLICK
    
     KeyByte = 13;
    
     break;
    
   case 0x02:  //KEY_EVENT_SAVE_CLICK
    
     KeyByte = 16;
    
     break;
    
   case 0x04:  //KEY_EVENT_SMART_CLICK
    
     KeyByte = 7;
    
     break;
    
   case 0x10:  //KEY_EVENT_DOWN_CLICK
    
     KeyByte = 25;
    
     break;
    
   case 0x20:  //KEY_EVENT_MODE_CLICK
    
     KeyByte = 22;
    
     break;
    
   case 0x40:  //KEY_EVENT_UP_CLICK
    
     KeyByte = 19;
    
     break;
    
   case 0x30:  //KEY_EVENT_DOWN_MODE_CLICK
    
     KeyByte = 34;
    
     break;
    
   case 0x50:  //KEY_EVENT_UP_DOWN_CLICK
    
     KeyByte = 37;
    
     break;
    
   case 0x60:  //KEY_EVENT_UP_MODE_CLICK
    
     KeyByte = 28;
    
     break;
    
   }
    
  
    
   switch (KEY_VAR[1])      //键盘只有KEY0~2 3路输入 01110111
    
   {
    
   case 0x01:  //MD
    
     KeyByte = 4;
    
     break;
    
   case 0x02:  //KEY_EVENT_ICE_CLICK
    
     KeyByte = 10;
    
     break;
    
   case 0x04:  //AD
    
     KeyByte = 1;
    
     break;
    
   case 0x05:  //AD MD 组合键
    
     KeyByte = 31;
    
   default:
    
     // KeyByte = 0;     //有问题 可能会清除掉应该有的键值  还有组合键也应该加进来
    
     break;
    
   }
    
  
    
   if (!KEY_VAR[0] && !KEY_VAR[1])
    
   {
    
     KeyByte = 0;
    
   }
    
 }
    
  
    
  
    
 /*****************************************
    
 函数:TM1721的初始化函数
    
 参数:无
    
 返回值:无
    
 *****************************************/
    
 void TM1721_Init(void)
    
 {
    
   TM1721_PORT_INIT();
    
  
    
   //TM1721_Delay_ms();   //等待电压稳定
    
   PANEL_STB_HIGH;      //STB为高电平,CLK、DIO无效//端口配置初始化
    
   PANEL_CLK_HIGH;
    
   PANEL_DIO_HIGH;
    
  
    
   TM1721_Write_Byte(MODE_SET); //显示模式//0010 1110 SW2~3 PWM2~3 KEY0~3
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_Byte(0x87);     //显示关 //1000 0111  b7b6:10,显示控制;B4:0->0FF,1->ON;B3:0->1/3偏压
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_PWM();      //设置PWM,开背光
    
   //
    
   //    PANEL_STB_HIGH;
    
   //    TM1721_Write_Byte(0x97);     //显示关 //1000 0111  b7b6:10,显示控制;B4:0->0FF,1->ON;B3:0->1/3偏压
    
 }
    
  
    
  
    
 void TM1721_InitAgain(void)
    
 {
    
   PANEL_STB_HIGH;      //STB为高电平,CLK、DIO无效//端口配置初始化
    
   TM1721_Write_Byte(MODE_SET); //显示模式//0010 1110 SW2~3 PWM2~3 KEY0~3
    
  
    
   PANEL_STB_HIGH;
    
   //TM1721_Write_Byte(0x87);     //显示关 //1000 0111  b7b6:10,显示控制;B4:0->0FF,1->ON;B3:0->1/3偏压
    
   TM1721_Write_Byte(0x97);       //显示开
    
  
    
   PANEL_STB_HIGH;
    
   TM1721_Write_PWM();            //设置PWM,开背光
    
 }

全部评论 (0)

还没有任何评论哟~