熱門關(guān)鍵詞: 蘇州控制板生產(chǎn)廠家 液晶模塊種類 LCD液晶屏工作原理 什么是LED背光源
(1) 段碼屏的驅(qū)動程序跟數(shù)碼管的靜態(tài)驅(qū)動程序一樣,只要我們弄懂了怎樣顯示一個基本單位,根據(jù)此基本單位編寫一個字庫表,然后 用與(&)和或(|)這兩種位運算符就可以隨心所欲編寫我們要顯示的數(shù)字或者形狀。有兩種常用的驅(qū)動方案:
第一種:如果單片機內(nèi)部集成了seg和com引腳的液晶驅(qū)動模塊,直接用單片機驅(qū)動。
第二種:單片機用3個IO口跟HT1621進行通訊,用 HT1621驅(qū)動段碼屏。
這節(jié)我重點介紹第二種。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個點,用數(shù)碼管的思路,最多可以顯示128個LED燈。因為縱向上有32行,因此Y軸的地址范圍是0到31。每一行X軸上的4個點,我們用一個字節(jié)來表示。一個字節(jié)有8位,高4位分別代表這個4個點,低4位為空。比如第一行(SEG0行)的第1個(COM3)要顯示,第2個(COM2)要顯示,第3個(COM1)不要顯示,第4個(COM0)不要顯示,那么用一個字節(jié)來表示就是十六進制的0xc0.要把這兩個點點亮,只要把X軸的數(shù)據(jù)設置成0xc0,Y軸的數(shù)據(jù)設置成0x00,然后放到鴻哥精心研制的seg_display(unsigned char col, unsigned char pag)驅(qū)動程序里就可以了.
(2)功能需求:
在COM和SEG組成的4X32表格中,顯示第二行的第3和第4兩個點。
(3) 硬件原理:
用單片機的3個IO口分別跟HT1621的CS,WR,DATA連接。
(4)源碼適合的單片機:STC11F04E,晶振為11.0592MHz。
(5)源代碼講解如下:
#include "REG52.H"
#include "absacc.h"
#include "intrins.h"
#include "stdio.h"
#define BIAS 0X52 //此處千萬小心,在上個月的一個項目中就是在這里被卡了7天。
//必須跟硬件電路的COM匹配。1個或者2個COM:0x42。3個COM:0x4A。4個COM:0x52
#define RC256 0X30
#define SYSTEN 0X02
#define SYSDIS 0X00
#define LCDON 0X06
void SendBitToHT1621(unsigned char nbit,unsigned char n);//發(fā)送一個字節(jié)中的N位到HT1621里,驅(qū)動程序的最底層部分
void write_com(unsigned char cmdcode); //寫命令到LCD
void init_lcd(); //--初始化LCD屏
void seg_display(unsigned char col, unsigned char pag); //顯示基本單位點
void screen_clear (); //清空屏幕的內(nèi)容
//補充說明:程序風格是這樣的,凡是輸出IO后綴都是_dr,凡是輸入的//IO后綴都//是_sr
sbit ht162x_data_dr=P3^1;
sbit ht162x_cs_dr=P3^6;
sbit ht162x_wr_dr=P3^0;
main()
{
init_lcd(); //初始化液晶屏
screen_clear ();//清空整屏顯示內(nèi)容
seg_display(0x30,1); //在COM和SEG組成的4X32表格中,顯示第二行的第3和第4兩個點。
while(1)
{
;
}
}
//發(fā)送一個字節(jié)中的N位到HT1621里,驅(qū)動程序的最底層部分
void SendBitToHT1621(unsigned char nbit,unsigned char n)
{
unsigned char i;
for(i=0;i
{
ht162x_wr_dr=0;
if(nbit>=0x80) //判斷最高位
ht162x_data_dr=1;
else
ht162x_data_dr=0;
_nop_();
_nop_();
_nop_();
ht162x_wr_dr=1;
_nop_();
_nop_();
_nop_();
nbit<<=1;
}
}
//------------------寫命令到LCD,,驅(qū)動液晶程序的一部分------------------------------
void write_com(unsigned char cmdcode)
{
ht162x_cs_dr=0; //選通HT1621
_nop_();
_nop_();
SendBitToHT1621(0x80,4);
SendBitToHT1621(cmdcode,8);
_nop_();
_nop_();
ht162x_cs_dr=1;
_nop_();
_nop_();
_nop_();
}
//*------------------初始化LCD屏--------------------------*/
void init_lcd()
{
write_com(SYSTEN); //Turn on system oscillator
write_com(RC256); //啟動內(nèi)部256KRC 振蕩器
write_com(BIAS); // 1/3 bais . 4 duty
write_com(LCDON); //開啟LCD
}
//顯示基本單位點,本節(jié)的核心內(nèi)容。col代表X軸,X軸的數(shù)據(jù)用位來表示,一個字節(jié)中的高4位來表示。pag代表Y軸
void seg_display(unsigned char col, unsigned char pag)
{
pag<<=2;
ht162x_cs_dr=0; //選通HT1621
_nop_();
_nop_();
SendBitToHT1621(0xA0,3); //發(fā)送寫數(shù)據(jù)模式101
SendBitToHT1621(pag,6); //發(fā)送Y軸數(shù)據(jù)
SendBitToHT1621(col,4); //發(fā)送X軸數(shù)據(jù)
ht162x_cs_dr=1;
_nop_();
_nop_();
}
//*------------------清空屏幕的內(nèi)容---------------*/
void screen_clear ()
{
unsigned char i;
unsigned char y=0;
for(i=0;i<32;i++)
{
seg_display(0x00,y);
y=y+1;
}
}
(6)小結(jié):
因為段碼屏是需要定制的,每種屏的邏輯表都不一樣,因此我在這里只列出最核心的驅(qū)動程序,上層的應用程序大家以后根據(jù)項目自己編寫,只要多利用查表,與(&)和或(|)這兩種位運算符來處理,不難。軟件設置初始化HT1621的配置參數(shù)時,要特別注意實際電路上用了多少個COM,然后設置相等的COM配置,否則,應用在大段碼顯示屏的項目時,有可能因為驅(qū)動力不夠,會顯示亂碼。
咨詢熱線
13862038982