DSP28035驱动HT1621B显示段码LCD屏

这篇具有很好参考价值的文章主要介绍了DSP28035驱动HT1621B显示段码LCD屏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

     最近做的项目里面使用的控制芯片为TI公司的28035,在控制程序以外,需要用该芯片控制显示LCD屏幕,其中驱动LCD屏幕的是HT1621B芯片,由于这也是我第一次写驱动LCD的程序以及第一次接触1621这款芯片,在网上参考了很多例程,以及对DATASHEET的学习,遇到了一些问题,在下文中会详细介绍整个调试过程。

     首先对于HT1621,是一款驱动LCD屏幕常见的驱动芯片,在本项目中使用的是以下封装,48引脚,其中有SEG0~31和COM0~4,一共可以驱动32*4=128个LED灯。

DSP28035驱动HT1621B显示段码LCD屏

       其中CS,RD,WR,DATA ,9、10、11、12这四个引脚是HT1621与MCU之间进行通讯的媒介,在该项目中,由于不需要读LCD屏幕的数据,因此只连接了CS,WR,DATA这三条线,硬件连接原理图如图所示。

DSP28035驱动HT1621B显示段码LCD屏

       可以对比上面的引脚进行分析,以及针对HT1621的DATASHEET进行分析,在本项目中RD引脚没有使用直接置高,14和15引脚悬空,使用HT1621片内的RC振荡电路,而不使用外部时钟。

DSP28035驱动HT1621B显示段码LCD屏

DSP28035驱动HT1621B显示段码LCD屏

        HT1621芯片右侧接的LCD段码屏,一般情况下是厂家定制好的段码屏,厂家会提供一份原理图,引脚对应图,本项目使用的原理图如下图:

DSP28035驱动HT1621B显示段码LCD屏

DSP28035驱动HT1621B显示段码LCD屏

 包含各种图案的点亮,一共是32*4,刚好是128个,也是HT1621能够驱动的最大数量的灯管数量。针对上面厂家给的原理图和硬件原理图,需要得到具体每一个SEG和COM对应的灯管,上述表格进行对照后,会得到对应表(因为厂家给的PIN脚和SEG有时候会不对应)

DSP28035驱动HT1621B显示段码LCD屏

DSP28035驱动HT1621B显示段码LCD屏

DSP28035驱动HT1621B显示段码LCD屏

得到上述对应的表格后,才能精确地驱动每一个灯,对于显示数字的数码管来说:根据原理图中的映射关系,一共八个数字数码管可以得到:

DSP28035驱动HT1621B显示段码LCD屏

1----亮,0----灭

数字0:A B C D E F为1 其他都为0  对应SEG2:1101   SEG3:0111

高位在前 因此改为16进制为  0x0b 0x0e

数字1:B C为1 其他都为0  对应SEG2:0000  SEG3:0110    0x00   0x06

数字2:A B G E D 为1 其他为0   对应SEG2:1110  SEG3:0011   0x07   0x0c

数字3:A B C D G为1 其他为0   对应SEG2:1010  SEG3:0111    0x05    0x0e

数字4:F G B C为1 其他为0   对应SEG2:0011  SEG3:0110      0x0c    0x06

数字5:A F G C D为1 其他为0   对应SEG2:1011  SEG3:0101    0x0d    0x0a

数字6:A F G C D E为1 其他为0   对应SEG2:1111  SEG3:0101    0x0f    0x0a

数字7:A B C 为1 其他为0   对应SEG2:0000  SEG3:0111     0x00   0x0e

数字8:A B C D E G F为1 其他为0   对应SEG2:1111  SEG3:0111   0x0f    0x0e

数字9:A B C D F G为1 其他为0   对应SEG2:1011  SEG3:0111    0x0d     0x0e

 对于SEG的地址码是由6个二进制位构成 00 0000  一共有31个,可以得到下面的对应表

DSP28035驱动HT1621B显示段码LCD屏

如果想要点亮数字 1,那么就需要在SEG2的地址写入0x00,而在SEG3写入 0x06,即可点亮。

上述主要叙述了HT1621的基本构造和点亮数字和图案的基本原理,下文叙述HT1621的驱动程序和驱动原理。

