///////////////////////////
// 51单片机 pascal 语言 示例
// LCD1602 写字符
/////////////////////////
Program test4prj;
CONST
LCD1602_DISPLAY_MODE_16X2=%00111000 ; //显示模式 16 x 2;
Table1:string[16]=‘FIRST’ ;
Table2:string[16]=‘two’;
var
LCD1602_RS:boolean absolute P0.4 ; // 数据H/命令L 选择端
LCD1602_RW:boolean absolute P0.3; // 读H / 写L 选择端
LCD1602_EN:boolean absolute P0.2; // 使用能
i:integer;
procedure NOP;assembler;
asm
NOP;
end;
procedure Delay4NOP;assembler;
asm
NOP;
NOP;
NOP;
NOP;
end;
procedure Delay(ms:integer);
var
l,j,k:integer;
begin
for l:=0 to ms do begin
for j:=0 to 6000 do begin
inc(k);dec(k);
end;
end;
end;
procedure LCD1602_Clear;
begin
end;
//检测是否忙碌
function LCD1602_IsBusy:boolean;
begin
LCD1602_RS:=false;
LCD1602_RW:=True;
LCD1602_EN:=True;
Delay4NOP;
Result:=(P2 AND %10000000)<>0;
LCD1602_EN:=FALSE;
end;
//写入命令
procedure LCD1602_WriteCommand(cmd:byte);
begin
while LCD1602_IsBusy do begin
end;
LCD1602_RS:=false;
LCD1602_RW:=false;
LCD1602_EN:=FALSE;
Delay4NOP;
P2:=cmd;
Delay4NOP;
LCD1602_EN:=True;
Delay4NOP;
LCD1602_EN:=FALSE;
end;
//写入数据
procedure LCD1602_WriteData(data:byte);
begin
LCD1602_RS:=TRUE;
LCD1602_RW:=false;
LCD1602_EN:=false;
P2:=data;
Delay4NOP;
LCD1602_EN:=TRUE;
Delay4NOP;
LCD1602_EN:=FALSE;
end;
//初始化
procedure LCD1602_Init;
begin
LCD1602_WriteCommand(LCD1602_DISPLAY_MODE_16X2); //设置显示模式
LCD1602_WriteCommand(%00001100); // 显示开,光标关
LCD1602_WriteCommand(%00000110); // 移动 光标
LCD1602_WriteCommand($01); // 清屏
end;
//设置显示位置
procedure LCD1602_SetCursorPos(pos:byte);
begin
LCD1602_WriteCommand(pos+$80);
end;
//-----------------------------------
begin
LCD1602_Init;
repeat
delay(30);
LCD1602_WriteCommand($01); // 清屏
delay(30);
LCD1602_SetCursorPos(0);
for i:=1 to Length(Table1) do begin
LCD1602_WriteData(byte(Table1[i]));
end;
LCD1602_SetCursorPos($40);
for i:=1 to Length(Table2) do begin
LCD1602_WriteData(byte(Table2[i]));
end;
until FALSE;
end.