;This program is for 12232F,12864-12,12864M Serial test ; RS--------P3.0 ; R/W-------P3.1 ; E---------P3.2 ; DB0~7-----P1 CS EQU P3.0;片选(串行) 0:禁止 1:允许 SID EQU P3.1;输入串行数据(串行) CLK EQU P3.2;输入串行脉冲(串行) PSB EQU P3.3;控制界面 0:串行 1:并行8/4 位 ORG 0000H AJMP START ; ORG 0003H ; LCALL PAUSE ORG 0100h START: ; MOV IE,#81H ;EXT. INT0 PERMIT ; MOV IP,#01H ;INT0 IS FIRST INT. LEVEL ; MOV TCON,#00H ;TIMER/COUNTER CONTROLER INIT. MOV SP, #67H CLR PSB;选择串行工作模式 LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL SETUP;LCD初始化设置 LCALL DEF_CHAR;自定义字符显示 /*--------------------------------------------------- 显示4行CGRAM1字符 ----------------------------------------------------*/ MOV A,#80H LCALL WRITE_COM;发送设定DDRAM地址0x00命令 /*--------------------------------------------------- 显示第一行CGRAM1字符 ----------------------------------------------------*/ MOV R3,#8 TEST11: MOV DPTR,#CGRAM1 ;CGRAM TEST LCALL WRITE_CGRAM DJNZ R3,TEST11 MOV A,#90H LCALL WRITE_COM;发送设定DDRAM地址0x10命令 /*--------------------------------------------------- 显示第二行CGRAM1字符 ----------------------------------------------------*/ MOV R3,#8 TEST12: MOV DPTR,#CGRAM1 LCALL WRITE_CGRAM DJNZ R3,TEST12 MOV A,#88H LCALL WRITE_COM;发送设定DDRAM地址0x08命令 /*--------------------------------------------------- 显示第三行CGRAM1字符 ----------------------------------------------------*/ MOV R3,#8 TEST13: MOV DPTR,#CGRAM1 LCALL WRITE_CGRAM DJNZ R3,TEST13 MOV A,#98H LCALL WRITE_COM;发送设定DDRAM地址0x18命令 /*--------------------------------------------------- 显示第四行CGRAM1字符 ----------------------------------------------------*/ MOV R3,#8 TEST14: MOV DPTR,#CGRAM1 LCALL WRITE_CGRAM DJNZ R3,TEST14 /*--------------------------------------------------- CGRAM1字符显示等待延时5秒 ----------------------------------------------------*/ LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS /*--------------------------------------------------- 显示4行CGRAM2字符 ----------------------------------------------------*/ MOV A,#80H LCALL WRITE_COM;发送设定DDRAM地址0x00命令 /*--------------------------------------------------- 显示第一行CGRAM2字符 ----------------------------------------------------*/ MOV R3,#8 TEST21: MOV DPTR,#CGRAM2 LCALL WRITE_CGRAM DJNZ R3,TEST21 MOV A,#90H LCALL WRITE_COM;发送设定DDRAM地址0x10命令 /*--------------------------------------------------- 显示第二行CGRAM2字符 ----------------------------------------------------*/ MOV R3,#8 TEST22: MOV DPTR,#CGRAM2 LCALL WRITE_CGRAM DJNZ R3,TEST22 MOV A,#88H LCALL WRITE_COM;发送设定DDRAM地址0x08命令 /*--------------------------------------------------- 显示第三行CGRAM2字符 ----------------------------------------------------*/ MOV R3,#8 TEST23: MOV DPTR,#CGRAM2 LCALL WRITE_CGRAM DJNZ R3,TEST23 MOV A,#98H LCALL WRITE_COM;发送设定DDRAM地址0x18命令 /*--------------------------------------------------- 显示第四行CGRAM2字符 ----------------------------------------------------*/ MOV R3,#8 TEST24: MOV DPTR,#CGRAM2 LCALL WRITE_CGRAM DJNZ R3,TEST24 /*--------------------------------------------------- CGRAM2字符显示等待延时 ----------------------------------------------------*/ LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS /*--------------------------------------------------- 显示4行CGRAM3字符 ----------------------------------------------------*/ MOV A,#80H LCALL WRITE_COM;发送设定DDRAM地址0x00命令 /*--------------------------------------------------- 显示第一行CGRAM3字符 ----------------------------------------------------*/ MOV R3,#8 TEST31: MOV DPTR,#CGRAM3 LCALL WRITE_CGRAM DJNZ R3,TEST31 MOV A,#90H LCALL WRITE_COM;发送设定DDRAM地址0x10命令 /*--------------------------------------------------- 显示第二行CGRAM3字符 ----------------------------------------------------*/ MOV R3,#8 TEST32: MOV DPTR,#CGRAM3 LCALL WRITE_CGRAM DJNZ R3,TEST32 MOV A,#88H LCALL WRITE_COM;发送设定DDRAM地址0x08命令 /*--------------------------------------------------- 显示第三行CGRAM3字符 ----------------------------------------------------*/ MOV R3,#8 TEST33: MOV DPTR,#CGRAM3 LCALL WRITE_CGRAM DJNZ R3,TEST33 MOV A,#98H LCALL WRITE_COM;发送设定DDRAM地址0x18命令 /*--------------------------------------------------- 显示第四行CGRAM3字符 ----------------------------------------------------*/ MOV R3,#8 TEST34: MOV DPTR,#CGRAM3 LCALL WRITE_CGRAM DJNZ R3,TEST34 /*--------------------------------------------------- CGRAM3字符显示等待延时 ----------------------------------------------------*/ LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS /*--------------------------------------------------- 显示4行CGRAM4字符 ----------------------------------------------------*/ MOV A,#80H LCALL WRITE_COM;发送设定DDRAM地址0x00命令 /*--------------------------------------------------- 显示第一行CGRAM4字符 ----------------------------------------------------*/ MOV R3,#8 TEST41: MOV DPTR,#CGRAM4 LCALL WRITE_CGRAM DJNZ R3,TEST41 MOV A,#90H LCALL WRITE_COM;发送设定DDRAM地址0x10命令 /*--------------------------------------------------- 显示第二行CGRAM4字符 ----------------------------------------------------*/ MOV R3,#8 TEST42: MOV DPTR,#CGRAM4 LCALL WRITE_CGRAM DJNZ R3,TEST42 MOV A,#88H LCALL WRITE_COM;发送设定DDRAM地址0x08命令 /*--------------------------------------------------- 显示第三行CGRAM4字符 ----------------------------------------------------*/ MOV R3,#8 TEST43: MOV DPTR,#CGRAM4 LCALL WRITE_CGRAM DJNZ R3,TEST43 MOV A,#98H LCALL WRITE_COM;发送设定DDRAM地址0x18命令 /*--------------------------------------------------- 显示第四行CGRAM4字符 ----------------------------------------------------*/ MOV R3,#8 TEST44: MOV DPTR,#CGRAM4 LCALL WRITE_CGRAM DJNZ R3,TEST44 /*--------------------------------------------------- CGRAM4字符显示等待延时 ----------------------------------------------------*/ LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS /*--------------------------------------------------- 显示4行英文字符 ----------------------------------------------------*/ MOV A,#80H;第一行英文字符0x80~0x87 LCALL WRITE_COM;发送设定DDRAM地址0x00命令 MOV DPTR,#ETAB;DB ' LCDINLINE.COM! ' /*--------------------------------------------------- 显示第一行英文字符' LCDINLINE.COM! ' ----------------------------------------------------*/ LCALL WRITE_ASCII;显示16个英文字符 MOV A,#90H;第二行英文字符0x90~0x97 LCALL WRITE_COM;发送设定DDRAM地址0x10命令 MOV DPTR,#ETAB+16;DB 'WELCOME TO HERE!' /*--------------------------------------------------- 显示第二行英文字符'WELCOME TO HERE!' ----------------------------------------------------*/ LCALL WRITE_ASCII;显示16个英文字符 MOV A,#88H;第三行英文字符0x88~0x8F LCALL WRITE_COM;发送设定DDRAM地址0x08命令 MOV DPTR,#TABLE1;DB 'ABCDEFGHIJKLMNOP' /*--------------------------------------------------- 显示第三行英文字符'ABCDEFGHIJKLMNOP' ----------------------------------------------------*/ LCALL WRITE_ASCII;显示16个英文字符 MOV A,#98H;第一行英文字符0x98~0x9F LCALL WRITE_COM;发送设定DDRAM地址0x18命令 MOV DPTR,#TABLE1+16;DB '0123456789!@#$%^' /*--------------------------------------------------- 显示第四行英文字符'0123456789!@#$%^' ----------------------------------------------------*/ LCALL WRITE_ASCII;显示16个英文字符 /*--------------------------------------------------- 英文字符显示等待延时 ----------------------------------------------------*/ LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS /*--------------------------------------------------- 显示2行汉字字符 ----------------------------------------------------*/ MOV A,#80H;第一行汉字字符0x80~0x87 LCALL WRITE_COM;发送设定DDRAM地址0x00命令 MOV DPTR,#CTAB;'炜烨电子专业服务' /*--------------------------------------------------- 显示第一行汉字字符'炜烨电子专业服务' ----------------------------------------------------*/ LCALL WRITE_HZ;第二行汉字字符0x90~0x97 MOV A,#90H;第一行英文字符0x90~0x97 LCALL WRITE_COM;发送设定DDRAM地址0x10命令 MOV DPTR,#chinese;'中文液晶显示模块' LCALL WRITE_HZ;显示8个汉字字符 MOV A,#88H;第三行汉字字符0x88~0x8F LCALL WRITE_COM;发送设定DDRAM地址0x08命令 MOV DPTR,#CTAB;'炜烨电子专业服务' LCALL WRITE_HZ;显示8个汉字字符 MOV A,#98H;第四行汉字字符0x98~0x9F LCALL WRITE_COM;发送设定DDRAM地址0x18命令 MOV DPTR,#chinese;'中文液晶显示模块' LCALL WRITE_hz /*--------------------------------------------------- 汉字字符显示等待延时 ----------------------------------------------------*/ LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS AAA: LJMP START /*--------------------------------------------------- LCD初始化设置 ----------------------------------------------------*/ SETUP: CLR PSB;选择串行工作模式 /*--------------------------------------------------- LCD模块上电等待延时 ----------------------------------------------------*/ LCALL DELAY;延时150mS LCALL DELAY;延时150mS LCALL DELAY;延时150mS MOV A,#00110000B ;FUNCTION SETTING LCALL WRITE_COM;发送功能设定命令,选择基本指令集 MOV A,#00000010B ;DDRAM SET TO '00H' LCALL WRITE_COM;发送位址归位命令,设定DDRAM位址计数器为0 MOV A,#00000100B ; LCALL WRITE_COM;发送进入点命令 MOV A,#00001100B ;DISPLAY ON LCALL WRITE_COM;发送开显示关光标命令 MOV A,#00000001B ;CLEARING SCREEN LCALL WRITE_COM;发送清除显示命令 MOV A,#10000000B ;SET DDRAM ADDRESS LCALL WRITE_COM;发送设定DDRAM地址0x00命令 RET /*-------------------------------------------------------- 发送命令 --------------------------------------------------------*/ WRITE_COM: ;Serial Port LCALL DELAY1 ;INSTEAD OF CHECKING BF STATE /*-------------------------------------------------------- 发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右) --------------------------------------------------------*/ SETB CS;使能LCD串行通信,SCK开始为高 PUSH ACC;保存发送命令或数据 MOV R0,#8;发送8位串行数据 MOV A,#11111000B;发送同步脉冲,WR(0) RS(0) COMM1: CLR C RLC A;左移方式(符合SPI协议) MOV SID,C;发送一位数据 CLR CLK; SETB CLK;发送时钟脉冲 DJNZ R0,COMM1;8位数据未发送完毕 POP ACC;恢复发送命令或数据 /*-------------------------------------------------------- 注意:命令或数据都是半字节分2次发送的 --------------------------------------------------------*/ MOV R5,A;保存发送命令或数据 ANL A,#0F0H;取高4位 MOV R0,#8;发送8位串行数据(只有4位有效) COMM2: CLR C RLC A;左移一位数据 MOV SID,C;发送一位数据 CLR CLK SETB CLK;发送时钟脉冲 DJNZ R0,COMM2;8位数据未发送完毕 MOV A,R5;恢复发送命令或数据 SWAP A;交换高低位 ANL A,#0F0H;取低4位 MOV R0,#8;发送8位串行数据(只有4位有效) COMM3: CLR C RLC A;左移一位数据 MOV SID,C;发送一位数据 CLR CLK SETB CLK;发送时钟脉冲 DJNZ R0,COMM3;8位数据未发送完毕 CLR CS;禁止LCD串行通信,SCK结束为高 RET /*-------------------------------------------------------- 写资料到RAM中 --------------------------------------------------------*/ WRITE_DAT: LCALL DELAY1 /*-------------------------------------------------------- 发送同步脉冲11111 WR(0) RS(1) 0发送顺序从左至右) --------------------------------------------------------*/ SETB CS;使能LCD串行通信,SCK开始为高 PUSH ACC MOV R0,#8;发送8位串行命令 MOV A,#11111010B;;发送同步脉冲,WR(0) RS(1) DATA1: CLR C RLC A;左移一位数据 MOV SID,C;发送一位数据 CLR CLK SETB CLK;发送时钟脉冲 DJNZ R0,DATA1;8位数据未发送完毕 POP ACC /*-------------------------------------------------------- 注意:命令或数据都是半字节分2次发送的 --------------------------------------------------------*/ MOV R5,A;保存发送命令或数据 ANL A,#0F0H;取高4位 MOV R0,#8;发送8位串行数据(只有4位有效) DATA2: CLR C RLC A;左移一位数据 MOV SID,C;发送一位数据 CLR CLK SETB CLK;发送时钟脉冲 DJNZ R0,DATA2;8位数据未发送完毕 MOV A,R5;恢复发送命令或数据 SWAP A;交换高低位 ANL A,#0F0H;取低4位 MOV R0,#8;发送8位串行数据(只有4位有效) DATA3: CLR C RLC A;左移一位数据 MOV SID,C;发送一位数据 CLR CLK SETB CLK;发送时钟脉冲 DJNZ R0,DATA3;8位数据未发送完毕 CLR CS;禁止LCD串行通信,SCK结束为高 RET /*-------------------------------------------------------- 延时16*16uS=256uS ---------------------------------------------------------*/ DELAY1: MOV R7,#010H D11: MOV R6,#010H DJNZ R6,$ DJNZ R7,D11 RET /*-------------------------------------------------------- 延时256*(16*16+256)uS=2*256*256=131072uS=131mS ---------------------------------------------------------*/ DELAY: MOV R1,#00H D2: MOV R2,#00H LCALL DELAY1 DJNZ R2,$ DJNZ R1,D2 RET /*------------------------------------------------ 自定义字符显示 -------------------------------------------------*/ DEF_CHAR: ;WRITE TO CGRAM MOV A,#01000000B ;SET CGRAM ADDRESS LCALL WRITE_COM;发送设定CGRAM地址0x00命令 /*------------------------------------------------ 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF 0.**************.*..............**..............**..............**..............**..............**..............**..............* 1*..............**..............**..............**..............**..............**..............**..............*.**************. 2*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*. 3*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*. 4.*.*.*.*.*.*.*.**.*.*.*.*.*.*.*..*.*.*.*.*.*.*.**.*.*.*.*.*.*.*..*.*.*.*.*.*.*.**.*.*.*.*.*.*.*..*.*.*.*.*.*.*.**.*.*.*.*.*.*.*. 5.*.*.*.*.*.*.*.**.*.*.*.*.*.*.*..*.*.*.*.*.*.*.**.*.*.*.*.*.*.*..*.*.*.*.*.*.*.**.*.*.*.*.*.*.*..*.*.*.*.*.*.*.**.*.*.*.*.*.*.*. 6******************************************************************************************************************************** 7******************************************************************************************************************************** 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF -------------------------------------------------*/ MOV R3,#14;2+14*2 MOV A,#07fH LCALL WRITE_DAT;写资料到RAM中 MOV A,#0feH LCALL WRITE_DAT;写资料到RAM中 DEF1: MOV A,#080H LCALL WRITE_DAT;写资料到RAM中 MOV A,#001H LCALL WRITE_DAT;写资料到RAM中 DJNZ R3,DEF1 MOV A,#07fH LCALL WRITE_DAT;写资料到RAM中 MOV A,#0feH LCALL WRITE_DAT;写资料到RAM中 MOV R3,#8 DEF2: MOV A,#0AAH LCALL WRITE_DAT;写资料到RAM中 MOV A,#0AAH LCALL WRITE_DAT;写资料到RAM中 MOV A,#0AAH LCALL WRITE_DAT;写资料到RAM中 MOV A,#0AAH LCALL WRITE_DAT;写资料到RAM中 DJNZ R3,DEF2 MOV R3,#8 DEF3: MOV A,#055H LCALL WRITE_DAT;写资料到RAM中 MOV A,#055H LCALL WRITE_DAT;写资料到RAM中 MOV A,#0AAH LCALL WRITE_DAT;写资料到RAM中 MOV A,#0AAH LCALL WRITE_DAT;写资料到RAM中 DJNZ R3,DEF3 mov R3,#8 DEF4: MOV A,#0FFH LCALL WRITE_DAT;写资料到RAM中 MOV A,#0FFH LCALL WRITE_DAT;写资料到RAM中 MOV A,#0FFH LCALL WRITE_DAT;写资料到RAM中 MOV A,#0FFH LCALL WRITE_DAT;写资料到RAM中 DJNZ R3,DEF4 RET /*------------------------------------------------- 显示16个英文字符子程序 -------------------------------------------------*/ WRITE_ASCII: MOV R4,#16;显示16个英文字符 DDDD: CLR A MOVC A,@A+DPTR;取英文字符集 LCALL WRITE_DAT;写资料到RAM中 INC DPTR DJNZ R4,DDDD RET /*------------------------------------------------- 显示8个汉字字符子程序 -------------------------------------------------*/ WRITE_HZ: ;WRITE 8 CHINESE TO LCD MOV R4,#8;显示8个汉字字符 DD: CLR A MOVC A,@A+DPTR;取高位汉字内码 INC DPTR LCALL WRITE_DAT;写资料到RAM中 CLR A MOVC A,@A+DPTR;取低位汉字内码 INC DPTR LCALL WRITE_DAT;写资料到RAM中 DJNZ R4,DD RET /*------------------------------------------------- 显示CGRAM 的字型子程序 --------------------------------------------------*/ WRITE_CGRAM: ;CGRAM TESTING CLR A MOVC A,@A+DPTR LCALL WRITE_DAT INC DPTR CLR A MOVC A,@A+DPTR LCALL WRITE_DAT RET /*------------------------------------------------- 键扫描中断服务程序(本示例无用) --------------------------------------------------*/ PAUSE: SETB P3.2 ;PAUSE KEY PROCESS SETB P3.2 LCALL DELAY1 MOV C,P3.2 MOV C,P3.2 JNC PAUSE ;CHECK KEY WAS PRESSED PAUSE1: MOV C,P3.2 MOV C,P3.2 LCALL DELAY1 JC PAUSE1 ;CHECK KEY OPEN AFTER PRESSED PAUSE2: SETB P3.2 SETB P3.2 LCALL DELAY1 MOV C,P3.2 MOV C,P3.2 JNC PAUSE2 ;CHECK KEY WAS PRESSED AGAIN RETI /*------------------------------------------------- 显示英文字符表 --------------------------------------------------*/ TABLE1: DB 'ABCDEFGHIJKLMNOP' DB '0123456789!@#$%^' ETAB: DB ' LCDINLINE.COM! ' DB 'WELCOME TO HERE!' /*------------------------------------------------- 显示CGRAM字型表 --------------------------------------------------*/ CGRAM1: DB 000H,000H CGRAM2: DB 000H,002H CGRAM3: DB 000H,004H CGRAM4: DB 000H,006H /*------------------------------------------------- 显示汉字字符表 --------------------------------------------------*/ CHINESE: DB '中文液晶显示模块' CTAB: DB '炜烨电子专业服务' END