打印
[其他ST产品]

STM32连接HT1621段码屏驱动

[复制链接]
406|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HT1621:128个位元LCD控制器,内部RAM直接对应LCD显示单元。
对于HT1621,操作之前应发送标志码,表明要求工作在哪种状态,标志定义如下:


为了点亮LCD,必须先给出两个控制指令,system enable与LCDON

使用特权

评论回复
沙发
原来是wjc|  楼主 | 2022-12-25 15:51 | 只看该作者
系统默认:

关振荡器和LCD偏压发生器
关LCD偏压
关闭声音输出
系统时钟源,片内RC

使用特权

评论回复
板凳
原来是wjc|  楼主 | 2022-12-25 15:56 | 只看该作者
操作结束后可以用SYSTEM DISABLE来关闭LCD.
由于是串行通信,数据应该先出现在DATA脚,然后给出一个
写允许信号(WR),输入一位数据,接着输入第二位,直到全部写入。

使用特权

评论回复
地板
原来是wjc|  楼主 | 2022-12-27 16:00 | 只看该作者
RAM区不连续写数据过程:
先发送标志码101,表明下面要进行写操作,然后发送地址码A5--A0?,用D0-D3指定对应的位,就可以对LCD相应的位元操作了,连续写时,给出起始地址,操作结束地址自动加1。

使用特权

评论回复
5
原来是wjc|  楼主 | 2022-12-27 16:01 | 只看该作者
PE1 – CS
PB6 – TX DAT MOSI
PB7 – RX WR MISO
.h文件内的定义需要根据自己的IO口和段码屏的真值表修改,如果屏幕不亮看下接口电压和电阻是否匹配。

使用特权

评论回复
6
原来是wjc|  楼主 | 2022-12-27 16:01 | 只看该作者
HT1621.h文件
//ht1621.h
//管脚设置
#define HT1621_CS_H   GPIO_SetBits(GPIOE,GPIO_Pin_1)
#define HT1621_CS_L   GPIO_ResetBits(GPIOE,GPIO_Pin_1)

#define HT1621_DAT_H   GPIO_SetBits(GPIOB,GPIO_Pin_6)
#define HT1621_DAT_L   GPIO_ResetBits(GPIOB,GPIO_Pin_6)

#define HT1621_WR_H   GPIO_SetBits(GPIOB,GPIO_Pin_7)
#define HT1621_WR_L   GPIO_ResetBits(GPIOB,GPIO_Pin_7)

//HT1621控制命令
#define                SYSDIS                                                                 0X00   //0B 100        0000        0000        X  关振荡器和LCD偏压发生器
#define         SYSEN                                                                 0X01   //0B 100        0000        0001        X  打开系统振荡器
#define         LCDOFF                                                                 0X02   //0B 100        0000        0010        X  关LCD偏压
#define         LCDON                                                                 0X03   //0B 100        0000        0011        X  开LCD偏压
#define         TIMERDIS                                                         0X04   //0B 100        0000        0100        X  时基输出失效
#define         WDTDIS                                                                0X05   //0B 100        0000        0101        X  WDT溢出标志输出失效
#define         TIMEREN                                                         0X06   //0B 100        0000        0110        X  时基输出使能
#define         WDTEN                                                                 0X07   //0B 100        0000        0111        X  WDT溢出标志输出有效
#define         TONEOFF                                                                0X08   //0B 100        0000        1000        X  关闭声音输出
#define         TONEON                                                                 0X09   //0B 100        0000        1001        X  打开声音输出
#define         CLRTIMER                                                         0X0C   //0B 100        0000        1100        X  时基发生器清零
#define         CLRWDT                                                                 0X0E   //0B 100        0000        1110        X  清除WDT状态
#define         XTAL_32K                                                         0X14   //0B 100        0001        0100        X  系统时钟源,晶振
#define         RC256                                                                 0X18   //0B 100        0001        1000        X  系统时钟源,片内RC
#define         EXT256                                                                 0X1C   //0B 100        0001        1100        X  系统时钟源,外部时钟源

#define         BIAS1_2_2COM                                        0X20   //0B 100        0010        0000        X         LCD 1/2偏压选项,2个公共口
#define         BIAS1_2_3COM                                        0X24   //0B 100        0010        0100        X         LCD 1/2偏压选项,3个公共口
#define         BIAS1_2_4COM                                        0X28   //0B 100        0010        1000        X         LCD 1/2偏压选项,4个公共口

#define         BIAS1_3_2COM                                        0X21   //0B 100        0010        0001        X         LCD 1/3偏压选项,2个公共口
#define         BIAS1_3_3COM                                        0X25   //0B 100        0010        0101        X         LCD 1/3偏压选项,3个公共口
#define         BIAS1_3_4COM                                        0X29   //0B 100        0010        1001        X         LCD 1/3偏压选项,4个公共口

