stm32 MCU液晶TM1622 HT1622驱动调试

本文使用的例程软件工程代码如下

(1条消息) stm32MCU液晶TM1622HT1622驱动调试,源代码,实际项目使用资源-CSDN文库

HT1622/HT1622G/TM1622是一款常用的LCD驱动芯片

TM1622/HT1622厂家不一样,但是芯片功能基本上一直,硬件上基本上可以做到pin2pin兼容,这个需要根据自己的做微调整

以TM1622的资料为例,做如下说明

TM1622是256点内存映象和多功能的LCD驱动专用芯片,TM1622的软件配置特性使它适用于多种LCD应用 场合,包括:LCD模块和显示子系统。用于连接主控制器和TM1622的管脚只有4或5条,TM1622还有一个节电命 令用于降低系统功耗。本产品性能优良、质量可靠。

功能特点

 工作电压2.4~ 5.2V

 内置32 KHz RC振荡器

 可外接32KHz频率源作为时钟输入

 内置时基频率源

 内置蜂鸣器输出驱动,有两种输出频率可选(2 KHz或者4 KHz)

 内置节电模式,可用于减少功耗

 内置时基发生器和看门狗(WDT)输出

 内置32ⅹ8位显示寄存器,32个SEG,8个COM输出驱动, 1/4偏压

 四线串行接口  提供VLCD管脚用于调整LCD操作电压

 三种数据访问模式

 八个时基/看门狗定时器时钟源

 数据模式和命令模式指令

 四种封装形式可选:LQFP44(长脚),LQFP44(短脚),LQFP52,LQFP64 内部结构框图

MCU典型接法

 写数据时序图,这里不需要读取,也不用看读数据的时序

 软件命令列表

需要详细的,手册,可以下载一份数据手册看看

 实际项目原理图设计如下

这里有点复杂,就是要支持两款液晶,一个大液晶一个小液晶,其中YJ1是焊接大液晶的接口,YJ2是焊接小液晶的接口

下图1处,是液晶的背光灯开关

2处是MCU控制液晶的接口,其中SPI_RD用0欧姆的电阻连接,可以考虑不需要读取也液晶数据,可以不焊接该电阻,空余出来一个MCU的管脚

3处是电平转换后的TM1622的控制管脚

MCU的控制管脚设计如下

实际项目使用的控制管脚设计比较多,这里比较简单,提取出来对应TM1622的控制管脚

对应上述原理图,软件实现的控制管脚接口,如下所示


#define LCD_CS_L          {PBout(7) = 0;}
#define LCD_CS_H          {PBout(7) = 1;}

#define LCD_RD_L          {PBout(6) = 0;}  
#define LCD_RD_H          {PBout(6) = 1;}  

#define LCD_WR_L          {PBout(8) = 0;}      
#define LCD_WR_H          {PBout(8) = 1;}     

#define LCD_DAT_L         {PBout(9) = 0;}      
#define LCD_DAT_H         {PBout(9) = 1;} 

#define LCD_BLK_EN_ON     {PBout(13) = 0;}      
#define LCD_BLK_EN_OFF    {PBout(13) = 1;} 

stm32cube的关键设计如下

IO的配置,PB6/PB7/PB8/PB9/PB13配置为输出模式

其中需要注意的是,PB6连接的tm1622的数据读取管脚,这个管脚实际上没有使用,配置成输入输出都无所谓 

时钟的配置

时钟采用外部时钟8M,倍频到72M供系统使用 

系统主函数,主要是添加了initHT1622()测试


/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  initHT1622();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

TM1622的写函数,这些函数是根据手册写时序图调试出来的

当然也和MCU的时钟有关,这里配置为72MHZ,如果需要移植该驱动,则需要根据自己的系统时钟修改如下函数的延时,当然也需要修改控制管脚

void Write_HT1622_Byte(unsigned char Data,unsigned char length)
{
    unsigned char i,Temp=0x80;
    for (i=0;i<length;i++)
    {

        if (Data&Temp)
				{
        LCD_DAT_H;//数据线置1
				}
        else
				{
        LCD_DAT_L;//数据线置0
				}
        Temp>>=1; //准备下一位
        
        LCD_WR_L; //“写”时钟置0        
        __NOP();
        __NOP();
        __NOP();
        LCD_WR_H; //“写”时钟置1
    }
}

