驱动IC:HT1621B
MCU:STM8S003F3
第一:
1.我们首先来看一下,原理图的连接情况:
2.再来看一下,MCU规格书。
选用:
mcu pin17连接LCDPower
pin16连接DATA
pin15连接WR
pin14连接RD
pin13连接CS
//补充:
cs:cs脚用于初始化串行接口电路和结束主控制器与HT1621之间的通讯,cs设置为1 时主控制器和HT1621之间的数据和命令无效并初始化。在产生模式命令或模式转换之前必须用一个高电平脉冲初始化HT1621的串行接口。
SET_CS;//CS端需要有一个高电平来初始化
SET_WR;
SET_DATA;
delay_ms(1);
RST_CS;
delay_ms(1);
data:data脚是串行输入/输出的管脚,读和写数据和写命令通过DATA脚来进行。
RD:RD脚是读时钟输入管脚,在RD信号的下降沿时数据输出管脚DATA上,在RD信号上升沿与下一个下降沿之间,主控器应读取相应的数据。
WR:WR脚是写时钟输入管脚,在WR信号上升沿时,管脚DATA上的数据、地址、命令被写入HT1621.
HT1621的命令格式:
//modify: 修改; 修饰; 调整; 使更适合; 缓和; 使温和;
HT1621的引脚定义
其他:对于HT1621显示驱动的一些理解
RAM的数据直接映像到LCD驱动器,可以使用读写命令访问。
怎么理解?
观察此图:
从映像图中可以看出,每一个HT1621的地址都会对应LCD,而对HT1621的地址4位操作。
这边不是很理解,我们来一起分析一个HT1621这个IC。
1.HT1621的硬件连线与LCD怎么连接?
LCD和HT1621的SEG(段电极)和COM(公共电极)对应连接。
2.HT1621B,其中的D0~D3,A0~A5各代表什么意思?
1621B带32SEG*4COM,128段(怎么去理解128段,相当于可以显示支持128段的LED)。
显示数据与显示内容是这样对应的-------一个8进制一个字节二进制数对应2根SEG线上的8个段码,1为显示,0为不显示。
例:
SEG0上的LCD连接是ABCD四个段码,SEG1上是内容是EFGH四个段码,公共电极COM,C0连接AE这两个段码,C1连接BF,C2连接CG,C3连接DH,按照此逻辑输入“01100011”,高4位对应SEG1,低电位对应SEG0,将同时显示FGAB四个段码,输入的显示数据不重新输入的话会一直显示,要同时显示2位数字和段码,只要将这些数字和段码在在逻辑表上对应的数据配置1即可同时显示。
待更新~
一些软件的分析
HT1621的命令格式
/* * LCD 模式写入 * 入口:MODE : 0 :COM(命令模式) / 1:DAT(数据模式) * 出口:void */ void write_mode(unsigned char MODE) //写入模式,数据or命令 { RST_WR; //WR=0 delay_us(); SET_DATA; //DATA=1 delay_us(); SET_WR; //WR=1 delay_us(); RST_WR; //WR = 0; delay_us(); RST_DATA; //DATA = 0; delay_us(); SET_WR; //WR = 1; delay_us(); RST_WR; //WR=0 delay_us(); if (MODE) { SET_DATA; //DATA = 1; 写数据模式 } else { RST_DATA; //DATA = 0; 写命令模式 } delay_us(); SET_WR; //WR=1 delay_us(); }
1.WR上升沿的时候写入。
2.MODE为0,DATA 100.
MCU配置HT1621
us时间相关的函数
/*********************** 函数功能:us延时 输入参数:无 输出参数:无 备 注:粗略延时 ***********************/ void delay_us(void) { asm("nop"); //一个asm("nop")函数经过示波器测试代表100ns asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); }
待测一下~
HT1621的初始化
void ht1621_init(void) { LCDPort->DDR |= LCDPin;//输出模式 LCDPort->CR1 |= LCDPin;//推挽输出 SET_CS; //CS拉高 SET_WR; //WR拉高 SET_DATA; //SET拉高 delay_ms(1); RST_CS; //CS拉低 delay_ms(1); write_mode(0); //命令模式 write_command(0x01); //Enable System//0001 write_command(0x03); //Enable Bias//0011 write_command(0x04); //Disable Timer//0100 write_command(0x05); //Disable WDT//0101 write_command(0x08); //Tone OFF//1000 write_command(0x18); //on-chip RC震荡//00010101 // write_command(0x14); //crystal RC震荡//10100 write_command(0x29); //1/4Duty 1/3Bias//00101001 write_command(0x80); //Disable IRQ//10000000 write_command(0x40); //Tone Frequency 4kHZ//01000000 write_command(0xE3); //Normal Mode//11100011 SET_CS; //CS拉高 }
其中:
1.端口输入输出的是,推挽信号。
2.
write_command()函数
void write_command(unsigned char Cbyte) { unsigned char i = 0; for (i = 0; i < 8; i++) { RST_WR; if ((Cbyte >> (7 - i)) & 0x01) { SET_DATA; } else { RST_DATA; } delay_us(); SET_WR; delay_us(); } RST_WR; delay_us(); RST_DATA; delay_us(); SET_WR; delay_us(); }