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文件
#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)
#define SYSDIS 0X00
#define SYSEN 0X01
#define LCDOFF 0X02
#define LCDON 0X03
#define TIMERDIS 0X04
#define WDTDIS 0X05
#define TIMEREN 0X06
#define WDTEN 0X07
#define TONEOFF 0X08
#define TONEON 0X09
#define CLRTIMER 0X0C
#define CLRWDT 0X0E
#define XTAL_32K 0X14
#define RC256 0X18
#define EXT256 0X1C
#define BIAS1_2_2COM 0X20
#define BIAS1_2_3COM 0X24
#define BIAS1_2_4COM 0X28
#define BIAS1_3_2COM 0X21
#define BIAS1_3_3COM 0X25
#define BIAS1_3_4COM 0X29
#define TONE4K 0X40
#define TONE2K 0X50
#define IRQ_DIS 0X80
#define IRQ_EN 0X88
#define BIAS 0x52
#define DisTime_shi_H 0X11
#define DisTime_shi_L 0X10
#define DisTime_ge_H 0X0F
#define DisTime_ge_L 0X0E
#define DisPower_shi_H 0X0D
#define DisPower_shi_L 0X0C
#define DisPower_ge_H 0X0B
#define DisPower_ge_L 0X0A
#define DisSoundInten_shi_H 0X04
#define DisSoundInten_shi_L 0X03
#define DisSoundInten_ge_H 0X02
#define DisSoundInten_ge_L 0X01
#define DisMHz_H 0X08
#define DisMHz_L 0X07
#define DisDuty_H 0X06
#define DisDuty_L 0X05
#define DisFlash 0X09
#define Run_Mode 0X00
#define Mode_Serial 0X04
#define Mode_Interrupted 0X08
#define Mode_Mode 0X02
#define MHz_Fresh 0X01
#define Time_Fresh 0X08
#define Out_Power 0X04
#define COM_1 0X01
#define COM_2 0X02
#define COM_3 0X04
#define COM_4 0X08
HT1621.c文件
u8 SegCode[10]= {
0XAF,
0XA0,
0XCB,
0XE9,
0XE4,
0X6D,
0X6F,
0XA8,
0XEF,
0XED
};
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);
}
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(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(u8 Cmd)
{
HT1621_CS_L;
Ht1621_delay_10us(1);
SendBit_1621(0x80,3);
SendBit_1621(Cmd,9);
HT1621_CS_H;
Ht1621_delay_10us(1);
}
void Write_1621(u8 addr,u8 dat)
{
HT1621_CS_L;
Ht1621_delay_10us(1);
SendBit_1621(0xa0,3);
SendBit_1621(addr<<2,6);
SendDataBit_1621(dat,4);
HT1621_CS_H;
Ht1621_delay_10us(1);
}
void WriteAll_1621(u8 Addr,u8 *p,u8 cnt)
{
u8 i;
HT1621_CS_L;
SendBit_1621(0xa0,3);
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)
{
SendCmd(BIAS1_3_4COM);
SendCmd(SYSEN);
SendCmd(LCDON);
}
void TimeDispaly(u8 Time)
{
Split(Time);
Write_1621(DisTime_shi_H,SegCode[AllData.Digit_Tens]);
Write_1621(DisTime_shi_L,SegCode[AllData.Digit_Tens]>>4);
Write_1621(DisTime_ge_H,SegCode[AllData.Digit_Units]);
Write_1621(DisTime_ge_L,(SegCode[AllData.Digit_Units]>>4)|0x01);
}
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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)