#define         TONE4K                                                                 0X40   //0B 100        0100        0000        X  声音频率4K
#define         TONE2K                                                                0X50   //0B 100        0110        0000        X  声音频率2K
#define         IRQ_DIS                                                         0X80   //0B 100        1000        0000        X  使/IRQ输出失效
#define         IRQ_EN                                                                0X88   //0B 100        1000        1000        X  使/IRQ输出有效
#define     BIAS 0x52 //0b1000 0101 0010 1/3duty 4com

//地址,SEG值
#define         DisTime_shi_H                                0X11        //Seg17
#define         DisTime_shi_L                                0X10        //Seg16

#define         DisTime_ge_H                                0X0F        //Seg15
#define         DisTime_ge_L                                0X0E        //Seg14

#define         DisPower_shi_H                                0X0D        //Seg13
#define         DisPower_shi_L                                0X0C        //Seg12

#define         DisPower_ge_H                                0X0B        //Seg11
#define         DisPower_ge_L                                0X0A        //Seg10

#define         DisSoundInten_shi_H                    0X04        //Seg4
#define         DisSoundInten_shi_L                    0X03        //Seg3

#define         DisSoundInten_ge_H                    0X02        //Seg2
#define         DisSoundInten_ge_L                    0X01        //Seg1

#define         DisMHz_H                                        0X08        //Seg8
#define         DisMHz_L                                        0X07        //Seg7

#define         DisDuty_H                                        0X06        //Seg6
#define         DisDuty_L                                        0X05        //Seg5

#define   DisFlash                                    0X09        //Seg9

#define         Run_Mode                                        0X00        //Seg0

//seg0,数据,COM值。
#define         Mode_Serial                                        0X04        //com2
#define         Mode_Interrupted                        0X08        //com3
#define         Mode_Mode                                        0X02        //com1

//seg9,mark掩码
#define         MHz_Fresh                                        0X01        //com0
#define         Time_Fresh                                           0X08        //com3
#define         Out_Power                                           0X04        //com2

#define         COM_1                                                 0X01        //com0
#define         COM_2                                                 0X02        //com1
#define         COM_3                                                 0X04        //com2
#define         COM_4                                                 0X08        //com3

使用特权

评论回复
7
原来是wjc|  楼主 | 2022-12-27 16:03 | 只看该作者
HT1621.c文件
//ht1621.c
//7段数码管数字码。高四位对应SEG_H,低四位对应SGE_L
u8 SegCode[10]= {
    0XAF,        //0
    0XA0,        //1
    0XCB,        //2
    0XE9,        //3
    0XE4,        //4
    0X6D,        //5
    0X6F,        //6
    0XA8,        //7
    0XEF,        //8
    0XED    //9
};
/*********************************************************
函数名:LCD_GPIO_Configuration()
返回值:无
功  能:端口初始化
PE1 -- CS  DAT
PB6 -- TX
PB7 -- RX  WR
*********************************************************/
void LCD_GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6| GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/*********************************************************
函数名:SendBit_1621()
返回值:无
功  能:HT1621数据写入函数
Data为数据,cnt为数据位数
//发送指定的位,先发送最高位,用于发送命令与SEG
//dat的高cnt位写入1621,高位在前,如0x80的高三位是100
*********************************************************/
void SendBit_1621(u8 dat,u8 cnt)
{
    u8 i;
    for(i=0; i<cnt; i++)
    {
        HT1621_WR_L;
        Ht1621_delay_10us(1);
        if((dat&0x80)==0)
        {
            HT1621_DAT_L;
        }
        else
        {
            HT1621_DAT_H;
        }

        Ht1621_delay_10us(1);
        HT1621_WR_H;
        Ht1621_delay_10us(1);
        dat<<=1;
    }
}
/********************************************************
函数名称:void SendDataBit_1621(uchar dat,uchar cnt)
功能描述: HT1621在指定地址写入数据函数
全局变量:无
参数说明:Addr为写入初始地址,Data为写入数据
返回说明:无
说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
//发送指定的位,先发送最低位,用于发送com
//dat的低cnt位写入1621,低位在前
//a5-a4-a3-a2-a1-a0-d0-d1-d2-d3,  a为地址:seg     d 为com
********************************************************/
void SendDataBit_1621(u8 dat,u8 cnt)
{
    u8 i;
    for(i=0; i<cnt; i++)
    {
        if((dat&0x01)==0)
        {
            HT1621_DAT_L;
        }
        else
        {
            HT1621_DAT_H;
        }

        Ht1621_delay_10us(1);
        HT1621_WR_L;
        Ht1621_delay_10us(1);
        HT1621_WR_H;
        Ht1621_delay_10us(1);
        dat>>=1;
    }
}
/********************************************************
函数名称:void SendCmd(uchar Cmd)
功能描述: HT1621命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
返回说明:无
说 明:写入命令标识位100
********************************************************/
void SendCmd(u8 Cmd)
{
    HT1621_CS_L;
    Ht1621_delay_10us(1);
    SendBit_1621(0x80,3); // - - 写入命令标志100//写入标志码"100"命令模式
    SendBit_1621(Cmd,9); // - - 写入命令数据//写入9位数据,其中前8位是命令,最后一位任意。
    HT1621_CS_H;
    Ht1621_delay_10us(1);
}
/********************************************************
函数名称:void Write_1621(uchar Cmd)
功能描述: HT1621命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
返回说明:无
//发送命令+地址+数据    地址SEG   com0-com4
********************************************************/
void Write_1621(u8  addr,u8 dat)
{
    HT1621_CS_L;
    Ht1621_delay_10us(1);
    SendBit_1621(0xa0,3); // - - 写入数据标志101
    SendBit_1621(addr<<2,6); // - - 写入地址数据//写入6位地址,SEG
    SendDataBit_1621(dat,4);                //写入DAT低4位,分别对应COM3,COM2,COM1,COM0
    HT1621_CS_H;
    Ht1621_delay_10us(1);
}
/********************************************************
函数名称:void WriteAll_1621(uchar Addr,uchar *p,uchar cnt)
功能描述: HT1621连续写入方式函数
全局变量:无
参数说明:Addr为写入初始地址,*p为连续写入数据指针,
cnt为写入数据总数
返回说明:无
说 明:HT1621的数据位4位,此处每次数据为8位,写入数据
总数按8位计算
********************************************************/
void WriteAll_1621(u8 Addr,u8 *p,u8 cnt)
{
    u8 i;
    HT1621_CS_L;
    SendBit_1621(0xa0,3); // - - 写入数据标志101
    SendBit_1621(Addr<<2,6); // - - 写入地址数据
    for (i=0; i<cnt; i++)
    {
        SendDataBit_1621(*p,8); // - - 写入数据
        p++;
    }
    HT1621_CS_H;
    Ht1621_delay_10us(1);
}

/********************************************************
函数名称:void Ht1621_Init(void)
功能描述: HT1621初始化
全局变量:无
参数说明:无
返回说明:无
版 本:1.0
说 明:初始化后,液晶屏所有字段均显示
********************************************************/
void HT1621_Init(void)
{
                            HT1621_CS_H;
                        HT1621_WR_H;
                        HT1621_DAT_H;
                        Ht1621_delayms(500); // - - 延时使LCD工作电压稳定
                        SendCmd(0x52);
                        SendCmd(0X30); // - - 使用内部振荡器 0X30
                        SendCmd(0X00); // - - 关振系统荡器和LCD偏压发生器 0X00
                        SendCmd(0X0A); // - - 禁止看门狗  0X0A
                        SendCmd(0X02); // - - 打开系统振荡器 0X02
                        SendCmd(0X06); // - - 打开LCD偏压 0X06

//    HT1621_CS_H;
//    HT1621_WR_H;
//    HT1621_DAT_H;
//    Ht1621_delayms(500); // - - 延时使LCD工作电压稳定
    SendCmd(BIAS1_3_4COM);//设定1/3偏压,4个COM
//    SendCmd(RC256); // - - 使用内部振荡器
//    SendCmd(SYSDIS); // - - 关振系统荡器和LCD偏压发生器
//    SendCmd(WDTDIS); // - - 禁止看门狗
    SendCmd(SYSEN); // - - 打开系统振荡器
    SendCmd(LCDON); // - - 打开LCD偏压
//    Clean_All();
}
/********************************************************
函数名称:void TimeDispaly (void)
功能描述: HT1621初始化
函数功能:显示时间十位与个位。
传递参数:时间值,最大30分钟
说明:一个7段数码要写两次才能完成,因为7段数据公布在两个SEG上。
Write_1621(地址,数据):只发送4位数据。
********************************************************/
void TimeDispaly(u8 Time)
{
    Split(Time);//分离数据的十位和个位
    Write_1621(DisTime_shi_H,SegCode[AllData.Digit_Tens]);                                        //先写低4位,
    Write_1621(DisTime_shi_L,SegCode[AllData.Digit_Tens]>>4);                                //将高4位右移4位再写

    Write_1621(DisTime_ge_H,SegCode[AllData.Digit_Units]);
    Write_1621(DisTime_ge_L,(SegCode[AllData.Digit_Units]>>4)|0x01);//显示小数点,最低位为1.
}
//显示全部
void Diaplay_ShowAll(void)
{
    u8 i;
    for(i=0; i<19; i++)
    {
        Write_1621(i,0x0f);
    }
}
//清屏
void Clean_All(void)
{
    u8 i;
    for(i=0; i<19; i++)
    {
        Write_1621(i,0x00);
    }
}

使用特权

评论回复
8
hujiaqi06| | 2022-12-29 16:04 | 只看该作者

使用特权

评论回复
9
Bowclad| | 2023-1-1 17:06 | 只看该作者
控制指令是在数据手册里面的吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

944

帖子

0

粉丝