一、HT1621B

 

1、HT1621B的接口脚主要有4个,只对LCD进行显示的话可以不用考虑RD脚

I/O
功 能 描 述
/CS 片选输入,接一上拉电阻
/CS 为高电平 读写 HT1621 的数据和命令无效串行接口电路复位
/CS 为低电平和作为输入时读写 HT1621 的数据和命令有效
/RD READ 脉冲输入 ,接一上拉电阻

/RD 信号的下降沿 HT1621 内存的数据被读到DATA 线上 主控制器可以在下一个上升沿时锁存这些数据
/WR WRITE 脉冲输入,接一上拉电阻

/WR 信号的 上升 沿 DATA 线上的 数据 写到HT1621
DATA
外接上拉电阻的串行数据输入 / 输出

 

2、显存映射

通常一个段式的LCD编码都是如下图所示

  • 我使用到的LCD 字符编码
PIN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
COM0 COM0       D1 T2 D2 T1 D3 T D4 DOT1 D5 DOT2 D6 DOT3
COM1   COM1     E1 C1 E2 C2 E3 C3 E4 C4 E5 C5 E6 C6
COM2     COM2   G1 B1 G2 B2 G3 B3 G4 B4 G5 B5 G6 B6
COM3       COM3 F1 A1 F2 A2 F3 A3 F4 A4 F5 A5 F6 A6

 

HT1621B的显存结构,与LCD编码结构一致,假如连线正常,如果HT1621B的显存SEG0,SEG1对应LCD的一位,如果往HT1621B的SEG0显存的BIT0写入1则对应数码管的D笔段亮,如果往SEG1的显存BIT3写入1则该位的A笔段亮。

3、时序

     HT1621B是通过一根数据线进行串行数据传输的,WR管脚在低电平下可以改变DATA管脚上的数据,WR管脚电平由低到高数据写入HT1621B

 

只用到了的写命令与写数据的简单模式

*写数据时序

时序:拉低CS开始传输数据—传送前导码101–传送6位地址数据–传送显存4位数据–拉高CS完成一次数据传输

 

*写命令时序

时序:拉低CS开始传输数据—传送前导码100–传送9位命令数据–拉高CS完成一次数据传输

 

二、HT1621B的简单实现代码

//头文件

#include "stm32f4xx.h"

#include "delay.h"

#ifndef __SEG_LCD_H

#define __SEG_LCD_H

//主频为168Mhz 需要在和ht1621b进行数据传输的时加延迟时间

//CS

#define CS_LOW { GPIO_ResetBits(GPIOA, GPIO_Pin_6) ; Delay_us(5); }

#define CS_HIGH { GPIO_SetBits(GPIOA, GPIO_Pin_6) ; Delay_us(5); }

//RD

#define RD_LOW { GPIO_ResetBits(GPIOG, GPIO_Pin_12); Delay_us(5); }

#define RD_HIGH { GPIO_SetBits(GPIOG, GPIO_Pin_12); Delay_us(5); }

//WR

#define WR_LOW { GPIO_ResetBits(GPIOG, GPIO_Pin_13); Delay_us(5); }

#define WR_HIGH { GPIO_SetBits(GPIOG, GPIO_Pin_13); Delay_us(5); }

//DATA

#define DATA_LOW { GPIO_ResetBits(GPIOG, GPIO_Pin_14); Delay_us(5); }

#define DATA_HIGH { GPIO_SetBits(GPIOG, GPIO_Pin_14); Delay_us(5); }

#define BIAS_3_1_COM_4 0x52 //0b1000 0101 0010 1/3duty 4com

#define SYS_DIS 0X00 //0b1000 0000 0000 关闭振荡器与偏压发生器

#define SYS_EN 0X02 //0b1000 0000 0010 打开振荡器

#define LCD_OFF 0X04 //0b1000 0000 0100 关闭偏压发生器

#define LCD_ON 0X06 //0b1000 0000 0110 打开偏压发生器

#define WDT_DIS 0X0A //0b1000 0000 1010 关闭看门狗

//LCD各段定义

#define LCD_A 0x80

#define LCD_B 0x40

#define LCD_C 0x20

#define LCD_D 0x01

#define LCD_E 0x02

#define LCD_F 0x08

#define LCD_G 0x04

#define LCD_CTL 0x10

extern const unsigned char LCD_Code[10];

void send_ht1621b_command(unsigned char command);

void send_ht1621b_data(unsigned short int address,unsigned short int data);

void ht1621b_init(void);

/* __SEG_LCD_H */

//源文件

/*

*STM32驱动HT1621B的实现

*

*/

#include"seg_lcd.h"

//数字0-9的编码

