HT1621段码液晶屏
2021/4/6
第一次用HT1621控制的段码液晶屏,东西还没到,先在淘宝买了个小显示屏调试。
或置位,与清零
(x|=(1<<y)) 置位x的第y位
(x&=~(1<<y)) 清零x的第y位
命令格式100开始,8位命令,1位补位
例如:打开LCD偏置发生器 LCD ON 命令
100 00000011 x
写数据格式101开始,6位地址,4位数据
101 A5A4A3A2A1A0 D0D1D2D3
地址就是SEG的序号。
16个引脚,4个COM,12个SEG。
1-16 从左至右
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
com1 | com2 | com3 | com4 | seg11 | seg10 | seg9 | seg8 | seg7 | seg6 | seg5 | seg4 | seg3 | seg2 | seg1 | seg0 |
12个SEG脚每两个控制一个数码管。
以第六个数码管为例
显示数字0,ABCDEF置1,GP置0。
数据位是
0b01111101=0x7D
D0D1D2D3D0D1D2D3
每个是四个二进制码,这里使用8个二进制码,地址自动向下移一位。
上面说写数据中的6位地址就是SEG的序号。是真的地址,10进制的。
控制SEG0 地址码就是0(十进制)
A5 | A4 | A3 | A2 | A1 | A0 |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 |
控制SEG2 地址码就是2(十进制),二进制0b10
A5 | A4 | A3 | A2 | A1 | A0 |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 0 |
控制代码:
由于HT1621需要纳秒级延时,先用定时器写一个纳秒级的延时函数。设置定时器2为1ns触发一次。
void HAL_Delay_us(uint16_t us)
{
uint16_t differ=0xffff-us-5;
HAL_TIM_Base_Start(&htim2);
__HAL_TIM_SetCounter(&htim2,differ);
while(differ < 0xffff-5)
{
differ = __HAL_TIM_GetCounter(&htim2);
}
HAL_TIM_Base_Stop(&htim2);
}
纳秒级延时完成。
先设置引脚。MCU要控制的是WR,DA,CS三个引脚。用户自己选择自己板子的引脚设置
#define RESET_WR(); HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_RESET);
#define SET_WR(); HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_SET);
#define RESET_DA(); HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_RESET);
#define SET_DA(); HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_SET);
#define RESET_CS(); HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_RESET);
#define SET_CS(); HAL_GPIO_WritePin(GPIOX, GPIO_PIN_x, GPIO_PIN_SET);
向HT1621发送字节的函数。sdat是具体数据,cnt是要发送的个数(单位是二进制)。
void HT1621_SendBit(uint8_t sdat,uint8_t cnt)
{
uint8_t i=0;
for(i=0;i<cnt;i++)
{
RESET_WR();
HAL_Delay_us(20);
if(sdat&0x80)
{
SET_DA();
}
else
{
RESET_DA();
}
HAL_Delay_us(20);
SET_WR();
HAL_Delay_us(20);
sdat<<=1;
}
}
发送命令函数,0x80是0b10000000,100是HT1621的命令指令,command就是要控制的指令,如打开时钟等。此函数一般在液晶初始化设置模式时使用。
void HT1621_SendCmd(uint8_t command)
{
RESET_CS();
HT1621_SendBit(0x80,4);
HT1621_SendBit(command,8);
SET_CS();
}
发送数据函数,addr是地址(也就是上面说的SEG的引脚序号),左移2位是因为地址时六位,而uint8_t型是八位,前面空了两位。sdat是数据(就是四个COM口)。如果是向连续地址写,比如数码管,则可以使用发送8位数据的(注释部分)。
void HT1621_WriteData(uint8_t addr,uint8_t sdat)
{
addr<<=2;
sdat<<=4;
RESET_CS();
HT1621_SendBit(0xa0,3);//1010
HT1621_SendBit(addr,6);
HT1621_SendBit(sdat,4); //一次只发送4位数据,一个地址发送1次,低四位
//HT1621_SendBit(sdat,8);
SET_CS();
}
关闭液晶。
#define LCD_OFF 0x04
void LCD_off(void)
{
HT1621_SendCmd(LCD_OFF);
}
打开液晶
#define LCD_ON 0x06
void LCD_on(void)
{
HT1621_SendCmd(LCD_ON);
}
清屏函数,SEG是用到了多少个SEG脚。
#define SEG 14
void LCD_Clear(void)
{
uint8_t i;
uint8_t addr=0;
for(i=0;i<SEG;i++)
{
HT1621_WriteData(addr,0x00);
addr++;
}
}
液晶初始化
#define ComMode 0x52//1/3偏执,4COM口 1000 01010010
#define SYS_EN 0x02
#define RC_OSC 0x30
#define XTAL_OSC 0x28
void HT1621_Init(void)
{
LCD_off();
HT1621_SendCmd(SYS_EN);
HT1621_SendCmd(RC_OSC);//内部时钟
HT1621_SendCmd(ComMode);
LCD_on();
}
代码就是这样了。具体使用,就可以照着液晶的引脚,使用HT1621_WriteData函数控制各个部分亮起熄灭。
代码如下
链接:https://pan.baidu.com/s/10Sld5Ynln1dZaH3J8kwulw
提取码:dirj
如果觉得文章有用就点个赞吧!!!