熱門關鍵詞: 蘇州控制板生產廠家 液晶模塊種類 LCD液晶屏工作原理 什么是LED背光源
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,0b00101100,0b00011100,0b00111000,0b00000010,
0b00111100,0b00011000,0b00101000,0b00001000,0b00100010,0b00010010,0b00110000,0b00001010,0b00110010,
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 0b000000101
for (j=0; j
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); //送寫命令代碼101
HT1621_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
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
}
/*********************************************************/
//打印INT型數據
//dat--待顯示數據
//chk--顯示的數據位數: 0--關閉 1~3時,顯示對應的數據;大于3時只顯示3位;(從左到右)
//point_loc--顯示的小數點的位置:0以及大于2時:不顯示小數點;1-顯示首位,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
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_Char
for(i=0;i
}
/*********************************************************/
//送d_count位數據d;從低位開始送
/*********************************************************/
void HT1621_Send_Bits(unsigned char d, unsigned char d_count)
{
unsigned char j;
for (j=0; 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=0b10000000
HT1621_Send_Bits(0x18,9); //系統時鐘選用片內RC
HT1621_Send_Bits(0x80,9); //打開系統振蕩器
HT1621_Send_Bits(0x94,9);
//1/2偏置,2個公共口 1000 0100
HT1621_Send_Bits(0xc0,9); //打開LCD偏置發生器
HT1621_PORT|=_BV(HT1621_CS); //CS端置1
HT1621_NoPrint( ); //液晶不顯示
}
7. 結束
HT1621作為液晶驅動芯片,功能十分靈活,而液晶在我們的學習項目中會經常用到,所以學好它的操作是十分必要的。
如果你看了這篇文章還不明白,就聯系客服咨詢吧,嘎嘎!
晶拓是蘇州啟普微電子有限公司旗下LCD液晶屏品牌,在儀器、儀表、POS系統、電話、門禁、電腦、通信、電視、智能小家電等領域占有較大的市場份額,公司十年如一日的經營始終秉乘著“以品質求生存,以創新求發展”,誠信為本的經營理念,真誠希望與您共創美好明天。咨詢熱線:13862038982
【責任編輯】: 晶拓液晶
版權所有:http:// www.anthonydavid.net轉載請注明出處,違者本網將依法追究責任。
咨詢熱線
13862038982