对于HT1621,首先需要进行对其进行初始化,即对其写入命令,才能进一步给HT1621写数据点亮各种灯,因此初始化是最关键的一步。

对于HT1621,有四种模式,在本项目中只用到了命令模式和写入模式

DSP28035驱动HT1621B显示段码LCD屏

 针对初始化,需要写入命令集,命令的代码为100,而且存在很多不同的命令,构成了命令表格,完整的命令表格可以通过查阅1621的DATASHEET来查看。

DSP28035驱动HT1621B显示段码LCD屏

DSP28035驱动HT1621B显示段码LCD屏

 HT1621的初始化也就是对其发送一系列命令的过程,上图的CS相当于使能端,当CS处于低电平时,1621才能跟MCU进行通讯,而WR充当时钟信号,在WR的上升沿时,将DATA的电平状态传送给1621,进行数据传输。

//HT1621的初始化
void HT1621_Init(void)
{
    HT1621_CS_H();
    HT1621_WR_H();
    HT1621_DAT_H();
    DelayMs(20);
    HT1621_WriteCMD(0x52);  //0b1000 0101 0010  1/3duty 4com
    DelayMs(1);
    HT1621_WriteCMD(0x30);  //0b1000 0011 0000  内部时钟
    DelayMs(1);
    HT1621_WriteCMD(0x00);    //0b1000 0000 0000  关振系统荡器和LCD偏压发生器
    DelayMs(1);
    HT1621_WriteCMD(0x0A);   //0b1000 0000 1010  禁止看门狗
    DelayMs(1);
    HT1621_WriteCMD(0x02);   //0b1000 0000 0010 打开系统振荡器
    DelayMs(1);
    HT1621_WriteCMD(0x06);    //0b1000 0000 0110  打开LCD偏压
    DelayMs(1);
}

要形成上述的时序图,写入命令的代码为:

void HT1621_SendBit(uchar sdat,uchar cnt)
{
        uchar i;
        for(i=0;i<cnt;i++)
        {
                HT1621_WR_L();
                HT1621_Delay(DELAY_TEST);

                if(sdat&0x80)
                {
                        HT1621_DAT_H();
                }
                else
                {
                        HT1621_DAT_L();
                }

                HT1621_Delay(DELAY_TEST);
                HT1621_WR_H();
                HT1621_Delay(DELAY_TEST);
                sdat<<=1;
        }
}

 对于上述的延时,在网上找到的资料中显示,如果不加延时,数据传输会有一定影响,因此在这里我加上了延时。

void HT1621_WriteCMD(uchar command)
{
        HT1621_CS_L();
        HT1621_Delay(DELAY_TEST);
        HT1621_SendBit(0x80,4);  
        HT1621_SendBit(command,8);
        HT1621_CS_H();
}

 此时需要注意的是,对于上述数据手册中,发送命令的全部数据为加起来一定是12位,可以是3+9或者4+8,但是不能小于12位,如果发送的数据位11位,即3+8,会导致下图的时序图,其中从上到下分别为CS  WR DATA。

DSP28035驱动HT1621B显示段码LCD屏

发现时序会乱掉,当发送位数为12位时,时序正常,因此发送命令时3+9和4+8原则上都能成功,在此我使用的是4+8,不同的格式发送的命令码也是不同的,根据位数去计算。

DSP28035驱动HT1621B显示段码LCD屏

 如果初始化成功,那么就可以给1621写入数据了,写入数据的命令码为101

DSP28035驱动HT1621B显示段码LCD屏

 其中储存地址1就是上文中的SEG的地址,而数据就是点亮COM0~3中哪一个,拿上文中举例子, 如果想要点亮数字 1,那么就需要在SEG2的地址写入0x00,而在SEG3写入 0x06,即可点亮。

 即发出的DATA为 101  000010 0000 和 101 000011 0110,具体程序代码为:

//addr为写入数据的地址,即对应的SEGx,而写入的数据sdat为数码管亮时对应的数据
void HT1621_WirteData(uchar addr,uchar sdat)
{
    //addr<<=2;//因为地址为6位 32个寄存器的地址为6位
    //sdat<<=4;//数据为4位 4位对应COM
    HT1621_CS_L();
    HT1621_SendBit(0xA0,3);//101  写命令
    HT1621_SendBit(addr<<=2,6);
    HT1621_SendBit(sdat<<=4,4);     //一次只发送四位数据,一个地址发送一次,低四位
    HT1621_CS_H();
}

 需要左移是因为,16进制的情况下地址和数据初始化,如0x02即对应的SEG2是8位,而写入1621的地址是6位,数据只有4位,因此需要左移。