液晶初始化

void initHT1622(void)
{
    uint8_t i;
    //InitLcdPin();
    
   // for(i = 0 ;i < 100; i++)
    
    {

    Write_HT1622_Command(SYSDIS);//关闭系统振荡器和LCD驱动
    Write_HT1622_Command(SYSEN); //打开系统振荡器
    Write_HT1622_Command(LCDOFF);//关闭LCD显示
    Write_HT1622_Command(LCDON); //打开LCD显示
    }
    //Write_HT1622_Command(0x01);
   // Write_HT1622_Command(0x29);
    //Write_HT1622_Command(0x18);
    //Write_HT1622_Command(0x01);
    //Write_HT1622_Command(0x03);

    

      
    //清屏
    
    for(i = 0; i < 64; i++)
    {
      Write_HT1622_Data(i,0);
    }

}

本文使用的例程软件工程代码如下

(1条消息) stm32MCU液晶TM1622HT1622驱动调试,源代码,实际项目使用资源-CSDN文库

/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名:TM1622-V1.0 *当前版本:V1.0 *MCU 型号:STC12C5608AD *开发环境:Keil uVision4 *晶震频率:11.0592MHZ *完成日期:2013-09-09 *程序功能:1.LCD驱动:32SEG*8COM(由2组4COM LCD屏组成),分别显示0~9. *免责声明:1.此程序为TM1622驱动LCD演示程序,仅作参考之用。 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任 ********************************************************************************/ #include //MCU头文件 #include "intrins.h" //包含nop指令头文件 #define nop() _nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /********************定义控制端口**********************/ sbit CS = P2^1; //片选 sbit READ = P2^0; //读数据时钟 sbit WRITE = P1^7; //写数据时钟 sbit DATA = P1^6; //数据口 //****定义数据*************** 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 unsigned char code date0[]={0x0B,0x00,0x07,0x05,0x0C,0x0D,0x0F,0x00,0x0F,0x0D,0x0B,0x00,0x07,0x05,0x0C,0x0D,0x0F,0x00,0x0F,0x0D,0x0B,0x00,0x07,0x05,0x0C,0x0D,}; unsigned char code date1[]={0x0E,0x06,0x0C,0x0e,0x06,0x0A,0x0A,0x0E,0x0E,0x0E,0x0E,0x06,0x0C,0x0e,0x06,0x0A,0x0A,0x0E,0x0E,0x0E,0x0E,0x06,0x0C,0x0e,0x06,0x0A,}; unsigned char Buffer[64]; //定义数组 /***************延时函数nms**************/ void delay_nms(unsigned int n) { unsigned int i; while(n--) { for(i=0; i<550; i++); } } /***************写100命令函数**************/ void write_cmd_100(unsigned char cmd) { unsigned char i; CS=0; WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); for(i=0; i<8; i++) { WRITE=0; if(cmd&0x80;) DATA=1; else DATA=0; WRITE=1; cmd<<=1; } WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); CS=1; } /***************写101数据函数**************/ void write_101(unsigned char address, unsigned char dat) { unsigned char i, add; add=address<<2; CS=0; WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=0; nop(); WRITE=1; nop(); WRITE=0; nop(); DATA=1; nop(); WRITE=1; nop(); for(i=0; i<6; i++) { WRITE=0; if(add&0x80;) DATA=1; else DATA=0; WRITE=1; add<<=1; } for(i=0; i>=1; } WRITE=0; DATA=0; CS=1; } /***************向显存写数据**************/ void writeDDRAM(void) { unsigned char i; for(i=0;i<16;i++) //向64个地址写数据,显示0~9 { write_101((2*(2*i)),date0[i]); write_101((2*(2*i)+2),date1[i]); write_101((2*(2*i)+1),date0[i]); write_101((2*(2*i)+3),date1[i]); } } /***************TM1622初始化函数**************/ void init_tm1622() { write_cmd_100(0x01); //打开系统振荡器 write_cmd_100(0x03); //开启LCD显示 write_cmd_100(0x18); //片内RC 32KHZ write_cmd_100(0xe3); //正常模式 } void main() { unsigned char i; init_tm1622(); //初始化 nop(); nop();
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大牛攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值