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