📄 z1602.c.bak
字号:
; SMC1602接口程序(MCS51总线方式)
;****************************************************************************
;* Title : Accessing to LCD-CONTROLLER *
;* Date : 2000.4.27 *
;* Support telephone: 0731-4167806,4167808(CHANGSHA SUMAN) *
;* Support fax :0731-4167807 Support E-mail:sunman@public.cs.hn.cn *
;* Create by :褚建军(chujianjun),朱长春(zhuchangchun) *
;* DESCRIPTION:This subroutine shows how to write data to LCD-CONTROLLER *
;****************************************************************************
;连线图: *LCM---8031* *LCM---8031* *LCM------------8031 *
; *DB0---P0.0* *DB4---P0.4* *RS-------------P2.0 *
; *DB1---P0.1* *DB5---P0.5* *RW-------------P2.1 *
; *DB2---P0.2* *DB6---P0.6* *E--NAND GATE---P2.7* (参见说明书)
; *DB3---P0.3* *DB7---P0.7* *VLCD接10K可调电阻到GND *
;注:8031的晶振频率为12MHz *
;****************************************************************************
RSADDR EQU 0100H
RWADDR EQU 0200H
CSADDR EQU 8000H
XPOS EQU 20H ;列方向地址指针(用于LCDPOS子程序)
YPOS EQU 21H ;行方向地址指针(用于LCDPOS子程序)
ORG 0000H
JMP START
START: MOV SP,#60H
MAIN:
MOV R7,#'0' ;测试主程序
MN_PA: ;整屏循环显示"0"到"9"及空格
CALL LCDRESET
MOV A,R7
CALL LCDFILL
CALL DELAY400MS
INC R7
MOV A,R7
CJNE A,#'9'+1,MN_PA
MOV A,#' '
CALL LCDFILL
CALL DELAY400MS
JMP MAIN
LCDFILL:
MOV B,A
MOV YPOS,#0
LFL_PB: MOV XPOS,#0 ;整屏显示A中所代表字符
LFL_PA: MOV A,B
CALL LCDWRITE
INC XPOS
MOV A,XPOS
CJNE A,#16,LFL_PA
INC YPOS
MOV A,YPOS
CJNE A,#2,LFL_PB
RET
/*=======================================================
设置第(XPOS,YPOS)个字符的DDRAM地址
=======================================================*/
void LocateXY( char posx,char posy)
{
Uchar temp;
temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
LCDWCN(temp,1);
}
void LCDWRITE(Uchar x,Uchar y,Uchar Wdata) //定位写字符子程序
CALL LCDPOS ;定位显示地址
CALL LCDWD ;写字符
RET
/*=======================================================
初始化程序
=======================================================*/
void LCDRESET( void )
{ // 初始化程序
DELAY5MS(); // 延时15MS
DELAY5MS();
DELAY5MS();
LCDWCN( 0x38,0); // 显示模式设置(不检测忙信号)
LCDWCN( 0x38,0); // 共三次
DELAY5MS();
LCDWCN( 0x38,0);
DELAY5MS();
LCDWCN( 0x38,0); // 共三次
LCDWCN( 0x38,1); // 显示模式设置(以后均检测忙信号)
LCDWCN( 0x8,1); // 显示关闭
LCDWCN( 0x1,1); // 显示清屏
LCDWCN( 0x6,1); // 显示光标移动设置
LCDWCN( 0xc,1); // 显示开及光标设置
}
/*=======================================================
写控制字符子程序: CS=1 RS=0 RW=0
=======================================================*/
void LCDWC( Uchar CMD,Uchar AttribC )
{
if (AttribC) WAITIDLE(); // 检测忙信号?
PortLcmCmdOut = CMD; // 送控制字子程序
}
/*=======================================================
写字符子程序: CS=1 RS=1 RW=0
=======================================================*/
void LCDWD( char dataW )
{
WAITIDLE();
PortLcmDataOut = daraW;
}
/*=======================================================
正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
DB7: 0 LCD控制器空闲; 1 LCD控制器忙
========================================================*/
void WAITIDLE( void )
{
while( PortLcmBusyStatus };
}
void DELAY5MS(void)
{
Uint i = 2500;
while(i--);
}
void DELAY400MS(void)
{
Uchar i = 20;
Uint j= 10000;
while(i--){while(j--);};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -