STM32连接HT1621段码屏驱动

    技术2022-07-12  93

    HT1621:128个位元LCD控制器,内部RAM直接对应LCD显示单元。 对于HT1621,操作之前应发送标志码,表明要求工作在哪种状态,标志定义如下:

    操作状态标志码读数据110写数据101读-修改-写数据101控制命令100

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

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

    操作结束后可以用SYSTEM DISABLE来关闭LCD. 由于是串行通信,数据应该先出现在DATA脚,然后给出一个 写允许信号(WR),输入一位数据,接着输入第二位,直到全部写入。

    RAM区不连续写数据过程: 先发送标志码101,表明下面要进行写操作,然后发送地址码A5--A0?,用D0-D3指定对应的位,就可以对LCD相应的位元操作了,连续写时,给出起始地址,操作结束地址自动加1。

    PE1 – CS PB6 – TX DAT MOSI PB7 – RX WR MISO .h文件内的定义需要根据自己的IO口和段码屏的真值表修改,如果屏幕不亮看下接口电压和电阻是否匹配。

    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

    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); } }
    Processed: 0.024, SQL: 10