最后写入地址和需要发送的数据,即可点亮LCD上对应的数字。

附上全部代码,包括GPIO的配置:


void UserInitAllGpio(void)
{
        EALLOW;
        //20230322 for LCD GPIO25、26、27
        GpioCtrlRegs.GPAPUD.bit.GPIO25 = 1; // 1禁止上拉        DATA引脚
        GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0;
        GpioCtrlRegs.GPADIR.bit.GPIO25 = 1; // 1 output
        GpioDataRegs.GPACLEAR.bit.GPIO25 = 1;

        GpioCtrlRegs.GPAPUD.bit.GPIO26 = 1; // 1禁止上拉        WR引脚
        GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 0;
        GpioCtrlRegs.GPADIR.bit.GPIO26 = 1; // 1 output
        GpioDataRegs.GPACLEAR.bit.GPIO26 = 1;

        GpioCtrlRegs.GPAPUD.bit.GPIO27 = 1; // 1禁止上拉        CS引脚
        GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0;
        GpioCtrlRegs.GPADIR.bit.GPIO27 = 1; // 1 output
        GpioDataRegs.GPACLEAR.bit.GPIO27 = 1;

        EDIS;
}
#define     DELAY_TEST  10

void Delay_(uchar us)
{
    while(--us);
}

void DelayMs(Uint16 iMs)
{
    Uint16 i,j;
    for(i=0;i<iMs;i++)
        for(j=0;j<65;j++)
        {
            Delay_(1);
        }
}



//引脚定义
void HT1621_DAT_H(void)
{
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO25 = 1;
    EDIS;
}
void HT1621_DAT_L(void)
{
    EALLOW;
    GpioDataRegs.GPACLEAR.bit.GPIO25 = 1;
    EDIS;
}

void HT1621_WR_H(void)
{
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO26 = 1;
    EDIS;
}

void HT1621_WR_L(void)
{
    EALLOW;
    GpioDataRegs.GPACLEAR.bit.GPIO26 = 1;
    EDIS;
}

void HT1621_CS_H(void)
{
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO27 = 1;
    EDIS;
}

void HT1621_CS_L(void)
{
    EALLOW;
    GpioDataRegs.GPACLEAR.bit.GPIO27 = 1;
    EDIS;
}

void HT1621_Delay(Uint32 n)
{
    while(n--);
}

void HT1621_SendBit(uchar sdat,uchar cnt)
{
        uchar i;
        for(i=0;i<cnt;i++)
        {
                HT1621_WR_L();
                HT1621_Delay(DELAY_TEST);

                if(sdat&0x80)
                {
                        HT1621_DAT_H();
                }
                else
                {
                        HT1621_DAT_L();
                }

                HT1621_Delay(DELAY_TEST);
                HT1621_WR_H();
                HT1621_Delay(DELAY_TEST);
                sdat<<=1;
        }
}

//addr为写入数据的地址,即对应的SEGx,而写入的数据sdat为数码管亮时对应的数据
void HT1621_WirteData(uchar addr,uchar sdat)
{
    //addr<<=2;//因为地址为6位 32个寄存器的地址为6位
    //sdat<<=4;//数据为4位 4位对应COM
    HT1621_CS_L();
    HT1621_SendBit(0xA0,3);//101  写命令
    HT1621_SendBit(addr<<=2,6);
    HT1621_SendBit(sdat<<=4,4);     //一次只发送四位数据,一个地址发送一次,低四位
    HT1621_CS_H();
}

void HT1621_WriteAllData(void)
{
    uchar i;
    HT1621_CS_L();
    HT1621_SendBit(0xA0,3);
    HT1621_SendBit(0x00<<2,6);
    for(i=0;i<32;i++)
    {
        HT1621_SendBit(0x00,8);
    }
    HT1621_CS_H();

}

void HT1621_WriteCMD(uchar command)
{
        HT1621_CS_L();
        HT1621_Delay(DELAY_TEST);
        HT1621_SendBit(0x80,4);  
        HT1621_SendBit(command,8);
        HT1621_CS_H();
}


