LCD12864的串口驅(qū)動(asm/c51)
串行數(shù)據(jù)傳送共分三個字節(jié)完成:
第一字節(jié):串口控制—格式 11111ABC
A 為數(shù)據(jù)傳送方向控制:H 表示數(shù)據(jù)從LCD 到MCU,L 表示數(shù)據(jù)從MCU 到LCD
B 為數(shù)據(jù)類型選擇:H 表示數(shù)據(jù)是顯示數(shù)據(jù),L 表示數(shù)據(jù)是控制指令
C 固定為0
第二字節(jié):(并行)8 位數(shù)據(jù)的高4 位—格式 DDDD0000
第三字節(jié):(并行)8 位數(shù)據(jù)的低4 位—格式 0000DDDD
串行接口時序參數(shù):(測試條件:T=25℃ VDD=4.5V)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2. 串口程序
PSB 接低時,串口模式被選擇。在該模式下,只用兩根線(SID 與 SCLK)來完
成數(shù)據(jù)傳輸。當(dāng)同時使用多顆 ST7920 時,CS 線被配合使用,CS 是高有效。
ST7920 的他不時鐘SCLK 有獨立的操作時序,當(dāng)多個連續(xù)的指令需要被送
入時,指令執(zhí)行時間需要被考慮。必須等待上一個指令執(zhí)行完畢才送入下一個指
令,因為 ST7920 內(nèi)部沒有傳送/接收緩沖區(qū)。
一個完整的串行傳輸周期由一下部分組成:
首先送入啟動字節(jié),送入 5 個連續(xù)的“1”用來啟動一個周期,此時傳輸計
數(shù)被重置,并且串行傳輸被同步。緊接的兩個位指定傳輸方向(RW,確定讀還
是寫)和傳輸性質(zhì)(RS,確定是命令寄存器還是數(shù)據(jù)寄存器),最后的第八位是
一個“0”。
送完啟動字節(jié)之后,可以送入指令或是顯示數(shù)據(jù)(或是字型代碼)。指令或
者代碼是以字節(jié)為單位的,每個字節(jié)的內(nèi)容(指令或數(shù)據(jù))在被送入時分為兩個
字節(jié)來處理:高四位放在第一個字節(jié)的高四位,低四位放在第二個字節(jié)的高四位。
無關(guān)位都補(bǔ)“0”。請參照第四章串行通訊時序圖。;//////////////////////////////////////////
;AT89S52串口驅(qū)動LCD12864
;LCD與AT89S52之間的接口:
;CS-P2.4,SID-P2.5,CLK-P2.6
;PSB-P2.1,LRET-P2.3。
;//////////////////////////////////////////
CS EQU P2.4
SID EQU P2.5
CLK EQU P2.6
PSB EQU P2.1
LRET EQU P2.3
COM DA
DAT DA
ADDR DA
ORG 0000H
SJMP START
ORG 0030H
;主程序
START:CLR PSB
SETB LRET
MOV SP,50H
CLR A
LCALL DEL40
LCALL INIR
MOV ADDR,#80H;顯示第一頁內(nèi)容
MOV DPTR,#DISA1
LCALL LINE
MOV ADDR,#90H
MOV DPTR,#DISA2
LCALL LINE
MOV ADDR,#88H
MOV DPTR,#DISA3
LCALL LINE
MOV ADDR,#98H
MOV DPTR,#DISA4
LCALL LINE
LCALL DEL2S
MOV ADDR,#80H;顯示第二頁內(nèi)容
MOV DPTR,#DISA5
LCALL LINE
MOV ADDR,#90H
MOV DPTR,#DISA6
LCALL LINE
MOV ADDR,#88H
MOV DPTR,#DISA7
LCALL LINE
MOV ADDR,#98H
MOV DPTR,#DISA8
LCALL LINE
LCALL DEL2S
MOV ADDR,#80H;顯示第三頁內(nèi)容
MOV DPTR,#DISB1
LCALL LINE
MOV ADDR,#90H
MOV DPTR,#DISB2
LCALL LINE
MOV ADDR,#88H
MOV DPTR,#DISB3
LCALL LINE
MOV ADDR,#98H
MOV DPTR,#DISB4
LCALL LINE
LCALL DEL2S
MOV ADDR,#80H;顯示第四頁內(nèi)容
MOV DPTR,#DISB5
LCALL LINE
MOV ADDR,#90H
MOV DPTR,#DISB6
LCALL LINE
MOV ADDR,#88H
MOV DPTR,#DISB7
LCALL LINE
MOV ADDR,#98H
MOV DPTR,#DISB8
LCALL LINE
LCALL DEL2S
LJMP START
;函數(shù)TSWC 指令的同步位元字串寫入
TSWC: SETB CS
SETB SID
MOV R0,#05H
D1:SETB CLK
CLR CLK
DJNZ R0,D1
CLR SID
MOV R0,#03H
D2:SETB CLK
CLR CLK
DJNZ R0,D2
RET
;函數(shù)HDB4 寫入數(shù)據(jù)的高4位
HDB4: SETB CS
MOV R1,#04H
D3:RLC A
MOV SID,C
SETB CLK
CLR CLK
DJNZ R1,D3
RET
;函數(shù)ZEN4 寫入數(shù)據(jù)的低4位
ZEN4: CLR SID
MOV R1,#04H
D4:SETB CLK
CLR CLK
DJNZ R1,D4
RET
;函數(shù)WCOM 指令寫入程序
WCOM: LCALL TSWC
MOV A,COM
LCALL HDB4
LCALL ZEN4
LCALL HDB4
LCALL ZEN4
CLR CS
LCALL DEL2M
RET
;函數(shù)INIR 初始化LCD12864
INIR: MOV COM,#00110000B;設(shè)置基本指令
LCALL WCOM
MOV COM,#00110000B;設(shè)置8-BIT
LCALL WCOM
MOV COM,#00001100B;顯示開,關(guān)光標(biāo),光反白
LCALL WCOM
MOV COM,#00000001B;清屏,AC=0
LCALL WCOM
MOV COM,#00000110B;進(jìn)入點設(shè)定
LCALL WCOM
RET
;函數(shù)TSWD 顯示數(shù)據(jù)的同步位元字串寫入
TSWD: SETB CS
SETB SID
MOV R3,#05H
E2:SETB CLK
CLR CLK
DJNZ R3,E2
CLR SID
SETB CLK
CLR CLK
SETB SID
SETB CLK
CLR CLK
CLR SID
SETB CLK
CLR CLK
RET
;函數(shù)WDAT 顯示數(shù)據(jù)寫入程序
WDAT: LCALL TSWD
MOV A,DAT
LCALL HDB4
LCALL ZEN4
LCALL HDB4
LCALL ZEN4
CLR CS
LCALL DEL2M
RET
;函數(shù)LINE 寫入一行顯示數(shù)據(jù)程序
LINE:MOV A,ADDR
MOV COM,A
LCALL WCOM
MOV R2,#10H
E1:CLR A
MOVC A,@A+DPTR
MOV DAT,A
LCALL WDAT
INC DPTR
DJNZ R2,E1
RET
;函數(shù)DEL40 40MS延時
DEL40:MOV R0,#40
DE1:MOV R1,#250
DE2:NOP
NOP
DJNZ R1,DE2
DJNZ R0,DE1
RET
;函數(shù)DEL2M 2MS延時
DEL2M:MOV R0,#2
DE3:MOV R1,#250
DJNZ R1,$
DJNZ R0,DE3
RET
;函數(shù)DEL2S 2S延時
DEL2S:MOV R5,#50
DE4:LCALL DEL40
DJNZ R5,DE4
RET
;顯示內(nèi)容區(qū)
DISA1:DB "青島佰謙工貿(mào)公司"
DISA2:DB "WWW.Baidu.COM.cn"
DISA3:DB " 13210813637 "
DISA4:DB "128*64全點陣顯示"
DISA5:DB "圖形以及字符顯示"
DISA6:DB "2009年 7月 29 日"
DISA7:DB "設(shè)計者:趙玉慶 "
DISA8:DB "AT89C52 與ST7920"
DISB1:DB "昨夜星辰昨夜風(fēng),"
DISB2:DB "畫樓西畔桂堂東。"
DISB3:DB "身無彩鳳雙飛翼,"
DISB4:DB "心有靈犀一點通。"
DISB5:DB "隔座送鉤春酒暖,"
DISB6:DB "分曹射覆蠟燈紅。"
DISB7:DB "嗟余聽鼓應(yīng)官去,"
DISB8:DB "走馬蘭臺類轉(zhuǎn)蓬。"
END
.......................lcd12864 串口驅(qū)動程序(c51:已調(diào)試過).................................................
#include
#define uchar unsigned char
sbit cs=P2^4;
sbit sid=P2^5;
sbit clk=P2^6;
sbit psb=P2^1;
sbit res=P2^3;
uchar a,i;
uchar code table1[]="實用開關(guān)電源手冊";
uchar code table2[]="Lcent Technologi";
uchar code table3[]="51單片機(jī)開發(fā)原理";
uchar code table4[]="STC89C52_LCD1286";
void d1ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void d10ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void synbit()
{
uchar j;
sid=1;
for(j=0;j<5;j++)
{
clk=1;
clk=0;
}
}
void zorn()
{
uchar j;
for(j=0;j<4;j++)
{
sid=0;
clk=1;
clk=0;
}
}
void send(uchar date)
{
uchar j;
for(j=0;j<4;j++)
{
sid=(bit)(date&0x80);
clk=1;
clk=0;
date=date<<1;
}
zorn();
for(j=0;j<4;j++)
{
sid=(bit)(date&0x80);
clk=1;
clk=0;
date=date<<1;
}
zorn();
}
void write_com(uchar com)
{
uchar j;
cs=1;
synbit();
sid=0;
for(j=0;j<3;j++)
{
clk=1;
clk=0;
}
send(com);
cs=0;
d1ms();
}
void init()
{
write_com(0x30);
write_com(0x30);
write_com(0x01);
write_com(0x02);
write_com(0x06);
write_com(0x0c);
write_com(0x14);
}
void write_date(uchar date)
{
cs=1;
synbit();
sid=0;
clk=1;
clk=0;
sid=1;
clk=1;
clk=0;
sid=0;
clk=1;
clk=0;
send(date);
cs=0;
d1ms();
}
void displcd()
{
write_com(0x80);
for(i=0;i<0x10;i++)
{
write_date(table1[i]);
}
write_com(0x88);
for(i=0;i<0x10;i++)
{
write_date(table2[i]);
}
write_com(0x90);
for(i=0;i<0x10;i++)
{
write_date(table3[i]);
}
write_com(0x98);
for(i=0;i<0x10;i++)
{
write_date(table4[i]);
}
}
void main()
{
cs=0;
sid=0;
clk=0;
SP=0x30;
res=0;
d10ms();
res=1;
psb=0;
init();
displcd();
while(1);
}
評論