/view/5881209.htm
RS?BIT?P3.0 ?//重命名四個IO口
RW?BIT?P3.1
E?BIT?P3.2
BF?BIT?P2.7 ?//D0~D7接在P2口
ACALL?CSH ?//調用初始化函數
MOV?DPTR,#YH?//調用數組YH
ACALL?XS ?//調用顯示函數
MOV?A,#0C0H ?//定義光標為第二行第壹位
ACALL?ML ?//調用命令函數
MOV?DPTR,#EH?//調用數組EH
ACALL?XS ?//調用顯示函數
AJMP?$ ?//原地循環
XS: CLR?A ?//清零累加器
MOVC?A,@A+DPTR//把數組指針指向的值傳給數據函數
ACALL?SJ ?//調用數據函數
INC?DPTR ?//數組指針加壹
CJNE?A,#'$',XS//檢測數組是否到達結尾,若到結尾則進行下壹句,否則調用顯示函數
RET ?//返回調用處
T:?MOV?R7,#1 ?//預置數為1,準備延時
DJNZ?R7,$ ?//循環R7-1直到為0
RET ?//返回調用處
ZT:?CLR?RS ?//置RS為低電平
SETB?RW ?//置RW為高電平
L0:?ACALL?T ?//調用延時函數
SETB?E ?//置E為高電平
ACALL?T ?//調用延時函數
MOV?C,BF ?//把BF傳給標誌位C
CLR?E ?//置E為低電平
JC?L0 ?//檢測標誌位C是否為零,若為零進行下壹句,否則調用查狀態函數
CLR?RW ?//置RW為低電平
RET ?//返回調用處
ML:?ACALL?ZT ?//調用查狀態函數
SETB?E ?//置E為高電平
MOV?P2,A ?//把命令傳給P2口
ACALL?T ?//調用延時函數
CLR?E ?//置RW為低電平
RET ?//返回調用處
CSH:MOV?A,#38H ?//設8位數據線,雙行,5*7點陣,
ACALL?ML ?//調用命令函數
MOV?A,#0CH ?//開顯示,不顯示光標
ACALL?ML ?//調用命令函數
MOV?A,#06H ?//地址自加,屏幕不移動
ACALL?ML ?//調用命令函數
MOV?A,#80H ?//定位光標為第壹行第壹位
ACALL?ML ?//調用命令函數
RET ?//返回調用處
SJ:?ACALL?ZT ?//調用查狀態函數
SETB?RS ?//置RS為高電平
SETB?E ?//置E為高電平
MOV?P2,A ?//把數據傳給P2口
ACALL?T ?//調用延時函數
CLR?E ?//置RW為低電平
RET ?//返回調用處
YH:?DB?"123456789CHENGUI$"//YH數組
EH:?DB?"ABCDEFGHIJKLMNOP$"//EH數組
END ?//程序結束
或
sbit?rs=0xb0;
sbit?rw=0xb1;
sbit?e=0xb2;
sbit?bf=0xa7;
sfr?P2=0xa0;
unsigned?char?code?yh[]="123456789chengui0",//第壹行要顯示的
?eh[]="abcdefghijklmnop0";//第壹行要顯示的
void?t()//延時函數
{
unsigned?char?x=1;
while(x--);
}
void?zt()//查LCD狀態函數
{
bit?i;
rw=1;
rs=0;
do
{
t();
e=1;
t();
i=bf;
e=0;
}
while(bf!=0);
rw=0;
}
void?ml(unsigned?char?x)//送命令函數
{
zt();
e=1;
P2=x;
t();
e=0;}
void?csh()//初始化函數
{
ml(0x28);
ml(0x0c);
ml(0x06);
ml(0x80);
}
void?sj(unsigned?char?x)//送數據函數
{
zt();
rs=1;
e=1;
P2=x;
t();
e=0;
}
void?main()//主函數
{
unsigned?char?i;
csh();
while(yh[i]!='0')
{
sj(yh[i]);
i++;
}
ml(0xc0);
i=0;
while(eh[i]!='0')
{
sj(eh[i]);
i++;
while(1);
}
}