HT1621液晶显示驱动详细原理及程序
HT1621B驱动液晶LCD连接及程序
//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
_Bool PB_ODR_ODR7 @PB_ODR:7;//CS
_Bool PB_ODR_ODR5 @PB_ODR:5;//WR
_Bool PB_ODR_ODR6 @PB_ODR:6;//DATA
#define CLS_HT_WR PB_ODR_ODR5 = 0 //拉彳氐
//0b10000000 0100关LCD偏压
#define LCDON 0X06
//0b10000000 0110打开LCD偏 压
#define XTAL 0x28
//0b10000010 1000外部接时钟
#define RC256 0X30
//0b10000011 0000内部时钟RC256K
DelayMS(20); //延时一段时间
Ht1621WrAllData();
}
void main()
{
uchar i=0x1d;
CLK_ICKR |= 0x01; //打开内部高速RC
〃CLK_CKDIVR = 0x1B;〃fcpu=2M fmaster=2/8=0.25M〃CLK_CKDIVR = 0x1a; //fcpu=2M fmaster=2/4=0.5M〃CLK_CKDIVR = 0x18; //fcpu=2M fmaster=2/1=2M // port_init();
//PD_CR2 = 0x0;
PE_DDR= 0x20;//PE5---output
PE_CR1= 0x20;
PE_CR2=0x00;
}
//
//函数名称:Ht1621Wr_Data()
HT1621液晶驱动芯片的51单片机程序
uchar code
Ht1621Tab[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00};
//delay us
void Delay(uchar us) //5,7,9
#define WDTDIS 0X0A //0b1000 0000 1010 禁止看门狗
//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
sbit HT1621_DAT=P3^4; //HT1621数据引脚
sbit HT1621_CS=P3^2; //HT1621使能引脚
sbit HT1621_WR=P3^3; //HT1621时钟引脚
#define XTAL 0x28 //0b1000 0010 1000 外部接时钟
#define RC256 0X30 //0b1000 0011 0000 内部时钟
#define TONEON 0X12 //0b1000 0001 0010 打开声音输出
#define TONEOFF 0X10 //0b1000 0001 0000 关闭声音输出
HT1621液晶驱动芯片的51单片机程序
/********************************************************
功能描述: HT1621芯片测试程序
说 明:本测试程序能够测试HT1621的每一个字段,
依次点亮每一个字段
参数:
********************************************************/
用HT1621驱动LCD的方法
用HT1621驱动LCD的方法HT1621是一种专门用于驱动液晶显示屏的电路芯片。
它主要由一个128x32位的RAM、一个系统控制单元、一个液晶电压驱动器和一个驱动信号产生器组成。
下面将详细介绍如何使用HT1621来驱动液晶显示屏。
首先,我们需要了解HT1621的引脚和功能。
HT1621具有36个I/O引脚,其中包括数据线D0-D15、片选线CS、读/写线WR、串行时钟线CLK、复位线RESET和外部时钟线CLOCK。
可以通过这些引脚来与HT1621进行通信和控制。
接下来,我们需要了解液晶显示屏的工作原理。
一般来说,液晶屏主要由一个像素矩阵和一个驱动电路组成。
驱动电路负责根据控制信号来控制像素的亮度。
液晶显示屏的像素矩阵可以根据需要进行修改,以显示所需的图形或文本。
基于以上原理,我们可以开始使用HT1621来驱动液晶显示屏。
以下是一个基本的步骤:1.连接电路:首先,将HT1621和液晶显示屏连接起来。
根据液晶显示屏的引脚分配表和HT1621的引脚分配表,进行正确的连接。
确保电路在工作时不会发生短路或其他问题。
2.初始化HT1621:在开始使用HT1621之前,需要执行一些初始化操作。
这包括设置像素矩阵的大小、选择使用的驱动模式(静态或动态)以及配置其他相关参数。
可以通过向HT1621发送一系列特定的配置命令来完成这些初始化操作。
3.发送数据:一旦HT1621完成初始化,就可以开始向液晶显示屏发送数据了。
可以通过编程将所需的图形或文本数据写入HT1621的RAM中。
注意,HT1621的RAM大小为128x32位,所以需要将图形或文本数据适当地分割和映射到RAM中的相应位置。
4.刷新液晶显示屏:一旦数据写入HT1621的RAM中,需要根据需要刷新液晶显示屏以显示所需的图形或文本。
可以通过向HT1621发送刷新命令来触发刷新操作。
HT1621将读取RAM中的数据并根据驱动电路的要求控制液晶显示屏中的像素亮度。
HT1621测试驱动程序,高手勿喷!
HT1621测试驱动程序,高手勿喷!最近在某宝淘元件的时候,一同买了几种段码LCD模块。
据说是HT1621驱动的,所以在网上搜索来搜索去。
下了好多代码,基本都是加了其他功能的,对于我一个新手来说,其实要的只是驱动显示LCD的程序就可以了。
在不断的搜索研究中发现一位网友发布的一个HT1621测试驱动程序。
这里我在里做了一点点修改和增加了一些备注。
下面上代码:1.// - - * * * * * * * HT1621 段码屏驱动 * * * * * * *2.// - - * MCU: AT89C51 单片机 *3.// - - * MCU-Crystal: 12M 24M 晶振 *4.// - - * Version: 00 版本 *5.// - - * Last Updata: *6.// - - * Author: *7.// - - * Description: HT1621 段码屏驱动 *8.// - - * C 语言程序 *9.// - - * * * * * * * * * * * * * * * * * * * * * * *10.11.12./********************************************************13.功能描述: HT1621芯片测试程序14.15.说明:本测试程序能够测试HT1621的每一个字段,16.17.依次点亮每一个字段18.19.参数:20.********************************************************/21.22.// - - 引用库23.#include24.25.26.// - - 定义函数27.#define uchar unsigned char28.#define uint unsigned int29.30.#define BIAS 0x52 //0b1000 0101 0010 1/3duty 4com31.#define SYSDIS 0X00 //0b1000 0000 0000 关振系统荡器和LCD偏压发生器32.#define SYSEN 0X02 //0b1000 0000 0010 打开系统振荡器33.#define LCDOFF 0X04 //0b1000 0000 0100 关LCD偏压34.#define LCDON 0X06 //0b1000 0000 0110 打开LCD偏压35.#define XTAL 0x28 //0b1000 0010 1000 外部接时钟36.#define RC256 0X30 //0b1000 0011 0000 内部时钟37.#define TONEON 0X12 //0b1000 0001 0010 打开声音输出38.#define TONEOFF 0X10 //0b1000 0001 0000 关闭声音输出39.#define WDTDIS 0X0A //0b1000 0000 1010 禁止看门狗40.41.// - - 定义接口42.// - - HT1621控制位(液晶模块接口定义,根据自已的需要更改)43.sbit HT1621_CS=P3^2; // - - HT1621使能引脚44.sbit HT1621_WR=P3^3; // - - HT1621时钟引脚45.sbit HT1621_DAT=P3^4; // - - HT1621数据引脚46.47.// - - 定义变量,数组48.uchar code49.Ht1621Tab[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,50.51.0x00,0x00,0x00,0x00,0x00};52.53.// - - 定义子程序函数54.void Ht1621_Init(void); // - - 初始化 HT162155.void Ht1621Wr_Data(uchar Data,uchar cnt); // - - HT1621 写入数据函数56.void Ht1621WrCmd(uchar Cmd); // - - HT1621 写入命令函数57.void Ht1621WrOneData(uchar Addr,uchar Data); // - - HT1621 在指定地址写入数据函数58.void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt); // - - HT1621 连续写入数据函数59.60.void Ht1621_delay_10us(uint n); // - - 10微秒的延时子程序61.void Ht1621_delayms(uint xms); // - - 1毫秒延时程序62.63./********************************************************64.函数名称:void Ht1621_Init(void)65.功能描述: HT1621初始化66.全局变量:无67.参数说明:无68.返回说明:无69.版本:1.070.说明:初始化后,液晶屏所有字段均显示71.********************************************************/72.void Ht1621_Init(void)73.{74.HT1621_CS=1;75.HT1621_WR=1;76.HT1621_DAT=1;77.Ht1621_delayms(500); // - - 延时使LCD工作电压稳定78.Ht1621WrCmd(BIAS);79.Ht1621WrCmd(RC256); // - - 使用内部振荡器80.Ht1621WrCmd(SYSDIS); // - - 关振系统荡器和LCD偏压发生器81.Ht1621WrCmd(WDTDIS); // - - 禁止看门狗82.Ht1621WrCmd(SYSEN); // - - 打开系统振荡器83.Ht1621WrCmd(LCDON); // - - 打开声音输出84.}85.86./******************************************************87.函数名称:void Ht1621Wr_Data(uchar Data,uchar cnt)88.功能描述: HT1621数据写入函数89.全局变量:无90.参数说明:Data为数据,cnt为数据位数91.返回说明:无92.说明:写数据函数,cnt为传送数据位数,数据传送为低位在前93.*******************************************************/94.void Ht1621Wr_Data(uchar Data,uchar cnt)95.{96.uchar i;97.for (i=0;i<>98.{99.HT1621_WR=0;100.Ht1621_delay_10us(1);101.HT1621_DAT=Data&0x80;102.Ht1621_delay_10us(1);103.HT1621_WR=1;104.Ht1621_delay_10us(1);105.Data<>106.}107.}108.109./******************************************************** 110.函数名称:void Ht1621WrCmd(uchar Cmd)111.功能描述: HT1621命令写入函数112.全局变量:无113.参数说明:Cmd为写入命令数据114.返回说明:无115.说明:写入命令标识位100116.********************************************************/ 117.void Ht1621WrCmd(uchar Cmd)118.{119.HT1621_CS=0;120.Ht1621_delay_10us(1);121.Ht1621Wr_Data(0x80,4); // - - 写入命令标志100 122.Ht1621Wr_Data(Cmd,8); // - - 写入命令数据123.HT1621_CS=1;124.Ht1621_delay_10us(1);125.}126.127./******************************************************** 128.函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)129.功能描述: HT1621在指定地址写入数据函数130.全局变量:无131.参数说明:Addr为写入初始地址,Data为写入数据132.返回说明:无133.说明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位134.********************************************************/ 135.void Ht1621WrOneData(uchar Addr,uchar Data)136.{137.HT1621_CS=0;138.Ht1621Wr_Data(0xa0,3); // - - 写入数据标志101139.Ht1621Wr_Data(Addr<2,6); -="" -="">140.Ht1621Wr_Data(Data<4,4); -="" -="">141.HT1621_CS=1;142.Ht1621_delay_10us(1);143.}144.145./******************************************************** 146.函数名称:void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)147.功能描述: HT1621连续写入方式函数148.全局变量:无149.参数说明:Addr为写入初始地址,*p为连续写入数据指针,t为写入数据总数151.返回说明:无152.说明:HT1621的数据位4位,此处每次数据为8位,写入数据153.总数按8位计算154.********************************************************/ 155.void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt) 156.{157.uchar i;158.HT1621_CS=0;159.Ht1621Wr_Data(0xa0,3); // - - 写入数据标志101160.Ht1621Wr_Data(Addr<2,6); -="" -="">161.for (i=0;i<>162.{163.Ht1621Wr_Data(*p,8); // - - 写入数据164.p++;165.}166.HT1621_CS=1;167.Ht1621_delay_10us(1);168.}169.170.void Ht1621_delay_10us(uint n) // - - 10微秒的延时子程序171.{172.uint i,j;173.for(i=n;i>0;i--)174.for(j=2;j>0;j--);175.}176.177.void Ht1621_delayms(uint xms) // - - 1毫秒延时程序178.{179.uint i,j;180.for(i = xms;i > 0;i --)181.for(j = 110;j > 0;j --);182.}183.184.185./***********************************186.HT1621 测试程序,作为库文件请注释掉187.***********************************/188.void main()189.{190.uchar i,j,t;191.Ht1621_Init(); // - - 上电初始化LCD192.Ht1621_delayms(5000); // - - 延时一段时间193.while(1){194.Ht1621_delayms(2000);195.Ht1621WrAllData(0,Ht1621Tab,16); // - - 清除1621寄存器数据,暨清屏196.for (i=0;i<>197.{198.t=0x01;199.for (j=0;j<>200.{201.Ht1621WrOneData(i,t);202.t<>203.t++;204.P1_5=~P1_5; // - - 循环点亮LED205.Ht1621_delayms(500);206.}207.}208.}209.}210.经测试在12M 24M 的晶振下能正常显示。
HT1621驱动程序(SONIX)
HT1621驱动程序(SONIX)HT1621_STARTON1: //关闭中断B0BCLR CS //复位1621接口NOP //CS脉冲输出NOP //空操作NOP //B0BSET CS //NOP //NOP //NOP //B0BCLR CS //NOP //NOP //NOP //B0BSET CS //P63 置1,/CS=1MOV A,#11100011B //COMMAND TNORMAL MOV COMMAND,A //CALL C_WRITE //MOV A,#10000000B //COMMAND /IRQ禁止MOV COMMAND,A //CALL C_WRITE //MOV A,#00101001B //COMMAND BIAS1/3,4 COM MOV COMMAND,A //CALL C_WRITE //MOV A,#00000101B //COMMAND WDT 禁止MOV COMMAND,A //CALL C_WRITE //MOV A,#00001100B //MOV COMMAND,A //CALL C_WRITE //MOV A,#00000110B //COMMAND TIMER ON MOV COMMAND,A //CALL C_WRITE //MOV A,#00001100B //MOV COMMAND,A //CALL C_WRITE //MOV A,#00000001B //COMMAND SYS_EN MOV COMMAND,A //CALL C_WRITE //MOV A,#00000011B //COMMAND LCD_ON MOV COMMAND,A //CALL C_WRITE //MOV A,#00FH //LCD MAP SET TO 1MOV wrong,A //S0MOV celsius,A //S1MOV ONE_L,A //S2MOV ONE_H,A //S3MOV TEN_L,A //S4MOV TEN_H,A //S5MOV HUNDRED_L,A //S6MOV HUNDRED_H,A //S7CALL LCD_WRITE //显示所有图标NOP //NOP ////打开中断RET //C_WRITE: MOV A,#08MOV R_LOOP,AB0BSET WR//BS P6,1 ;/WR=1B0BCLR CS//BC P6,3 ;/CS=0NOPNOPB0BCLR WR//BC P6,1 ;/WR=0B0BSET SDA//BS P6,2 ;DATA=1NOPNOPB0BSET WR//BS P6,1 ;/WR=1NOPNOPNOPB0BCLR WR//BC P6,1 ;/WR=0B0BCLR SDA// BC P6,2 ;DATA=0NOPNOPB0BSET WR//BS P6,1 ;/WR=1NOPNOPNOPB0BCLR WR//BC P6,1 ;/WR=0B0BCLR SDA//BC P6,2 ;DATA=0NOPNOPB0BSET WR//BS P6,1 ;/WR=1NOPNOPNOPB0BCLR WR//BC P6,1 ;/WR=0C8_C1_WRITE: B0BTS0 COMMAND.7//JBC COMMAND,7 ;COMMAND,7=0JMP SET_DATA_1B0BCLR SDA//BC P6,2 ;DATA=0NOPNOPJMP NEXT_1SET_DATA_1: BSET SDA//BS P6,2 ;DATA=1 NEXT_1: RLCM COMMAND//RLC COMMAND B0BSET WR//BS P6,1 ;/WR=1NOPNOPNOPB0BCLR WR//BC P6,1 ;/WR=0DECMS R_LOOP//DJZ R_LOOPJMP C8_C1_WRITEB0BCLR SDA//BC P6,2 ;DATA=0B0BSET WR//BS P6,1 ;/WR=1B0BSET CS//BS P6,3 ;/CS=1RETLCD_WRITE:B0BSET WR//BS P6,1 ;/WR=1B0BCLR CS//BC P6,3 ;/CS=0NOPNOPB0BCLR WR//BC P6,1 ;/WR=0B0BSET SDA//BS P6,2 ;DATA=1NOPNOPB0BSET WR//BS P6,1 ;/WR=1NOPNOPB0BCLR WR//BC P6,1 ;/WR=0B0BCLR SDA//BC P6,2 ;DATA=0NOPNOPB0BSET WR//BS P6,1 ;/WR=1NOPNOPNOPB0BCLR WR//BC P6,1 ;/WR=0B0BSET SDA//BS P6,2 ;DATA=1NOPNOPB0BSET WR//BS P6,1 ;/WR=1NOPNOPNOPB0BCLR WR//BC P6,1 ;/WR=0B0BCLR SDA//BC P6,2 ;DATA=0, 1 NOPNOPB0BSET WR//BS P6,1 ;/WR=1B0BCLR WR//BC P6,1 ;/WR=0,DATA=0, 2 NOPNOPNOPB0BSET WR//BS P6,1 ;/WR=1NOPNOPB0BCLR WR//BC P6,1 ;/WR=0 ;DATA=0, 3 NOPNOPNOPB0BSET WR//BS P6,1 ;/WR=1NOPNOPNOPB0BCLR WR// BC P6,1 ;/WR=0;DATA=0, 4 NOPNOPNOPB0BSET WR// BS P6,1 ;/WR=1NOPNOPNOPB0BCLR WR//BC P6,1 ;/WR=0;DATA=0, 5 NOPNOPNOPB0BSET WR//BS P6,1 ;/WR=1NOPNOPNOPB0BCLR WR//BC P6,1 ;/WR=0;DATA=0, 6 NOPNOPNOPB0BSET WR //BS P6,1 ;/WR=1MOV A,WRONG //错误显示寄存器MOV LCDRAM,A //SEG0CALL LCDDATA_W //MOV A,CELSIUS //摄氏度显示寄存器MOV LCDRAM,A //SEG1CALL LCDDATA_W //MOV A,ONE_L //个位显示寄存器低MOV LCDRAM,A //SEG2CALL LCDDATA_W //MOV A,ONE_H //个位显示寄存器高MOV LCDRAM,A //SEG3CALL LCDDATA_W //MOV A,TEN_L //十位显示寄存器低MOV LCDRAM,A //SEG4CALL LCDDATA_W //MOV A,TEN_H //十位显示寄存器高MOV LCDRAM,A //SEG5CALL LCDDATA_W //MOV A,HUNDRED_L //百位显示寄存器低MOV LCDRAM,A //SEG6CALL LCDDATA_W //MOV A,HUNDRED_H //百位显示寄存器高MOV LCDRAM,A //SEG7CALL LCDDATA_W //B0BSET CS //BS P6,3 ;/CS=1NOP //NOP //NOP //NOP //RET //LCDDATA_W: MOV A,#04 //RAM DATA WRITE MOV R_LOOP,A //DATA_W: BTS0 LCDRAM.0 //JBC LCDRAM,0 JMP RAM_SET //B0BCLR SDA // BC P6,2 ;DATA=0JMP NEXT_3 //RAM_SET: B0BSET SDA // BS P6,2 ;DATA=1 NEXT_3: RRCM LCDRAM //RRC LCDRAMB0BSET WR //BS P6,1 ;/WR=1NOP //NOP //NOP //B0BCLR WR //BC P6,1 ;/WR=0DECMS R_LOOP //DJZ R_LOOPJMP DATA_W //NOP //NOP //NOP //RET //HT1621初始化程序结束HT1621_STARTOFF: CLR WRONG //LCD显示关闭CLR CELSIUS //CLR ONE_L //CLR ONE_H //CLR TEN_L //CLR TEN_H //CLR HUNDRED_L //CLR HUNDRED_H //MOV A,#00000010B //HT1621关闭程序开始MOV COMMAND,A //LCD显示关闭CALL C_WRITE //RET //返回;HT1621关闭程序结束。
HT1621驱动段码液晶屏
第十七节:液晶屏第三大类定律—任意位置显示一个点(HT1621驱动段码液晶屏)(1)开场白:段码液晶屏往往应用在出货量比较大的家用消费类电子,比如空调遥控器,小时候带的电子手表等,都是段码屏。
段码屏是非标屏,都是客户定做的,第一次开模费大概一两千元,厂家一般都会有起订量的要求,除此之外,它的单位成本相对要比点阵屏要便宜,而且我个人认为显示的效果要比点阵屏漂亮。
段码屏的驱动程序跟数码管的静态驱动程序一样,只要我们弄懂了怎样显示一个基本单位,根据此基本单位编写一个字库表,然后用与(&)和或(|)这两种位运算符就可以随心所欲编写我们要显示的数字或者形状。
有两种常用的驱动方案:第一种:如果单片机内部集成了seg和com引脚的液晶驱动模块,直接用单片机驱动。
第二种:单片机用3个IO口跟HT1621进行通讯,用HT1621驱动段码屏。
这节我重点介绍第二种。
HT1621有4个COM,分别是com3,com2,com1,com0。
有32个SEG,分别是SEG0,SEG1….SEG31。
什么是COM,什么是SEG?用鸿哥的思路来解释,COM就是横向上的X坐标,SEG就是纵向上的Y坐标。
X坐标与Y坐标组合成一张表格,每格代表一个显示点。
比如HT1621,有4个COM,32个SEG,组成一个32行,每行装4个点的表格,一共有128个点,也就是最多可以显示128个点,用数码管的思路,最多可以显示128个LED灯。
因为纵向上有32行,因此Y轴的地址范围是0到31。
每一行X轴上的4个点,我们用一个字节来表示。
一个字节有8位,高4位分别代表这个4个点,低4位为空。
比如第一行(SEG0行)的第1个(COM3)要显示,第2个(COM2)要显示,第3个(COM1)不要显示,第4个(COM0)不要显示,那么用一个字节来表示就是十六进制的0xc0.要把这两个点点亮,只要把X轴的数据设置成0xc0,Y轴的数据设置成0x00,然后放到鸿哥精心研制的seg_display(unsigned char col, unsigned char pag)驱动程序里就可以了.(2)功能需求:在COM和SEG组成的4X32表格中,显示第二行的第3和第4两个点。
Ht1621_C程序
if((data&0x01)==0) dat=0; else dat=1; wr=0; _nop(); wr=1; data>>=1; } }
void SendCmd(uchar command) {
2
HT48&HT46 MCU 对 HT1621 的读写--使用 C 语言
cs=0; SendBit_1621(0x80,4); SendBit_1621(command,8); cs=1; }
//写入标志位码”100”和 9 位 command 命令,由于 //没有使有到更改时钟输出等命令,为了编程方便 //直接将 command 的最高位写”0”
void Write_1621(uchar addr,uchar data)
{
cs=0; SendBit_1621(0xa0,3); SendBit_1621(addr,6); SendDataBit_1621(data,4);
//写入标志位码”101” //写入 addr 的高 6 位 //写入 data 的低 4 位
cs=1;
}
void WriteAll_1621(uchar addr,uchar *p,uchar cnt)
应用说明
对于 HT1621 操作之前应该给它发送标志位码,表明要求工作在哪种状态。标志位的定义 如下表:
操作 读 写
读 - 修改 - 写 控制
状态 数据 数据 数据 命令
标志位码 110 101 101 100
为了点亮 LCD,必须先给出两个控制指令:SYSTEM ENABLE 和 LCD ON。SYSTEM ENABLE 脚本是:10000000001X(X 为 Don’t care bit)。LCD ON 脚本是:10000000011X (X 为 Don’t care bit)。操作结束可以用 SYSTEM DISABLE 来关闭 LCD。 由于是串行通信,数据应该先出现在 Data Input 脚位,然后给出一个写入允许信号(WR), 输入一位数据,接着输入第二位…直到全部写入。 对 RAM 区不连续写数据过程如下:
1621驱动程序原理与设计
MOV A,LCDCOMMAND ;取得命令字
ACALL send1621byte ;发送到1621
SETB write
SETB cs
SETB sdata
POP LCDBITCNT
POP ACC
RET
;发送命令程序(B)
;名称: Send1621ComB
;描述: 向HT1621B发送控制命令,命令内容在LCDCOMMAND中。
;所发的命令类型为ID=100+0+命令,占用堆栈。
Send1621Com:
PUSH ACC
PUSH LCDBITCNT
ACALL INTI ;起动1621(即初
化)
MOV LCDBITCNT,#04h
MOV A,#80h ;发送ID值100+0
lcdcommand EQU 02H ;发送命令缓冲器
lcdadr EQU 01H ;lcd显存指针
LCDBYTECNT EQU 04H ;发送字节数记数器
;===============================================================================
;描述: 向HT1621B发送BYTECNT个数据(从SEG0开始发送)
; 数据在发送缓冲区中,缓冲区指针lcdadr.
;-----------------------------------------------
Send1621Data:
PUSH ACC
PUSH LCDBITCNT
====
; 向HT1621B发送命令和数据模块
;软件包面向用户的界面程序:
HT1621 LCD 驱动程序
HT1621 LCD 驱动程序用得最多的一款段码LCD驱动控制器HT1621的C51程序2009-04-17 10:30:59| 分类:单片机| 标签:|字号大中小订阅HT1621是台湾Holtek公司推出的段码LCD驱动控制芯片,带同步串行接口,最多可以控制128段驱动方式可选1/2、1/3、1/4 Duty 和1/2、1/3 Bias。
供电电压为2.4~5.2V,无需外部振荡电路。
简单易用。
以下是应用HT1621驱动的LCD模块串行模式的C51范例。
/*HT1621 for C51 */#include /* 8051 寄存器定义请修改为自己用的文件 */typedef unsigned char uchar;typedef unsigned int uint;sbit _CS =P2^0;sbit _WR =P2^1;sbit _DAT=P2^4;/*-----------------*/DELAY(int t) /**/{int i,j;for (i=0;ifor (j=0;j}/*-----------------*/WRITE_COM(uchar com) /*Write a command to LCD*/{uchar i,k;_CS = 0;k=0x80;for(i=0;i!=3;i++) /*Write CMD code:100*/{ if(k&0x80==0)_DAT=0;else_DAT= 1;_WR = 0;_WR = 1;k=k<<1;}k=com;for(i=0;i!=9;i++) /*Write CMD */{if(k&0x80==0) _DAT=0;else _DAT=1;_WR=0;_WR=1;k=k<<1;}_CS=1;}/*------------------*/WRITE_DAT(uchar addr,uchar dat) /*Write display data to LCD*/ {uchar i,k;_CS = 0;k=0xa0;for(i=0;i=!3;i++) /*Write CMD code:101*/{ if(k&0x80==0)_DAT=0;else_DAT= 1;_WR = 0;_WR = 1;k=k<<1;}k=addr<<2;for(i=0;i!=6;i++) /*Write RAM address: xxA5~A0*/{if(k&0x80==0) _DAT=0;else _DAT=1;_WR=0;_WR=1;k=k<<1;}k=dat<<4;for(i=0;i!=4;i++) /*Write Display data :xxxxC0~C3*/{if(k&0x80==0) _DAT=0;else _DAT=1;_WR=0;_WR=1;k=k<<1;}_CS=1;}DISP_NUM(uchar dat) /*Write a number*/{uchar i,j,addr;for (i=8;i!=28;i++){WRITE_DAT(i,dat<<4);WRITE_DAT(++i,dat);}}DIS(uchar dat){uchar i,j;for(i=0;i!=28;i++)WRITE_DAT(i,dat);}SETUP_LCD(void){DELAY(100);WRITE_COM(0x01); /*Enable system*/WRITE_COM(0x18); /*CLOCK SOURCE IS 256kRC ON CHIP*/ WRITE_COM(0x29); /*BIAS=1/3 DUTY=1/4*/WRITE_COM(0x03); /*Display on*/DIS(0x00); /*Clear LCD*/DELAY(20);}main(){uchar i,j,temp;DELAY(100);SETUP_LCD();DELAY(10);while(1){DELAY(200);DIS(0x0f);DELAY(200);DIS(0x00);temp=0xf8;for(i=0;i!=8;i++) /*Display ICONs*/{for(j=0;j=4;j++){WRITE_DAT(i,temp>>1);DELAY(20);}}WRITE_DAT(13,0x01);WRITE_DAT(19,0x01);WRITE_DAT(23,0x01);DELAY(200);DISP_NUM(0xbe); /*0*/DELAY(200);DISP_NUM(0x06); /*1*/DELAY(200);DISP_NUM(0x7c); /*2*/DELAY(200);DISP_NUM(0x5e); /*3*/DELAY(200);DISP_NUM(0xc6); /*4*/DELAY(200);DISP_NUM(0xda); /*5*/DELAY(200);DISP_NUM(0xfa); /*6*/DELAY(200);DISP_NUM(0x0e); /*7*/DELAY(200);DISP_NUM(0xfe); /*8*/DELAY(200);DISP_NUM(0xde); /*9*/ }}。
如何驱动液晶芯片HT1621
#define BIAS 0x50 //0b1000 0101 0000 #endif
1/3duty 4com 1/2duty 4com
#define SYSDIS 0X00
//0b1000 0000 0000 关振系统荡器和 LCD 偏压发生器
HT1621_DATA
: Pin8/PF4
HT1621_CS
: Pin18/PC1HT1621_WR: Pin25/PD0
HT1621_IRQ
: Pin27/PD2
HT1621_BACK_LED : Pin28/PD3
***********************************************************************
#define SYSEN 0X02
//0b1000 0000 0010 打开系统振荡器
#define LCDOFF 0X04
//0b1000 0000 0100 关 LCD 偏压
#define LCDON 0X06
//0b1000 0000 0110 打开 LCD 偏压
#define XTAL 0x28 //0b1000 0010 1000 外部接时钟
#define RC256 0X30
//0b1000 0011 0000 内部时钟
#define TONEON 0X12
//0b1000 0001 0010 打开声音输出
#define TONEOFF 0X10
//0b1000 0001 0000 关闭声音输出
#define WDTDIS 0X0A
//0b1000 0000 1010 禁止看门狗
HT1621驱动段码液晶屏40
第十七节:液晶屏第三大类定律—任意位置显示一个点;段码液晶屏往往应用在出货量比较大的家用消费类电子;段码屏的驱动程序跟数码管的静态驱动程序一样,只要;第一种:如果单片机内部集成了seg和com引脚的;这节我重点介绍第二种;什么是COM,什么是SEG?用鸿哥的思路来解释,;(2)功能需求:;在COM和SEG组成的4X32表格中,显示第二行;(3)硬件原理:;用第十七节:液晶屏第三大类定律—任意位置显示一个点(HT1621驱动段码液晶屏)(1)开场白:段码液晶屏往往应用在出货量比较大的家用消费类电子,比如空调遥控器,小时候带的电子手表等,都是段码屏。
段码屏是非标屏,都是客户定做的,第一次开模费大概一两千元,厂家一般都会有起订量的要求,除此之外,它的单位成本相对要比点阵屏要便宜,而且我个人认为显示的效果要比点阵屏漂亮。
段码屏的驱动程序跟数码管的静态驱动程序一样,只要我们弄懂了怎样显示一个基本单位,根据此基本单位编写一个字库表,然后用与(&)和或(|)这两种位运算符就可以随心所欲编写我们要显示的数字或者形状。
有两种常用的驱动方案:第一种:如果单片机内部集成了seg和com引脚的液晶驱动模块,直接用单片机驱动。
第二种:单片机用3个IO口跟HT1621进行通讯,用HT1621驱动段码屏。
这节我重点介绍第二种。
HT1621有4个COM,分别是com3,com2,com1,com0。
有32个SEG,分别是SEG0,SEG1….SEG31。
什么是COM,什么是SEG?用鸿哥的思路来解释,COM就是横向上的X坐标,SEG就是纵向上的Y坐标。
X坐标与Y坐标组合成一张表格,每格代表一个显示点。
比如HT1621,有4个COM,32个SEG,组成一个32行,每行装4个点的表格,一共有128个点,也就是最多可以显示128个点,用数码管的思路,最多可以显示128个LED灯。
因为纵向上有32行,因此Y轴的地址范围是0到31。
411ht1621液晶显示(lcd)驱动集成电路
4.11 HT1621液晶显示(LCD)驱动集成电路液晶显示(LCD)在家用电器中已经得到大量的应用,在一般情况下液晶显示采用 由于电冰箱和空调等产品的显示电路板和主控制板安装在不同位置, 专用芯片进行驱动,两者之间通过导线连接,所以较多采用串行数据传输的液晶显示液晶显示驱动集成电路进行显示控制及驱动,较为常见的是 HOLTEK 公司生产的 LCD控制驱动系列芯片。
以下以HT1621为例进行介绍。
HT1621为128(32×4)段、存储器映射的多功能LCD驱动器。
它可设置为1/2或 1/3 偏置且通过 S/W 配置设置为 2、3或 4 个公共端的LCD 驱动。
这使得 HT1621 适于 多种 LCD 应用。
它与主控制器之间只需要 3 根或 4 根线接口,LCD 驱动时钟从系统时 钟内产生,一般为256kHz。
4.11.1 HT1621的主要参数① 工作电压:2.4~5.2V② 内置256kHz RC 振荡器 /或外部32.768kHz 晶体/或 256kHz频率输入③ 可选择1/2 或 1/3 偏压比和1/2 或 1/3 或 1/4 占空比LCD应用④ 内部时钟源⑤ 2个可选蜂鸣器输出频率 (2kHz/4kHz)⑥ Power down 命令降低功耗⑦ 内置时基发生器和WDT⑧ 时基 或 WDT 溢出输出⑨ 8 种时基或/WDT 时钟源⑩ 32×4 LCD 驱动⑪ 内置 32×4 位显示RAM⑫ 3线接口⑬ 内部LCD 驱动频率源⑭ 软件构造特性⑮ 数据模式和命令模式指令⑯ R/W 地址自动增加⑰ 三种数据访问模式4.11.2 HT1621封装及管脚定义图4.50所示分别为48脚及28脚封装的管脚布置, 其中48脚封装的HT1621B为全 功能芯片,28 脚封装的 HT1621D 为简化版本以适应不同的应用场合,主要区别在于驱 动LCD段数由128(32×4)段简化为48(16×3)段,取消了外部时钟晶振功能(采用 内置256kHz RC 振荡器),对于一般的家电产品,HT1621D已经能够满足要求。
用HT1621驱动LCD的方法
ApplicationNoteTM58XX_16S PRODUCT NAMETM58XXTITLETM58XX 用HT1621驱动LCD的方法APPLICATION NOTE1. 说明2. 程序3. LCD Layout4. 应用线路图1. 对HT1621初始化:主要是对HT1621使用频率、音频选择、是否打开蜂鸣器等进行选择先使能片选位(CS\=0),ID为4即格式命令为100然后送相应的命令字,送完后将CS\脚置1,即不对HT1621操作时CSP为1。
2. 清屏:HT1621内部有32*4位的RAM单元,也可以说是输出缓冲区,将其清0,即LCD不显示。
3. 输出:Demo板使用的LCD为五个显示位,本程序实现后两位固定输出dE,前三位输出000-->111...-->FFF后动态停机输出数据时先置片选位有效(CS\=0)――>然后送ID为5(101)即命令格式为写操作――>接着将欲显段地址送1621――>将要显的数据送1621输出――>最后关闭片选位即CS\脚置1。
其它说明:(1)对1621写操作问题:对1621操作时先置片选位有效(CSP=0),不对1621操作时置片选位无效(CSP=1)。
(2)注意地址、数据或命令的长度问题。
2 tenx technology, inc.;---------------------------;Title: Write HT1621;Function:;Note: The voltage applied to Vlcd pin must be lower than Vdd.;Clock: 4m;Config word: xt_osc & _wdt_off & _cpt_on & _type_general & _lv_don't use;Data: 2004_5_9; list p=tm58p20;---------------------------00hindf equ01htmr0 equ02hpc equstatus equ 03hfsr equ04h05hporta equportb equ 06hcsp equ 4wrp equ 5dtp equ 607hportc equwakeup equ 20hirqm equ 21hirqf equ 22h;---------------------------;status bits definec equ 00hdc equ 01hz equ 02hpd equ 03hto equ 04hpa0 equ 05hpa1 equ 06hpa2 equ 07h;---------------------------;option bits define00hps0 equps1 equ 01hps2 equ 02hpsa equ 03hrte equ 04hrts equ 05h;---------------------------cnt equ 08hid equ 09htemp equ 0ahcmd equ 0bh3 tenx technology, inc.temp1 equ 0chaddr equ 0dhdat equ 0ehtemper equ 0fhorg 7ffhlgoto mainorg 00hnop;---------------------------lcd_tablehaddam pc,1retla b'00000101' ;0retla b'00000000' ;1retla b'00000110' ;2retla b'00000010' ;3retla b'00000011' ;4retla b'00000011' ;5retla b'00000111' ;6retla b'00000000' ;7retla b'00000111' ;8retla b'00000011' ;9retla b'00000111' ;aretla b'00000111' ;bretla b'00000110' ;cretla b'00000110' ;dretla b'00000111' ;eretla b'00000111' ;fretla b'00000111' ;flcd_tableladdam pc,1retla b'00001111' ;0retla b'00000110' ;1retla b'00001011' ;2retla b'00001111' ;3retla b'00000110' ;4retla b'00001101' ;5retla b'00001101' ;6retla b'00000111' ;7retla b'00001111' ;8retla b'00001111' ;9retla b'00000111' ;aretla b'00001100' ;bretla b'00001000' ;cretla b'00001110' ;dretla b'00001001' ;eretla b'00000001' ;f4 tenx technology, inc.retla b'00000001' ;f;---------------------------dispwriteid_:movla 3movam cntbcm status,crlm id,mrlm id,mrlm id,mrlm id,mrlm id,mmovm id,amovam templcall dispwritebits_ret;---------------------------dispwritecmd_:movla 8movam cntmovm cmd,amovam templcall dispwritebits_ret;---------------------------dispwritebits_:rlm temp,mbtmsc status,clgoto highslow:bcm portb,dtp ;写数据'0'bcm portb,wrpnopnopnopnopnopnopbsm portb,wrpnopnopnopnopnopnopnoplgoto loop1highs:bsm portb,dtp ;写数据'1'5 tenx technology, inc.bcm portb,wrpnopnopnopnopnopnopbsm portb,wrpnopnopnopnopnopnoploop1:decmsz cnt,mlgoto dispwritebits_ret;---------------------------dispwritebit_:movla 1movam cntmovla 80hmovam templcall dispwritebits_ret;---------------------------writeto46addr_:movla 7movam cntbcm status,crlm addr,mmovm addr,amovam templcall dispwritebits_retdispwriteaddr_:movla 6movam cntbcm status,crlm addr,mrlm addr,mmovm addr,amovam templcall dispwritebits_ret;---------------------------dispwritedata_:6 tenx technology, inc.movla 4movam cntmovm dat,amovam templcall dispwritebits1_ret;---------------------------;input: temp,cnt;func:only for write dat low nibble;-------------dispwritebits1_:loop00:rrm temp,mbtmsc status,clgoto high11low00:bcm portb,dtpbcm portb,wrpnopnopnopnopnopnopnopbsm portb,wrpnopnopnopnopnopnopnoplgoto loop10high11:bsm portb,dtpbcm portb,wrpnopnopnopnopnopnopnopbsm portb,wrpnopnopnopnop7 tenx technology, inc.nopnopnopnoploop10:decmsz cnt,mlgoto loop00ret;---------------------------initdisp_:;turn on lcd display id:100bcm portb,csp ;使能ht1621movla 4movam idlcall dispwriteid_movla 3movam cmd ;turn on lcd bias gereratorlcall dispwritecmd_lcall dispwritebit_movla b'00011000' ;rc 256kmovam cmdlcall dispwritecmd_lcall dispwritebit_movla b'00101001' ;select bias ,dutymovam cmd ;1/4duty,1/3biaslcall dispwritecmd_lcall dispwritebit_movla b'11100011' ;normal modemovam cmdlcall dispwritecmd_lcall dispwritebit_movla 1 ;turn sys osc onmovam cmdlcall dispwritecmd_lcall dispwritebit_movla b'01100000' ;set buzzer 2khzmovam cmdlcall dispwritecmd_lcall dispwritebit_movla b'00001000' ;close buzzermovam cmdlcall dispwritecmd_8 tenx technology, inc.lcall dispwritebit_movla b'00000101' ;close watch dogmovam cmdlcall dispwritecmd_lcall dispwritebit_bsm portb,csp ;不对HT1621操作时CSP为1nopret;---------------------------clearall_:movla d'24' ;清除地址08h后的24个单元movam temp1 ;08h前的单元因为本程序未用,可以不理会bcm portb,cspmovla d'5'movam idlcall dispwriteid_ ;3位idmovla d'8'movam addrlcall dispwriteaddr_;6位地址bbb:clrm datlcall dispwritedata_ ;8位数据decmsz temp1,1lgoto bbbbsm portb,cspnopnopret;---------------------------;seg10 seg9 显示第1位数据;seg8 seg13 显示第2位数据;seg17 seg21 显示第3位数据;seg25 seg29 显示第4位数据;seg31 seg30 显示第5位数据;前三位数据显示从000-->111-->...FFF;后两位数据为固定显示dEoutputseg10:movla d'5' ;D'5'为101即为写命令movam idbcm portb,csp ;片选位有效lcall dispwriteid_movla d'10'movam addr ;将欲显段地址送HT1621lcall dispwriteaddr_9 tenx technology, inc.movm temp1,alcall lcd_tableh ;将欲显数据高半位送HT1621movam dat ;因为HT1621的RAM为四位长lcall dispwritedata_ ;所以分两次送bsm p ortb,cspnopnopseg9:movla d'5'movam idbcm portb,csplcall dispwriteid_movla d'9'movam addrlcall dispwriteaddr_movm temp1,alcall lcd_tablel ;将欲显数据低半位送HT1621movam datlcall dispwritedata_bsm portb,cspnopnopseg8:movla d'5' ;以下显示位处理方法同上movam idbcm portb,csplcall dispwriteid_movla d'8'movam addrlcall dispwriteaddr_movm temp1,alcall lcd_tablehmovam datlcall dispwritedata_bsm portb,cspnopnopseg13:movla d'5'movam idbcm portb,csplcall dispwriteid_movla d'13'movam addrlcall dispwriteaddr_movm temp1,alcall lcd_tablelmovam dat10 tenx technology, inc.lcall dispwritedata_bsm portb,cspnopnopseg17:movla d'5'movam idbcm portb,csplcall dispwriteid_movla d'17'movam addrlcall dispwriteaddr_movm temp1,alcall lcd_tablehmovam datlcall dispwritedata_bsm portb,cspnopnopseg21:movla '5'movam dbcm ortb,csplcall dispwriteid_movla '21'movam ddrlcall dispwriteaddr_movm emp1,alcall cd_tablelmovam atlcall dispwritedata_bsm ortb,cspnopnopseg25:movla '5'movam dbcm ortb,csplcall dispwriteid_movla '25'movam ddrlcall dispwriteaddr_movla dhlcall cd_tablehmovam atlcall dispwritedata_bsm ortb,cspnop11 tenx technology, inc.nopseg29:movla '5'movam dbcm ortb,csplcall dispwriteid_movla '29'movam ddrlcall dispwriteaddr_movla dhlcall cd_tablelmovam atlcall dispwritedata_bsm ortb,cspnopnopseg31:movla '5'movam dbcm ortb,csplcall dispwriteid_movla '31'movam ddrlcall dispwriteaddr_movla ehlcall cd_tablehmovam atlcall dispwritedata_bsm ortb,cspnopnopseg30:movla '5'movam dbcm ortb,csplcall dispwriteid_movla '30'movam ddrlcall dispwriteaddr_movla ehlcall cd_tablelmovam atlcall dispwritedata_bsm ortb,cspbcm ortb,wrpbcm ortb,dtpret;---------------------------12 tenx technology, inc.main:clrm orta ;I/O口初始化movla 0hiodir rtaclrm ortbmovla 0hiodir ortbclrm ortcmovla 0hiodir ortcclrm mr0movla 7hselectstart:lcall initdisp_ ;初始化1621lcall clearall_ ;清屏clrm temp1lp0lcall output ;输出000-->111...-->fff后动态停机incm temp1, 1movla 10hsubam temp1, 0btmss status, cgoto lp0aaa:lgoto aaa;---------------------------end;---------------------------13 tenx technology, inc.14 tenx technology, inc.LCD LayoutSEG9SEG8SEG7SEG6SEG5SEG4SEG3SEG2SEG1SEG0COM0COM1COM2COM3应用线路图15 tenx technology, inc.。
HT1621液晶驱动程序
#defineuchar unsigned char#defineuint unsigned int#defineulong unsigned longsbit HT1621_DATA =P1^2; /* HT1621串行数据输入/输出*/ sbit HT1621_WRITE =P1^3; /* HT1621WRITE脉冲输入*/ sbit HT1621_READ =P1^4; /* HT1621READ脉冲输入*/ sbit HT1621_CS =P1^5; /* HTML621片/*HT1621命令声明*/#define BIAS 0X52 /* 1/3偏压,4背极*/#define RC256K 0X30 /* 系统时钟选择为片内RC振荡器*/#define WDTDIS 0X0A /* 禁止WDT溢出标志输出*/#define TIMERDIS 0X08 /* 时基输出禁止*/#define SYSEN 0X02 /* 打开系统时钟*/#define SYSDIS 0X00 /* 关闭系统时钟和偏压发生器*/#define LCDON 0X06 /* 打开LCD偏压发生器*/ #define LCDOFF 0X04 /* 关闭LCD偏压发生器*/#define TONEON 0X12 /* 打开音频输出*/ #define TONEOFF 0X10 /* 关闭音频输出*/uchar code cDisplayCode[]={0xfa,0x60,0xd6,0xf4,0x6c,0xbc,0xbe,0xe0,0xfe,0xfc,0x00,0x04}; uchar cDisplayBuffer[20];void Init_1621();void WriteBit_1621(uchar cData,uchar cCount);void WriteAll_1621(uchar cAddress,uchar *p,uchar cCount); void WriteCommand_1621(uchar cCommand);void Clear_1621(uchar cStart,uchar cEnd);void Set_1621(uchar cStart,uchar cEnd);void IntSet_1621(uchar cStart,uchar cEnd);void Delay200ms();/* 清0 1621 */void Clear_1621(uchar cStart,uchar cEnd){uchar i;for(i=cStart; i<=cEnd; i++){cDisplayBuffer[i] = 0x00;}}/* 置1 1621 */void Set_1621(uchar cStart,uchar cEnd) {uchar i;for(i=cStart; i<=cEnd; i++){cDisplayBuffer[i] = 0xff;}}/* 显示‘8’*/void IntSet_1621(uchar cStart,uchar cEnd) {uchar i;for(i=cStart; i<=cEnd; i++){cDisplayBuffer[i] = 0xfe;}}/* HT1621的初始化*/void Init_1621(){Delay200ms(); /* 延时使LCD工作电压稳定*/WriteCommand_1621(BIAS); /* 1/3偏压,4背极*/WriteCommand_1621(RC256K); /* 使用内部振荡器*/WriteCommand_1621(SYSDIS); /* 关闭系统振荡器和LCD偏压发生器*/WriteCommand_1621(WDTDIS); /* WTD溢出标志输出失效*/ WriteCommand_1621(SYSEN); /* 打开系统振荡器*/WriteCommand_1621(LCDON); /* 打开LCD偏压发生器*/Clear_1621(0,15);WriteAll_1621(0,cDisplayBuffer,16);/* 清除HT1621寄存器数据,清屏,方便后面的程序写入1 */}/* 向HT1621写cCount位数据*/void WriteBit_1621(uchar cData,uchar cCount){uchar i;for(i =0; i <cCount; i ++){if((cData&0x80)==0)HT1621_DATA=0;elseHT1621_DATA=1;HT1621_WRITE=0;Delay4us();HT1621_WRITE=1;cData=cData<<1;}}/* 向HT1621中连续写入数据每次8位*/void WriteAll_1621(uchar cAddress,uchar *p,uchar cCount) {uchar i;HT1621_CS=0;_nop_();_nop_();WriteBit_1621(0xa0,3);WriteBit_1621(cAddress<<2,6);for(i =0; i <cCount; i++,p++){WriteBit_1621(*p,8);}HT1621_CS=1;}/*向HT1621写入命令字节*/void WriteCommand_1621(uchar cCommand) {HT1621_CS=0;_nop_();_nop_();WriteBit_1621(0x80,4);WriteBit_1621(cCommand,8);HT1621_CS=1;}/* 检测液晶数码管*/void CheckDisplay(){Set_1621(0,15);WriteAll_1621(0,cDisplayBuffer,16);Delay200ms( );Clear_1621(0,15);WriteAll_1621(0,cDisplayBuffer,16);Delay200ms();}/* 延时*/void Delay200ms(){uchar i, j, k;_nop_();_nop_();i = 9;j = 104;k = 139;do{do{while (--k);}while (--j);} while (--i);}。
HT1621硬件接线和软件编程
HT1621硬件原理图及软件编程1、Ht1621的硬件接线是怎样的呢?需要将LCD的SEG(段电极)和COM(公共电极)与HT1621的SEG与COM 对应相连。
在就是HT1621会有几个接口是与单片机的I/0口相连像/CS(片选)/WR(写操作) / RD(读操作)(一般不用)/DATA(数据) 通过软件程序对I/O的控制进而控制HT1621的读写操作。
通过送数的不同达到想要的效果。
2、软件上是怎样控制点亮或者熄灭的呢?想显示那些就把相应的段在程序里赋 1 如果想全显示就全赋 1 想都不显就都赋0。
3、HT1621B驱动4位8段LCD,用单片机怎样控制?其中的D0~D3,A0~A5各表示什么意思?1621B最多带32SEGx4COM,128段。
显示数据与显示内容是这样对应的:一个8位二进制数对应2根SEG线上的8个段码,1为显示,0不显。
例如seg0上的内容是ABCD四个段码,SEG1上的内容是EFGH四个段码,背电极COM 上,C0连AE2个段码,C1连BF,C2连CG,C3连DH,按此显示逻辑输入“01100011”时,高4位对应SEG1,低4位对应SEG0,将同时显示FGAB四个段码。
输入的显示数据不重新输入的话会一直显示,要同时显示2位数字和段码只要将这些数字和段码在逻辑表上对应的数据置1即可同时显示。
D0-D3是显示数据,1显示0不显示,A0-A5是芯片内置的RAM地址。
看上图1621的显示RAM对应表,你的显示模块资料上必定有这个逻辑表(实在没有你只能逐个地址逐个段码点亮,自己填上),你给一个地址送4位数据,对应的是一个SEG上的4个段(编程上一般送8位对应2根SEG8个段,因为RAM 地址会自动加1,你可以连续输入数据,我原来说的8位只是方便编程,你4位8位甚至一次输完整个RAM表数据都行),IC工作的时候它是将它内部的这个RAM表读出来,将“1”的数据对应的段码显示出来,明白了这个对应关系应该就清楚了,要液晶变换显示内容只需要改写这个RAM表。
采用PIC单片机HT1621液晶显示控制器原理
采用PIC单片机HT1621液晶显示控制器原理HT1621 液晶显示控制器是多功能全自动智能开关的显示部件,能实时、准确、在线监控供电线路的运行情况。
一旦线路出现漏电、过载、短路、过压、欠压和缺相时,智能安全用电开关能立刻启动保护程序,并显示在HT1621 液晶显示控制器上。
在智能化楼宇、中高档家庭住宅、电力系统、工矿企业、国家重点消防单位以及石油化工、文教卫生、金融、电信等领域。
基于单片机的HT1621 液晶显示控制器应用广泛,其原理框图如图1 所示。
美国MICROCHIP 公司的PIC 系列单片机主要有以下特点:(1)哈佛总线结构;(2)指令单字节化;(3)精简指令集;(4)寻址方式简单;(5)代码压缩率高;(6)运行速度高;(7)功耗低;(8)驱动能力强,达到20 mA 的电流驱动能力;(9) 自带硬件看门狗;(10)外接电路简单;(11)开发方便;这些特点使得PIC 系列单片机在工业控制、消费电子产品、办公自动化设备、智能仪器仪表、汽车电子等不同的领域得到了广泛的应用。
PIC16F877A 特点PIC16F877A 单片机为双列直插式40 引脚处理器,所有接口引脚除具有基本输入/输出功能外,一般都设计有第2 功能,甚至第3 功能。
它采用引脚复用技术,以便使增加功能而又不增大体积和引脚数量。
PIC16F877A 单片机除了具有PIC 系列单片机的共同特点外,还具有8K 乘以14 位的Flash 程序存储器,512 B 数据存储器,256 乘以8 位EEP-ROM,33 条I/O 口线,8 路10 位A/D 通道等。
可见,PIC16F877A 非常适用于HT1621 液晶显示控制。
HT1621 液晶驱动器概述。
STM32液晶显示HT1621驱动原理及程序代码
STM32液晶显⽰HT1621驱动原理及程序代码1、HT1621电路分析HT1621为32×4即128点内存映像LCD驱动器,包含内嵌的32×4位显⽰RAM内存和时基发⽣器以及WDT看门狗定时器.HT1621驱动电路如下图所⽰:与单⽚机相连接控制的有9脚CS,3脚WR,12脚DATA,其功能描述如下表。
2、字符显⽰原理液晶管点亮和熄灭原理分别为在对应的RAM地址中写1和写0.⾸先需要清楚所驱动控制的液晶的COM-SEG对应关系,然后需要了解HT1621的32×4RAM地址映射。
例如要控制的液晶的装脚成品图部分如下:着重看⼀个液晶数码管,我们了解原理就⾏。
可以看到图3中是第2个液晶数码管,有7段,分别为A,B,C,D,E,F,G。
也就分别为下⾯COM\SEG地址对应关系图中的2A,2B,2C,2D,2E,2F,2G。
液晶的显⽰字符的部分COM公共端输出⼝和SEG段输出⼝的分布如下表所⽰,同理我们可以看到例如:2D对应(SEG5,COM0),2E对应(SEG5,COM1),2F对应(SEG5,COM2),2A对应(SEG5,COM3),2C对应(SEG4,COM1),2G对应(SEG4,COM2),2B对应(SEG4,COM3)。
搞清楚我们要控制的对象之后那, HT1621的RAM 地址映射如下图所⽰:可以清楚的看到要控制液晶段对应SEG号作为6位地址,COM号对应作为4位数据写⼊,此时注意4位数据的⾼低位。
写数据到RAM命令格式为:101+6位RAM地址+4位数据,其中RAM地址为SEG序号.例如我们在图3的第⼆个液晶数码管上显⽰数字,⾸先我们根据图3得到地址映射关系,先写⼊地址SEG4中的四位数据(COM3,COM2,COM1,COM0),再写如地址SEG5中的四位数据(COM3,COM2,COM1,COM0),对应关系如下:。
HT1621液晶显示驱动详细原理及程序
Ht1621液晶显示详细驱动使用说明以及程序1.概述HT1621是128点内存映象和多功能的LCD驱动器,HT1621的软件配置特性使它适用于多种LCD应用场合,包括LCD模块和显示子系统。
用于连接主控制器和HT1621的管脚只有4或5条,HT1621还有一个节电命令用于降低系统功耗。
在虎风所做的这个系统中ht1621用于驱动一个静态的LCD液晶显示器。
液晶显示的方式分为静态显示和动态显示。
静态与动态的区别在于静态显示是持续供电的,而动态显示是利用人的视觉停留效果,快速扫描数码管各个段,让人在视觉上感觉到数码管是同时显示的。
2.HT1621接线原理图3.静态LCD结构图4.几个曾经纠结的概念Time base:时基,即时间基准,可以用来输出,作为外部时钟的时间基准。
占空比:将所有公共电极(COM)各施加一次扫描电压的时间叫一帧,单位时间内扫描多少帧的频率叫帧频,将扫描公共电极(COM)选通的时间与帧周期之比叫占空比。
通常占空比等于公共电极数N的倒数,即1/N。
这就是说假如你要驱动4个液晶,就需要4个COM,那么你的占空比就要设定为1/4。
偏压比:指的是液晶的偏压系数,可以看看专业技术文章,偏压目的是克服交叉效应,通过把半选择点与非选择点的电压平均,适度提高非选择点的电压来抵消半选择点上的一部分电压,使半选择点上的电压下降,从而提高显示对比度;最终行半选择点和非选择点上的电压均为显示电压的1/a,1/a就称为偏压系数,也称为偏压。
此方法称为1/a偏压的平均电压法,简称为1/a偏压法。
VLCD(LCD驱动电压): LCD的驱动电压为加在点亮部分的段电压与公共电压之差(峰-峰值)。
5.关于RAM地址映射的概念为了这个问题困扰了很久,虎风太愚钝啦……Ht1621有一个32*4的LCD驱动,映射到32*4的RAM地址。
上图中写命令101后面跟6位RAM地址,那么这个地址是如何确定的呢?其实说白了也很简单,RAM地址就是SEG的序号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Ht1621液晶显示详细驱动使用说明以及程序1.概述HT1621是128点内存映象和多功能的LCD驱动器,HT1621的软件配置特性使它适用于多种LCD应用场合,包括LCD模块和显示子系统。
用于连接主控制器和HT1621的管脚只有4或5条,HT1621还有一个节电命令用于降低系统功耗。
在虎风所做的这个系统中ht1621用于驱动一个静态的LCD液晶显示器。
液晶显示的方式分为静态显示和动态显示。
静态与动态的区别在于静态显示是持续供电的,而动态显示是利用人的视觉停留效果,快速扫描数码管各个段,让人在视觉上感觉到数码管是同时显示的。
2.HT1621接线原理图3.静态LCD结构图4.几个曾经纠结的概念Time base:时基,即时间基准,可以用来输出,作为外部时钟的时间基准。
占空比:将所有公共电极(COM)各施加一次扫描电压的时间叫一帧,单位时间内扫描多少帧的频率叫帧频,将扫描公共电极(COM)选通的时间与帧周期之比叫占空比。
通常占空比等于公共电极数N的倒数,即1/N。
这就是说假如你要驱动4个液晶,就需要4个COM,那么你的占空比就要设定为1/4。
偏压比:指的是液晶的偏压系数,可以看看专业技术文章,偏压目的是克服交叉效应,通过把半选择点与非选择点的电压平均,适度提高非选择点的电压来抵消半选择点上的一部分电压,使半选择点上的电压下降,从而提高显示对比度;最终行半选择点和非选择点上的电压均为显示电压的1/a,1/a就称为偏压系数,也称为偏压。
此方法称为1/a偏压的平均电压法,简称为1/a偏压法。
VLCD(LCD驱动电压): LCD的驱动电压为加在点亮部分的段电压与公共电压之差(峰-峰值)。
5.关于RAM地址映射的概念为了这个问题困扰了很久,虎风太愚钝啦……Ht1621有一个32*4的LCD驱动,映射到32*4的RAM地址。
上图中写命令101后面跟6位RAM地址,那么这个地址是如何确定的呢?其实说白了也很简单,RAM地址就是SEG的序号。
我们要点亮一段液晶管需要给他提供一个电平,而这个电平是由SEG管脚提供的,SEG管脚电平的输出又取决于对应RAM地址中的值。
驱动一个8段数码管的顺序是A,B,C,D,E,F,G,DP,我们认为前面LCD结构图中的数码管3为我们要显示的低位,那么连接原理图中A3的是SEG12,我们就说此时的RAM地址为0b001100,连接B3的是SEG11,对应的RAM地址为0b001011,依次类推,第一个数码管的所有地址为:0b001100,0b001011,0b001010,0b001001,0b001000,0b001101,0b001110,0b000111//DP2;其余地址类似,在此不再解释。
6.程序Unsigned char LCD_ADD[]={0b00001100,0b00110100,0b00010100,0b00100100,0b00000100,0b0 0101100,0b00011100,0b00111000,0b00000010,0b00111100,0b00011000,0b0010 1000,0b00001000,0b00100010,0b00010010,0b00110000,0b00001010,0b0011001 0,0b00010000,0b00100000,0b00000000,0b00101010,0b00011010};void HT1621_Dis_Char(unsigned char d,unsigned char d_loca){unsigned char j;unsigned char seg_cnt=8 ;if (d_loca==(HT1621_DATA_NUM-1))seg_cnt=7;//送3位模式码101及6位首地址000000 0b000000101for (j=0; j<seg_cnt; j++) //送cache_size组数据{ HT1621_PORT&=~_BV(HT1621_CS);HT1621_Send_Bits(0x05,3); //送写命令代码101,高到低HT1621_Send_Bits(LCD_ADD[d_loca*8+j],6); //送每段对应的地址HT1621_Send_Bits(d&0x01,4); //送数据,com0对应的低位,低到高d=d>>1;//右移位HT1621_PORT|=_BV(HT1621_CS);}}/*=========显示小数点=========输入参数:Poi_loca,为小数点的位置(0是第一位,1是第二位) */void HT1621_Pri_Point(unsigned char Poi_loca){unsigned char seg_cnt=8;if (Poi_loca<2){ HT1621_PORT&=~_BV(HT1621_CS);HT1621_Send_Bits(0x05,3); //送写命令代码101HT1621_Send_Bits(LCD_ADD[Poi_loca*seg_cnt+7],6); //送点对应的地址//送数据HT1621_Send_Bits(1,4);HT1621_PORT|=_BV(HT1621_CS);}}/********************************************************=======显示INT型数据dat--待显示数据********************************************************/void HT1621_Print_onlyInt(unsigned long dat){unsigned char i;unsigned char data[HT1621_DATA_NUM];if (dat>=HT1621_DATA_max)dat=dat%HT1621_DATA_max;for(i=0;i<HT1621_DATA_NUM;i++)data[i]=LCD_CODE[HT1621_NoPrint_Loc];//初始化为不显示if(dat<10) data[0] = LCD_CODE[(unsigned char) (dat)]; //个位数else if(dat<100) {data[1] =LCD_CODE[(unsigned char) (dat/10)];data[0] =LCD_CODE[(unsigned char) (dat%10)] ;}//十位数else {data[2] =LCD_CODE[(unsigned char) (dat/100%10)];data[1] =LCD_CODE[(unsigned char) (dat/10%10)] ;data[0] =LCD_CODE[(unsigned char) (dat%10)];} //百位数for(i=0;i<HT1621_DATA_NUM;i++)//从低位到高位,调用显示每个数的函数HT1621_Dis_CharHT1621_Dis_Char(data[i],i);}/*********************************************************///打印INT型数据//dat--待显示数据//chk--显示的数据位数: 0--关闭 1~3时,显示对应的数据;大于3时只显示3位;(从左到右)//point_loc--显示的小数点的位置:0以及大于2时:不显示小数点;1-显示第1个,2-显示第2个;(从左到右)/*********************************************************/void HT1621_Print_Int(unsigned long dat,unsigned char chk,unsigned char point_loc){unsigned char i;unsigned char data[HT1621_DATA_NUM];//chk为0,则屏幕不显示for(i=0;i<HT1621_DATA_NUM;i++) data[i]= LCD_CODE[HT1621_NoPrint_Loc];if(chk>0) {data[0] = LCD_CODE[(unsigned char) (dat%10)];dat=dat/10; }if(chk>1) {data[1] = LCD_CODE[(unsigned char) (dat%10)];dat=dat/10; }if(chk>2) {data[2] = LCD_CODE[(unsigned char) (dat%10)];}//显示小数点if (point_loc==1)data[0]|=0x80;else if (point_loc==2)data[1]|=0x80;//从低位到高位,调用显示每个数的函数HT1621_Dis_Charfor(i=0;i<HT1621_DATA_NUM;i++)HT1621_Dis_Char(data[i],i);}/*********************************************************/ //送d_count位数据d;从低位开始送/*********************************************************/ void HT1621_Send_Bits(unsigned char d, unsigned char d_count) {unsigned char j;for (j=0; j<d_count; ++j){HT1621_PORT&=~_BV(HT1621_WR); //wr置低;HT1621_Delay(50);if (d & 0x01==1) //置数据位;{ HT1621_PORT|=_BV(HT1621_DATA); //data置0}else{ HT1621_PORT&=~_BV(HT1621_DATA); //data置1}HT1621_PORT|=_BV(HT1621_WR); //wr置高;HT1621_Delay(50);d =(d>>1); //右移位}}/*********************************************************///HT1621初始化/*********************************************************/void HT1621_Init(){DDRC |= _BV(4)|_BV(5)|_BV(7); //定义端口PC4-PC5-PC7输出HT1621_PORT&=~_BV(HT1621_CS); //CS端清零HT1621_Send_Bits(0x01,3); //送3位命令模式码100 0x80=0b10000000HT1621_Send_Bits(0x18,9); //系统时钟选用片内RCHT1621_Send_Bits(0x80,9); //打开系统振荡器HT1621_Send_Bits(0x94,9); //1/2偏置,2个公共口 1000 0100HT1621_Send_Bits(0xc0,9); //打开LCD偏置发生器HT1621_PORT|=_BV(HT1621_CS); //CS端置1HT1621_NoPrint( ); //液晶不显示}7.结束HT1621作为液晶驱动芯片,功能十分灵活,而液晶在我们的学习项目中会经常用到,所以学好它的操作是十分必要的。