void HT1621_Init(void)
{
    HT1621_CS_H();
    HT1621_WR_H();
    HT1621_DAT_H();
    DelayMs(20);
    HT1621_WriteCMD(0x52);  //0b1000 0101 0010  1/3duty 4com
    DelayMs(1);
    HT1621_WriteCMD(0x30);  //0b1000 0011 0000  内部时钟
    DelayMs(1);
    HT1621_WriteCMD(0x00);    //0b1000 0000 0000  关振系统荡器和LCD偏压发生器
    DelayMs(1);
    HT1621_WriteCMD(0x0A);   //0b1000 0000 1010  禁止看门狗
    DelayMs(1);
    HT1621_WriteCMD(0x02);   //0b1000 0000 0010 打开系统振荡器
    DelayMs(1);
    HT1621_WriteCMD(0x06);    //0b1000 0000 0110  打开LCD偏压
    DelayMs(1);
}

主函数: 

{
    
     UserInitAllGpio();
     HT1621_Init();
    DelayMs(50);
    HT1621_WriteAllData();//清屏

while(1){
	    HT1621_WirteData(SEG_addr[2],Data_lowSEG[0]);
	    DelayMs(1);
	    HT1621_WirteData(SEG_addr[3],Data_highSEG[0]);
	    DelayMs(0xcff);
        HT1621_WirteData(SEG_addr[2],Data_lowSEG[1]);
        DelayMs(1);
        HT1621_WirteData(SEG_addr[3],Data_highSEG[1]);
        DelayMs(0xcff);
        HT1621_WirteData(SEG_addr[2],Data_lowSEG[2]);
        DelayMs(1);
        HT1621_WirteData(SEG_addr[3],Data_highSEG[2]);
        DelayMs(0xcff);
        HT1621_WirteData(SEG_addr[2],Data_lowSEG[3]);
        DelayMs(1);
        HT1621_WirteData(SEG_addr[3],Data_highSEG[3]);
        DelayMs(0xcff);
        HT1621_WirteData(SEG_addr[2],Data_lowSEG[4]);
        DelayMs(1);
        HT1621_WirteData(SEG_addr[3],Data_highSEG[4]);
        DelayMs(0xcff);
        HT1621_WirteData(SEG_addr[2],Data_lowSEG[5]);
        DelayMs(1);
        HT1621_WirteData(SEG_addr[3],Data_highSEG[5]);
        DelayMs(0xcff);
        HT1621_WirteData(SEG_addr[2],Data_lowSEG[6]);
        DelayMs(1);
        HT1621_WirteData(SEG_addr[3],Data_highSEG[6]);
        DelayMs(0xcff);
        HT1621_WirteData(SEG_addr[2],Data_lowSEG[7]);
        DelayMs(1);
        HT1621_WirteData(SEG_addr[3],Data_highSEG[7]);
        DelayMs(0xcff);
        HT1621_WirteData(SEG_addr[2],Data_lowSEG[8]);
        DelayMs(1);
        HT1621_WirteData(SEG_addr[3],Data_highSEG[8]);
        DelayMs(0xcff);
        HT1621_WirteData(SEG_addr[2],Data_lowSEG[9]);
        DelayMs(1);
        HT1621_WirteData(SEG_addr[3],Data_highSEG[9]);
        DelayMs(0xcff);

	}
}

 数组中的数据根据对应需要点亮数字的高低电平来设置

uchar SEG_addr[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1AD,0x1E,0x1F};
uchar Data_highSEG[]={ 0x0e,0x06,0x0c,0x0e,0x06,0x0a,0x0a,0x0e,0x0e,0x0e};
uchar Data_lowSEG[]={0x0b,0x00,0x07,0x05,0x0c,0x0d,0x0f,0x00,0x0f,0x0d};

最终实现的是数字从0到9的循环显示文章来源地址https://www.toymoban.com/news/detail-497521.html