const unsigned char LCD_Code[10]={

LCD_A + LCD_B + LCD_C + LCD_D + LCD_E + LCD_F,//0

LCD_E + LCD_F,//1

LCD_A + LCD_B + LCD_D + LCD_E + LCD_G,//2

LCD_A + LCD_B + LCD_C + LCD_D + LCD_G ,//3

LCD_B + LCD_C + LCD_F + LCD_G ,//4

LCD_A + LCD_C + LCD_D + LCD_G + LCD_F,//5

LCD_A + LCD_G + LCD_C + LCD_D + LCD_E + LCD_F,//6

LCD_A + LCD_B + LCD_C ,//7

LCD_A + LCD_B + LCD_C + LCD_D + LCD_E + LCD_F + LCD_G,//8

LCD_A + LCD_B + LCD_C + LCD_D + LCD_F + LCD_G,//9

} ;

//向HT1621B写入一个命令

void send_ht1621b_command(unsigned char command)

{

unsigned short int i;

CS_LOW //拉低CS 使得命令数据有效

//前导码1

WR_LOW //先发送代码前导100

DATA_HIGH

WR_HIGH

//前导码0

WR_LOW //基本的使用,命令的

DATA_LOW

WR_HIGH

//前导码0

WR_LOW

WR_HIGH

//命令数据C8

WR_LOW //因为使用到的基本命令C8都是为0的,所有直接写0了,如果需要用到C8不是为0的命令,需要修改这个函数的实现

WR_HIGH

for (i =0;i<=7;i++) //逐位发送剩余的8位命令

{

WR_LOW

if ((command & 0x80) !=0)

DATA_HIGH

else

DATA_LOW

WR_HIGH

command = command << 1;

}

CS_HIGH //拉高CS

}

//向HT1621B写入一个数据

void send_ht1621b_data(unsigned short int address,unsigned short int data)

{

unsigned short int i;

CS_LOW //拉低CS 使得命令数据有效

//1

WR_LOW //先发送代码前导101

DATA_HIGH

WR_HIGH

//0

WR_LOW

DATA_LOW

WR_HIGH

//1

WR_LOW

DATA_HIGH

WR_HIGH

address = address << 2; //获取6位地址发送

for ( i =0;i<=5;i++)

{

WR_LOW

if ((address & 0x80) !=0)

DATA_HIGH

else

DATA_LOW

WR_HIGH

address = address << 1;

}

for (i =0;i<=3;i++) //发送4位数据

{

WR_LOW

if ((data & 0x01) !=0) DATA_HIGH

else DATA_LOW

WR_HIGH

data = data >> 1;

}

CS_HIGH

}

/*

封装一下数据传输

addr 为LCD显示位置 1-16

num 为显示的数据 0-9

*/

void LCD_Display(uint8_t addr,uint8_t num)

{

if((addr>=1)&&(addr<=16)&&(num<=9)) //判断一下吧

{

send_ht1621b_data(addr*2-2, LCD_Code[num] & 0x0f);//低位

send_ht1621b_data(addr*2-1, LCD_Code[num] >> 4);//高位

}

}

//初始化HT1621B

void ht1621b_init(void)

{

//CS

GPIO_InitTypeDef GPIO_InitStructure_A;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

GPIO_InitStructure_A.GPIO_Pin =GPIO_Pin_6;

GPIO_InitStructure_A.GPIO_Mode =GPIO_Mode_OUT;

GPIO_InitStructure_A.GPIO_Speed=GPIO_Speed_25MHz;

GPIO_InitStructure_A.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure_A.GPIO_PuPd=GPIO_PuPd_UP;

GPIO_Init(GPIOA,&GPIO_InitStructure_A);

//LED4 RD WR DATA

GPIO_InitTypeDef GPIO_InitStructure_G;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);

GPIO_InitStructure_G.GPIO_Pin =GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;

GPIO_InitStructure_G.GPIO_Mode =GPIO_Mode_OUT;

GPIO_InitStructure_G.GPIO_Speed=GPIO_Speed_25MHz;

GPIO_InitStructure_G.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure_G.GPIO_PuPd=GPIO_PuPd_UP;

GPIO_Init(GPIOG,&GPIO_InitStructure_G);

CS_HIGH

RD_HIGH

WR_HIGH

DATA_HIGH

send_ht1621b_command(BIAS_3_1_COM_4); //1/3bias,4com

send_ht1621b_command(WDT_DIS);//关闭看门狗

send_ht1621b_command(SYS_EN);//打开系统振荡器

send_ht1621b_command(LCD_ON);//打开偏压发生器

}


 

发表评论

你的电子邮件地址不会被公开 * 为必填字段

提交评论