到了这里,关于DSP28035驱动HT1621B显示段码LCD屏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32篇】驱动LCD显示屏

    本次使用的硬件设备为野火的霸道V2开发板,显示器控制芯片型号为ILI9341,实际型号为ST7789V。在编写代码时参考的是ILI9341数据手册,二者差别不大,都是240*320分辨率。         ILI9341是一个用于TFT液晶显示的单芯片控制驱动器,具有262144色的240RGB x 320像素显示解决方案。

    2024年02月12日
    浏览(29)
  • TFT-LCD显示驱动系统架构

    TFT-LCD驱动的核心是电压和透过率的关系。驱动电压决定子像素透过的亮度,不同的RGB子像素亮度组合形成各种颜色,不同像素上的不同颜色最后组成五彩缤纷的画面。 伽马调节与校正 通过V-T曲线,它是透过率和驱动电压之间的关系曲线。V-T曲线是一种非线性响应,这种非线

    2023年04月16日
    浏览(31)
  • 使用STM32微控制器驱动LCD1602显示器

    驱动LCD1602显示器是嵌入式系统常见的任务之一,而STM32微控制器因其灵活性和丰富的外设而成为了广泛采用的解决方案。 在这篇文章中,我们将探讨如何使用STM32微控制器来驱动LCD1602显示器。我们将从STM32的GPIO配置、延时函数以及LCD1602的初始化和写入数据等方面展开讨论,

    2024年04月17日
    浏览(33)
  • 基于51单片机驱动MPU6050模块(LCD1602显示)

    @TOC MPU-6050集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP,可用IIC接口连接一个第三方的数字传感器。MPU-6050对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范

    2024年02月11日
    浏览(29)
  • ESP32设备驱动-I2C-LCD1602显示屏驱动

    LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。 通过前面的实例我们知道,并口方式连接LCD1602将占用一定数量的GPIO口,在

    2024年02月07日
    浏览(40)
  • STM32驱动0.96寸TFT 彩色LCD模块显示

    小型的彩色LCD模块如一款0.96寸模块,由ST7735S驱动芯片和LCD屏幕组成。STM32通过驱动ST7735S,从而实现对彩色LCD的驱动。 这里将STM32通过硬件SPI驱动0.96寸TFT彩色LCD的参考代码,移植到STM32CUBEIDE开发环境。以STM32G030F6P6为例,可以用于采用ST7735S驱动芯片的其它尺寸LCD屏幕驱动。 LC

    2024年02月16日
    浏览(36)
  • stm32驱动st7789 TFT-LCD屏幕显示

    一切程序以最后百度网盘链接的程序为准,可能在写文章的时候有些地方有改动。 主控:STM32F103C8T6 1.69 TFT-LCD(st7789驱动) 1.1接线说明 1.2硬件初始化 TFT-LCD是采用SPI通信的,这里使用stm32f103c8t6的SPI1,初始化代码如下 1.3驱动初始化 在原有的驱动基础上增加了几个宏去控制显

    2024年02月16日
    浏览(42)
  • u8g2库的使用及驱动LCD显示中文

    1、准备工作 Env 工具包含了 RT-Thread 源代码开发编译环境和软件包管理系统。 从 RT-Thread 官网下载 Env 工具。https://www.rt-thread.org/download.html。 在电脑上装好 git,软件包管理功能需要 git 的支持。git 的下载地址为https://git-scm.com/downloads,根据向导正确安装 git,并将 git 添加到系

    2024年02月02日
    浏览(36)
  • 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)

    点击图片购买 HC- SR04+是一款宽电压工作的超声波测距模块。模块外形尺寸及软件与老版本 HC- SR04完全兼容;可以与老版本HC SR04无缝切换。低至3V的低工作电压, 使其与3.3V供电的MCU可以直接连接。 特点 探测角度: 15° 采用工业级MCU,工作温度:-20C~80C 探测距离:5V:2cm-- 450cm;3.3V: 2c

    2024年02月02日
    浏览(46)
  • 荔枝派Zero(全志V3S)驱动开发之RGB LCD屏幕显示bmp图片

    了解 framebuffer 字符设备 了解 bmp图片格式 通过操作 /dev/fb0 字符设备来实现在 RGB LCD 屏幕上显示 bmp 图片。 显示设备例如 LCD,在 Linux 中用 Framebuffer 来表征, Framebuffer 翻译过来就是帧缓冲,简称 fb,在 /dev 目录下显示设备一般表示成这样: /dev/fbn ,应用程序通过访问这个设备

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包