;SMG240128A标准图形点阵型液晶显示模块的扩展演示程序[ASM51编程语言][MCS51总线接口方式] ;应用产品: SMG240128A标准图形点阵型液晶显示模块 ; 本演示程序适用于SMG240128A液晶显示模块与MCS51系列单片机采用MCS51总线接口的 ;硬件连线方式。 ; 本演示程序包括T6963C兼容芯片的MCS51总线接口方式子程序集,T6963C兼容芯片的240128 ;液晶显示模块的基本子程序,240128系列绘图子程序集,240128系列图形子程序集,240128系 ;列精简中英文字库子程序集,以及SMG240128系列标准图形点阵型液晶显示的扩展演示子程序. ; 本演示的内容为,在240列X128行的点阵液晶显示屏上清屏,图片演示,英文字符串演示,中文 ;字符串演示,反白显示字符串,绘制矩形,写点,绘制直线,全屏显示. ;------------------------------------------------------------------------------- ;创建日期: 2009.08.14 ;软件环境: VW For Windows ;硬件环境: AT89C52 MCU,MCS-51系列 MCU,etc. ;创建人: 褚建军(chujianjun@sunman.cn),谭超(tanchao@sunman.cn). ;技术支持: 电话(0731-84167806,84167807),传真(0731-84167807),网址(www.sunman.cn) ;版权信息: 长沙太阳人电子有限公司版权所有,转载请指明出处. ;参考网页: http:/www.sunman.cn/lcm/product/SMG240128A.html ;------------------------------------------------------------------------------- ;SMG240128A产品引脚说明及演示连线 ;PIN1: FG [构造地]-------------------VSS ;PIN2: VSS [电源地]-------------------VSS ;PIN3: VDD [电源正极]-----------------VDD(+5V) ;PIN4: Vo [LCD 偏压输入]-------------接10K的可调电阻2K电阻到VSS及VEE ; Vo=VEE时为显示最深 ;PIN5: WR [写信号 低有效]------------P3.6 ;PIN6: RD [读信号 低有效]------------P3.7 ;PIN7: CE [使能信号 低有效]----------P2.1 ;PIN8: CD [数据/命令选择端(H/L)]---P2.0 ;PIN9: NC [空脚]---------------------不连线 ;PIN10:RST [复位端 低有效]------------VDD ;PIN11:D0 [Data I/O]-----------------P0.0 ;PIN12:D1 [Data I/O]-----------------P0.1 ;PIN13:D2 [Data I/O]-----------------P0.2 ;PIN14:D3 [Data I/O]-----------------P0.3 ;PIN15:D4 [Data I/O]-----------------P0.4 ;PIN16:D5 [Data I/O]-----------------P0.5 ;PIN17:D6 [Data I/O]-----------------P0.6 ;PIN18:D7 [Data I/O]-----------------P0.7 ;PIN19:FS [字体点阵]-----------------VSS ;PIN20:VEE [LCD负压输出]--------------提供液晶负电压. ;PIN21:BLA [背光源正极]---------------见使用说明书. ;PIN22:BLK [背光源负极]---------------VSS ;注:8031的晶振频率为12MHz. ;请参见http://download.sunman.cn/lcm/product/1/SMG240128A.pdf ;------------------------------------------------------------------------------- ;以下为外部地址在演示程序中的预定义 ;用户在编写应用程序时,需按自己的实际硬件连线来重新定义 LCDCADDR EQU 0100H ;CE=0 C/D=1 LCDDADDR EQU 0000H ;CE=0 C/D=0 ;------------------------------------------------------------------------------- ;以下XPOS,YPOS变量用于指示当前操作点的位置的预定义 ;用户在编写应用程序时,需按自己的实际软件程序需要来重新定义 XPOS EQU 20H ;列方向LCD点阵位置指针 YPOS EQU 21H ;行方向LCD点阵位置指针 LCDBITMASK EQU 22H ;PUTSIZEIMAGE,POINT保留变量 CHARIMAGEREVERSE EQU 23H ;字符及图形的反显控制,0(正常显示),1(反显) XDOTS EQU 240 ;图形空间X方向大小 YDOTS EQU 128 ;图形空间Y方向大小 ;------------------------------------------------------------------------------- ORG 0000H ; JMP START ;------------------------------------------------------------------------------- ;以下为精简版中英文字库 ;实际使用时请包含由Sunman精简版中英文字符库代码生成器.exe自动生成的CHARLIB.ASM文 ;文件来替换该部分 ;精简版中英文字符库常量定义 ENGLISHCHARNUMBER EQU 8 ;精简版英文字符库中的英文字符的个数 CHINESECHARNUMBER EQU 11 ;精简版中文字符库中的中文字符的个数 ENGLISHCHARSIZE EQU 8 ;英文字符X方向显示点的个数 CHINESECHARSIZE EQU 16 ;中文字符X方向及中英文字符Y方向显示点的个数 ENGLISHCHARDOTSIZE EQU 16 ;单个英文字符点阵的字节数 CHINESECHARDOTSIZE EQU 32 ;单个中文字符点阵的字节数 ENGLISHCODETAB: ;精简版英文字符库的字符代码表 DB 02eH ;字符001:[.] DB 041H ;字符002:[A] DB 043H ;字符003:[C] DB 04dH ;字符004:[M] DB 04eH ;字符005:[N] DB 053H ;字符006:[S] DB 055H ;字符007:[U] DB 057H ;字符003:[W] CHINESECODETAB: ;精简版中文字符库的字符代码表 DW 0b3a4H ;字符001:[长] DW 0b5e7H ;字符002:[电] DW 0b9abH ;字符003:[公] DW 0c8cbH ;字符004:[人] DW 0c9b3H ;字符005:[沙] DW 0cbbeH ;字符006:[司] DW 0ccabH ;字符007:[太] DW 0cfdeH ;字符008:[限] DW 0d1f4H ;字符009:[阳] DW 0d3d0H ;字符010:[有] DW 0d7d3H ;字符011:[子] ENGLISHCHARDOTTAB: ;精简版英文字符库的字符点阵表 DB 000H,000H,000H,000H,000H,000H,000H,000H ;字符001:[.] DB 000H,000H,000H,000H,060H,060H,000H,000H DB 000H,000H,000H,010H,010H,018H,028H,028H ;字符002:[A] DB 024H,03cH,044H,042H,042H,0e7H,000H,000H DB 000H,000H,000H,03eH,042H,042H,080H,080H ;字符003:[C] DB 080H,080H,080H,042H,044H,038H,000H,000H DB 000H,000H,000H,0eeH,06cH,06cH,06cH,06cH ;字符004:[M] DB 054H,054H,054H,054H,054H,0d6H,000H,000H DB 000H,000H,000H,0c7H,062H,062H,052H,052H ;字符005:[N] DB 04aH,04aH,04aH,046H,046H,0e2H,000H,000H DB 000H,000H,000H,03eH,042H,042H,040H,020H ;字符006:[S] DB 018H,004H,002H,042H,042H,07cH,000H,000H DB 000H,000H,000H,0e7H,042H,042H,042H,042H ;字符007:[U] DB 042H,042H,042H,042H,042H,03cH,000H,000H DB 000H,000H,000H,0d6H,092H,092H,092H,092H ;字符003:[W] DB 0aaH,0aaH,06cH,044H,044H,044H,000H,000H CHINESECHARDOTTAB: ;精简版中文字符库的字符点阵表 DB 008H,000H,008H,010H,008H,020H,008H,040H ;字符001:[长] DB 009H,080H,00eH,000H,008H,000H,0ffH,0feH DB 00aH,000H,009H,000H,008H,080H,008H,040H DB 009H,030H,00aH,01cH,00cH,008H,008H,000H DB 001H,000H,001H,000H,001H,000H,03fH,0f8H ;字符002:[电] DB 021H,008H,021H,008H,03fH,0f8H,021H,008H DB 021H,008H,021H,008H,03fH,0f8H,021H,008H DB 001H,002H,001H,002H,000H,0feH,000H,000H DB 000H,000H,004H,040H,006H,040H,004H,040H ;字符003:[公] DB 008H,020H,008H,010H,010H,018H,022H,00eH DB 043H,004H,002H,000H,004H,020H,008H,010H DB 011H,0f8H,03fH,018H,010H,010H,000H,000H DB 001H,000H,001H,080H,001H,000H,001H,000H ;字符004:[人] DB 001H,000H,001H,000H,002H,080H,002H,080H DB 004H,080H,004H,040H,008H,060H,008H,030H DB 010H,018H,020H,00eH,040H,004H,000H,000H DB 020H,040H,010H,040H,010H,040H,001H,050H ;字符005:[沙] DB 041H,048H,02aH,044H,00aH,042H,014H,040H DB 010H,044H,020H,044H,0e0H,008H,020H,010H DB 020H,020H,020H,0c0H,023H,000H,02cH,000H DB 000H,000H,03fH,0fcH,000H,004H,000H,004H ;字符006:[司] DB 07fH,0e4H,000H,004H,000H,004H,03fH,0c4H DB 020H,044H,020H,044H,03fH,0c4H,020H,044H DB 020H,004H,000H,014H,000H,008H,000H,000H DB 001H,000H,001H,000H,001H,000H,001H,000H ;字符007:[太] DB 07fH,0feH,001H,000H,001H,000H,001H,000H DB 002H,080H,002H,040H,004H,020H,005H,010H DB 008H,098H,010H,0ccH,020H,086H,040H,004H DB 000H,000H,0fbH,0f8H,092H,008H,093H,0f8H ;字符008:[限] DB 0a2H,008H,0a2H,008H,093H,0f8H,08aH,080H DB 08aH,048H,0aaH,050H,092H,020H,082H,020H DB 082H,010H,082H,08eH,083H,004H,082H,000H DB 000H,000H,07dH,0fcH,045H,004H,049H,004H ;字符009:[阳] DB 049H,004H,051H,004H,049H,0fcH,045H,004H DB 045H,004H,045H,004H,069H,004H,051H,004H DB 041H,0fcH,041H,004H,040H,000H,040H,000H DB 001H,000H,001H,000H,07fH,0feH,002H,000H ;字符010:[有] DB 004H,000H,00fH,0f0H,018H,010H,028H,010H DB 04fH,0f0H,088H,010H,008H,010H,00fH,0f0H DB 008H,010H,008H,090H,008H,070H,008H,020H DB 000H,000H,03fH,0f0H,000H,020H,000H,040H ;字符011:[子] DB 000H,080H,001H,000H,001H,000H,001H,004H DB 0ffH,0feH,001H,000H,001H,000H,001H,000H DB 001H,000H,001H,000H,005H,000H,002H,000H ;------------------------------------------------------------------------------- ;以下为图片库点阵代码 ;实际使用时请包含由SUNMAN图形点阵代码生成器.EXE自动生成的IMGLIB.ASM文件来替换该 ;部分 IMG_sunman_32TAB: DB 32,32 DB 000H,00fH,0f0H,000H DB 000H,07fH,0feH,000H DB 001H,0f0H,00fH,080H DB 003H,0c0H,003H,0c0H DB 007H,00fH,0f0H,0e0H DB 00eH,03fH,0fcH,070H DB 01cH,0feH,07fH,038H DB 039H,0fcH,03fH,09cH DB 033H,0fcH,03fH,0ccH DB 073H,0feH,07fH,0ceH DB 067H,0ffH,0ffH,0e6H DB 067H,0e7H,0e7H,0e6H DB 0cfH,0e3H,0c7H,0f3H DB 0cfH,0e1H,087H,0ffH DB 0cfH,0e4H,027H,0ffH DB 0c0H,006H,060H,003H DB 0c0H,007H,0e0H,003H DB 0ffH,0e7H,0e7H,0f3H DB 0ffH,0e7H,0e7H,0f3H DB 0cfH,0e7H,0e7H,0f3H DB 067H,0e7H,0e7H,0e6H DB 067H,0ffH,0ffH,0e6H DB 073H,0ffH,0ffH,0ceH DB 033H,0ffH,0ffH,0ccH DB 039H,0ffH,0ffH,09cH DB 01cH,0ffH,0ffH,038H DB 00eH,03fH,0fcH,070H DB 007H,00fH,0f0H,0e0H DB 003H,0c0H,003H,0c0H DB 001H,0f0H,00fH,080H DB 000H,07fH,0feH,000H DB 000H,00fH,0f0H,000H ;------------------------------------------------------------------------------- START: MOV SP,#60H MAIN: CALL LCDRESET ;LCD显示初始化子程序 CALL EXSAMPLE ;演示程序 JMP MAIN STR1: DB "WWW.SUNMAN.CN",0 STR2: DB "长沙太阳人电子有限公司",0 EXSAMPLE: ;演示程序 ;0.演示前的准备,将LCD液晶显示全部清空 MOV CHARIMAGEREVERSE,#0 ;反显关闭 MOV A,#0 ;清屏 CALL LCDFILL ;1.图片测试: 在(16,48)位置显示32点阵SUNMAN图标 MOV XPOS,#16 ;起始位置为第17列 MOV YPOS,#48 ;起始位置为第49行 MOV DPTR,#IMG_sunman_32TAB ; CALL PUTIMAGE ;显示图象 CALL EXDELAY ;延时约600mS ;2.字符串测试: 在(84,48)位置显示"WWW.SUNMAN.CN"字符串. MOV XPOS,#84 ;起始位置为第85列 MOV YPOS,#48 ;起始位置为第49行 MOV DPTR,#STR1 ; CALL PUTSTR ;显示字符串 CALL EXDELAY ;延时约600mS ;3.字符串测试: 在(48,64)位置显示"长沙太阳人电子有限公司"字符串. MOV XPOS,#48 ;起始位置为第49列 MOV YPOS,#64 ;起始位置为第65行 MOV DPTR,#STR2 ; CALL PUTSTR ;显示字符串 CALL EXDELAY ;延时约600mS ;3.反显测试: 在(48,64)位置反显"长沙太阳人电子有限公司"字符串. MOV XPOS,#48 ;起始位置为第49列 MOV YPOS,#64 ;起始位置为第65行 MOV CHARIMAGEREVERSE,#1 MOV DPTR,#STR2 ; CALL PUTSTR ;显示字符串 MOV CHARIMAGEREVERSE,#0 CALL EXDELAY ;延时约600mS ;3.绘图测试: RECT(15,47)-(224,80),画矩形. MOV R4,#15 ; MOV R5,#47 MOV R6,#224 MOV R7,#80 MOV R1,#1 CALL RECT CALL EXDELAY ;延时约600mS ;4.绘图测试: POINT(15,85),画点. MOV XPOS,#15 ; MOV YPOS,#85 MOV R1,#1 CALL POINT CALL EXDELAY ;延时约600mS ;5.绘图测试: LINE(15,85)-(119,120),画线. MOV R4,#15 ; MOV R5,#85 MOV R6,#119 ; MOV R7,#120 MOV R1,#1 CALL LINE CALL EXDELAY ;延时约600mS ;6.绘图测试: LINETO(224,85),画线. MOV R6,#224 ; MOV R7,#85 MOV R1,#1 CALL LINETO CALL EXDELAY ;延时约600mS ;7.绘图测试: LINETO(15,85),画线. MOV R6,#15 ; MOV R7,#85 MOV R1,#1 CALL LINETO CALL EXDELAY ;延时约600mS ;8.全屏测试: 所有坐标点全部显示. MOV A,#0FFH ;全显 CALL LCDFILL CALL EXDELAY ;延时约600mS RET EXDELAY: ;示例延时子程序 MOV R2,#60 ;延时约1S EDY_PA: MOV R1,#100 EDY_PB: MOV R0,#49 DJNZ R0,$ DJNZ R1,EDY_PB DJNZ R2,EDY_PA RET ;------------------------------------------------------------------------------- ;以下PUTCHAR为字符对象的基本子程序,PUTSTR为字符对象的扩充子程序,GETSTRCHAR, ;GETCHINESECODE,GETCHINESECODECMP,GETENGLISHCODE为字符对象的辅助子程序. ;------------------------------------------------------------------------------- ;子程序名称:PUTCHAR(A,B). ;功能:写单个字符点阵,若B>127且A>127 表示为中文字符 此时中文字符码为A/B;否则为西 ; 文字符A. ;输入:A/B表示中文字符码 或 A表示ASCII西文字符码. ;输出:. ;影响:R0,R1,R2,R3,R4,R5,R6,R7,A,B. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- PUTCHAR: ;定位写字符子程序 PUSH DPL PUSH DPH JNB ACC.7,PSR_LBY JNB B.7,PSR_LBY ;CHINESE: CALL GETCHINESECODEPOS ;定位中文字库位置 MOV R6,#CHINESECHARSIZE ;写中文字符点阵 MOV R7,#CHINESECHARSIZE CALL PUTSIZEIMAGE JMP PSR_LBX PSR_LBY: ;ENGLISH: CALL GETENGLISHCODEPOS ;定位西文字库位置 MOV R6,#ENGLISHCHARSIZE ;写西文字符点阵 MOV R7,#CHINESECHARSIZE CALL PUTSIZEIMAGE PSR_LBX: POP DPH POP DPL RET ;------------------------------------------------------------------------------- ;子程序名称:PUTSTR(*S). ;功能:写字符串点阵,若*S=0 表示字符串结束. ;输入:*S. ;输出:. ;影响:R0,R1,R2,R3,R4,R5,R6,R7,A,B. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- PUTSTR: ;显示字符串子程序,字符码为0时退出 CALL GETSTRCHAR JZ PSR_LAX CALL PUTCHAR JMP PUTSTR PSR_LAX: RET ;------------------------------------------------------------------------------- ;子程序名称:GETSTRCHAR(*S). ;功能:读单个字符串字符代码,本子程序仅供PUTSTR使用,若*S<128 表示字符为ASCII码, ; A=*S后退出;否则表示为中文汉字代码,B=*S后,再读一个字符置入A中. ;输入:*S(DPTR). ;输出:. ;影响:R0,R1,R2,R3,R4,R5,R6,R7,A,B. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- GETSTRCHAR: ;字符串中取字符码子程序 GSC_PA: CLR A MOVC A,@A+DPTR INC DPTR JNB ACC.7,GSC_LAX MOV B,A CLR A MOVC A,@A+DPTR INC DPTR GSC_LAX: RET ;------------------------------------------------------------------------------- ;子程序名称:GETCHINESECODEPOS(A,B). ;功能:根据当前中文字符码查表后计算得到当前中文字符码的字库点阵位置. ;输入:当前中文字符码=A/B[L/H]. ;输出:DPTR=*S,R0/R1=A/B. ;影响:R0,R2,R3,R4,R5,R6,R7,A,B. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- GETCHINESECODEPOS: ;根据当前中文字符码设置字库点阵位置子程序 MOV R0,A ;当前字符码置入[R0/R1] MOV R1,B ; MOV R2,#00H ;小值[R2/R3]置0 MOV R3,#00H ; MOV R4,#(CHINESECHARNUMBER-1)%256;大值[R4/R5]置为最后一个位置 MOV R5,#(CHINESECHARNUMBER-1)/256; ;折半查找搜索当前值 GCI_PA: CLR C ;MAX-MIN<->2 MOV A,R4 SUBB A,R2 MOV B,A MOV A,R5 SUBB A,R3 CLR C XCH A,B SUBB A,#2 MOV A,B SUBB A,#0 ; JNC GCI_LAX ;MAX-MIN>=2 ;MAX-MIN<2 MOV A,R2 ;MID=MIN MOV R6,A MOV A,R3 MOV R7,A CALL GETCHINESECODECMP ;MIDCODE<->CURCODE JZ GCI_PAX ;MIDCODE=CURCODE,搜索完成 MOV A,R4 ;MID=MAX MOV R6,A MOV A,R5 MOV R7,A CALL GETCHINESECODECMP ;MIDCODE<->CURCODE JZ GCI_PAX ;MIDCODE=CURCODE,搜索完成 NOP ;CURCODE字符不在字库表中 MOV R6,#00H ;用户可在此设置断点,若程序执行到此 MOV R7,#00H ;请重新生成包含该字符字库文件 JMP GCI_PAX GCI_LAX: MOV A,R4 ;MID=(MIN+MAX)/2 ADD A,R2 MOV R6,A MOV A,R5 ADDC A,R3 RRC A MOV R7,A MOV A,R6 RRC A MOV R6,A ; CALL GETCHINESECODECMP ;MIDCODE<->CURCODE JZ GCI_PAX ;MIDCODE=CURCODE,搜索完成 JC GCI_LBY ;MIDCODECURCODE CLR C ;MAX=MID-1 MOV A,R6 SUBB A,#1 MOV R4,A MOV A,R7 SUBB A,#0 MOV R5,A ; JMP GCI_LBX GCI_LBY: ;MIDCODECURCODE SUBB A,R0 XCH A,B SUBB A,R1 ORL A,B RET ;------------------------------------------------------------------------------- ;子程序名称:GETENGLISHCODEPOS(A). ;功能:根据当前ASCII字符码查表后计算得到当前ASCII字符码的字库点阵位置. ;输入:当前ASCII字符码=A. ;输出:DPTR=*S. ;影响:R0,R2,R3,R4,R5,R6,R7,A,B. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- GETENGLISHCODEPOS: ;根据当前ASCII字符码设置字库点阵位置子程序 MOV R0,A ;当前字符码置入[R0] MOV R2,#00H ;MIN[R2]置0 MOV R4,#ENGLISHCHARNUMBER-1 ;MAX[R4]置为最后一个位置 ;折半查找搜索当前值 GEI_PA: CLR C ;MAX-MIN<->2 MOV A,R4 SUBB A,R2 SUBB A,#2 JNC GEI_LAX ;MAX-MIN>=2 ;MAX-MIN<2 MOV DPTR,#ENGLISHCODETAB ;A=MIDCODE MOV A,R2 ;MID=MIN MOV R6,A MOVC A,@A+DPTR ;MIDCODE<->CURCODE XRL A,R0 JZ GEI_PAX ;MIDCODE=CURCODE,搜索完成 MOV A,R4 ;MID=MAX MOV R6,A MOVC A,@A+DPTR ;MIDCODE<->CURCODE XRL A,R0 JZ GEI_PAX ;MIDCODE=CURCODE,搜索完成 NOP ;CURCODE字符不在字库表中 MOV R6,#00H ;用户可在此设置断点,若程序执行到此 ;请重新生成包含该字符字库文件 JMP GEI_PAX GEI_LAX: MOV A,R4 ;MID[R6]=(MIN+MAX)/2 ADD A,R2 RRC A MOV R6,A ; MOV DPTR,#ENGLISHCODETAB ;A=MIDCODE MOV A,R6 MOVC A,@A+DPTR ; CLR C ;MIDCODE<->CURCODE SUBB A,R0 JZ GEI_PAX ;MIDCODE=CURCODE,搜索完成 JC GEI_LBY ;MIDCODECURCODE MOV A,R6 ;MAX=MID-1 MOV R4,A DEC R4 ; JMP GEI_LBX GEI_LBY: ;MIDCODE>(XPOS&7+1) ANL A,#07H ADD A,#1 MOV R0,A SETB C MOV A,#00H PIT_PA: RRC A DJNZ R0,PIT_PA MOV LCDBITMASK,A CJNE R1,#00H,PIT_LAY ;如果R1<>0,则R1=LCDBITMASK JMP PIT_LAX PIT_LAY:MOV R1,LCDBITMASK PIT_LAX: XRL LCDBITMASK,#0FFH ;LCDBITMASK=~LCDBITMASK CALL LCDPOS ;绘图地址指针定位 CALL LCDRD ;读数据到A ANL A,LCDBITMASK ;清待写点位置的数据 ORL A,R1 ;置待写点位置的数据 CALL LCDPOS ;绘图地址指针再定位 CALL LCDWD ;写待写点位置的数据 RET ;------------------------------------------------------------------------------- ;子程序名称:LINE(X0,Y0,X1,Y1,BITDATA) ;功能:按BITDATA的数据绘制(X0,Y0)-(X1,Y1)的直线 ;输入:BITDATA=R1,X0=R4,Y0=R5,X1=R6,Y1=R7 ;输出:XPOS=X1,YPOS=Y1 ;影响:R0,R1,R2,R3,A ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LINE: MOV A,R4 ;置当前操作的坐标=(R4,R5) MOV XPOS,A MOV A,R5 MOV YPOS,A ; CALL POINT ;写初始点(X0,Y0) CLR C ;R2=ABS(X1-X0) MOV A,R6 SUBB A,R4 JNC LXY_LAX CLR C MOV A,R4 SUBB A,R6 LXY_LAX:MOV R2,A ; CLR C ;R3=ABS(Y1-Y0) MOV A,R7 SUBB A,R5 JNC LXY_LBX CLR C MOV A,R5 SUBB A,R7 LXY_LBX:MOV R3,A ; CLR C SUBB A,R2 JNC LXY_LCY ;ABS(Y1-Y0)>=ABS(X1-X0) ;ABS(X1-X0)>ABS(Y1-Y0) MOV A,#8 ;R3(K)=R3*256/R2 MOV R0,A MOV B,#00H LXY_PB: CLR C MOV A,B RLC A MOV B,A MOV A,R3 RLC A MOV R3,A JC LXY_LDY SUBB A,R2 JC LXY_LDX LXY_LDY: CLR C MOV A,R3 SUBB A,R2 MOV R3,A INC B LXY_LDX:DJNZ R0,LXY_PB MOV A,B MOV R3,A ; MOV B,#00H ;B=0 为位置小数字节 LXY_PA: CLR C ;X1<->X0 MOV A,R6 SUBB A,R4 JC LXY_LGY ;X1=X0 INC XPOS JMP LXY_LGX LXY_LGY: ;X1Y0 MOV A,R7 SUBB A,R5 JC LXY_LFY ;Y1=Y0 MOV A,B ;YPOS=YPOS+K ADD A,R3 MOV B,A MOV A,YPOS ADDC A,#00H MOV YPOS,A ; JNB B.7,$+5 ;如果B>127,则四舍五入,YPOS加1 INC YPOS ; CALL POINT ;写点 CJNE R2,#01H,$+5 ;如果是最后一个点,则不减回四舍五入的数 AJMP LXY_LFX ; JNB B.7,$+5 ;如果B>127,则将四舍五入的数减掉,YPOS减1 DEC YPOS ; JMP LXY_LFX LXY_LFY: ;Y1127,则四舍五入,YPOS加1 INC YPOS ; CALL POINT ;写点 CJNE R2,#01H,$+5 ;如果是最后一个点,则不减回四舍五入的数 AJMP LXY_LFX ; JNB B.7,$+5 ;如果B>127,则将四舍五入的数减掉,YPOS减1 DEC YPOS ; LXY_LFX: DJNZ R2,LXY_PA ;按X方向循环写点 JMP LXY_LCX LXY_LCY: ;ABS(Y1-Y0)>=ABS(X1-X0) MOV A,R3 JZ LXY_LCX ;ABS(Y1-Y0)=0 直接退出 MOV A,#8 ;R2(K)=R2*256/R3 MOV R0,A MOV B,#00H LXY_PC: CLR C MOV A,B RLC A MOV B,A MOV A,R2 RLC A MOV R2,A JC LXY_LHY SUBB A,R3 JC LXY_LHX LXY_LHY: CLR C MOV A,R2 SUBB A,R3 MOV R2,A INC B LXY_LHX:DJNZ R0,LXY_PC MOV A,B MOV R2,A ; MOV B,#00H ;B=0 为位置小数字节 LXY_PD: CLR C ;Y1<->Y0 MOV A,R7 SUBB A,R5 JC LXY_LJY ;Y1=Y0 INC YPOS JMP LXY_LJX LXY_LJY: ;Y1X0 MOV A,R6 SUBB A,R4 JC LXY_LIY ;X1=X0 MOV A,B ;XPOS=XPOS+K ADD A,R2 MOV B,A MOV A,XPOS ADDC A,#00H MOV XPOS,A ; JNB B.7,$+5 ;如果B>127,则四舍五入,XPOS加1 INC XPOS ; CALL POINT ;写点 CJNE R3,#01H,$+5 ;如果是最后一个点,则不减回四舍五入的数 AJMP LXY_LIX ; JNB B.7,$+5 ;如果B>127,则将四舍五入的数减掉,XPOS减1 DEC XPOS ; JMP LXY_LIX LXY_LIY: ;X1127,则四舍五入,XPOS加1 INC XPOS ; CALL POINT ;写点 CJNE R3,#01H,$+5 ;如果是最后一个点,则不减回四舍五入的数 AJMP LXY_LIX ; JNB B.7,$+5 ;如果B>127,则将四舍五入的数减掉,XPOS减1 DEC XPOS ; LXY_LIX: DJNZ R3,LXY_PD LXY_LCX: RET ;------------------------------------------------------------------------------- ;子程序名称:LINETO(X1,Y1,BITDATA) ;功能:按BITDATA的数据绘制(XPOS,YPOS)-(X1,Y1)的直线 ;输入:BITDATA=A,X1=R6,Y1=R7 ;输出:XPOS=X1,YPOS=Y1,R4=初始点的XPOS,R5=初始点的YPOS ;影响:R0,R1,R2,R3,R4,R5,A ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LINETO: ;绘制(XPOS,YPOS)-(X1,Y1)的直线, MOV A,XPOS MOV R4,A MOV A,YPOS MOV R5,A CALL LINE RET ;------------------------------------------------------------------------------- ;子程序名称:RECT(X0,Y0,X1,Y1,BITDATA) ;功能:按BITDATA的数据绘制(X0,Y0)-(X1,Y1)的矩形 ;输入:BITDATA=R1,X0=R4,Y0=R5,X1=R6,Y1=R7 ;输出:XPOS=X1,YPOS=Y1 ;影响:R0,R1,R2,R3,A ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- RECT: ;绘制(X0,Y0)-(X1,Y1)的矩形 MOV A,R7 ; PUSH ACC ;STACK:Y1 MOV A,R5 MOV R7,A CALL LINE ;(X0,Y0)-(X1,Y0) POP ACC ;Y1 MOV R7,A MOV A,R4 PUSH ACC ;STACK:X0 MOV A,R6 MOV R4,A CALL LINE ;(X1,Y0)-(X1,Y1) POP ACC ;X0 MOV R6,A MOV A,R5 PUSH ACC ;STACK:Y0 MOV A,R7 MOV R5,A CALL LINE ;(X1,Y1)-(X0,Y1) POP ACC ;Y0 MOV R7,A MOV A,R4 PUSH ACC ;STACK:X1 MOV A,R6 MOV R4,A CALL LINE ;(X0,Y1)-(X0,Y0) POP ACC ;X1 MOV R6,A MOV A,R5 XCH A,R7 MOV R5,A ;(X0,Y0),(X1,Y1) RET ;------------------------------------------------------------------------------- ;以下PUTSIZEIMAGE为图形对象的基本子程序,PUTIMAGE为图形对象的扩充子程序 ;------------------------------------------------------------------------------- ;子程序名称:PUTSIZEIMAGE(XPOS,YPOS,XSIZE,YSIZE,*S). ;功能:在(XPOS,YPOS)位置绘制XSIZE列及YISZE行点阵的图形*S. ;输入:位置XPOS,YPOS;XSIZE=R6,YSIZE=R7,S=DPTR. ;输出:XPOS=XPOS+XSIZE;如果XPOS>=XDOTS 则XPOS=0,YPOS=YPOS+YSIZE. ;影响:R0,R1,R2,R3,R4,R5,R6,R7. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- PUTSIZEIMAGE: ;显示图形子程序 ;图形的大小,XSIZE=R6,YSIZE=R7 ;图形的大小循环变量LX=R4,LY=R5 ;图形数据1变量A1=R1,图形数据2变量A2=R2 MOV A,XPOS ;第一列数据的BIT位移变量K=R3 ANL A,#07H ;K=XPOS&0X7 MOV R3,A ; MOV A,R6 ;XSIZE+=K ADD A,R3 MOV R6,A ; MOV R5,#00H ;LY=0 CLR C ;DPTR到前一个字节 MOV A,DPL SUBB A,#1 MOV DPL,A MOV A,DPH SUBB A,#0 MOV DPH,A ; PIM_PA: PUSH XPOS ;保存XPOS位置,准备进行一行数据的处理 MOV A,R3 ;LX=K MOV R4,A MOV R1,#00H ;A1=0 PIM_PB: ;写一行图形数据 CLR A ;A1=*S MOVC A,@A+DPTR MOV R1,A INC DPTR ;S++ CLR A ;A2=*S MOVC A,@A+DPTR MOV R2,A MOV A,CHARIMAGEREVERSE ; JZ PIM_LFX ; MOV A,R1 ;反显 XRL A,#0FFH ;A1=~A1 MOV R1,A MOV A,R2 ;A2=~A2 XRL A,#0FFH MOV R2,A PIM_LFX: MOV A,R3 ;如果K=0 则不进行数据处理 JZ PIM_LAY PUSH ACC ;保存K的值 PIM_PC: ;按K的位置将数据进行移位对齐处理 CLR C MOV A,R1 ;移位处理后,A2的数据为有效字节 RRC A MOV R1,A MOV A,R2 RRC A MOV R2,A DJNZ R3,PIM_PC POP ACC ;恢复K的值 MOV R3,A JMP PIM_LAX ;需读液晶显示控制器中RAM的值 PIM_LAY: CLR C ;XSIZE与LX比较 MOV A,R6 SUBB A,R4 CLR C SUBB A,#8 JC PIM_LAX ;XSIZE<(LX+8) LX+8变量超出范围 ;XSIZE>=(LX+8):K=0且为中间字节,不需读原来 ;液晶显示控制器中的数据,直接送数 CALL LCDPOS ;绘图地址指针定位 MOV A,R4 ;LX+=8 ADD A,#08H MOV R4,A MOV A,XPOS ;XPOS+=8 ADD A,#08H MOV XPOS,A MOV A,R2 JMP PIM_LEX PIM_LAX: CALL LCDPOS ;绘图地址指针定位 CALL LCDRD ; MOV R1,A ;A1=LCDRD() CALL LCDPOS ;绘图地址指针定位 MOV LCDBITMASK,#0FFH ;LCDBITMASK初始值为0FFH MOV A,R4 ;LX+=8 ADD A,#08H MOV R4,A MOV A,XPOS ;XPOS+=8 ADD A,#08H MOV XPOS,A MOV A,R4 ;LX&7是否为零,表示左边界是否为字节字位的 ANL A,#07H ;开始 JZ PIM_LBX ;LX&7=0 表示左边界是字节字位的开始 ;LX&7=1 表示左边界不是字节字位的开始 MOV R0,A ;LCDMASK>>(LX&7) PIM_PD: CLR C MOV A,LCDBITMASK RRC A MOV LCDBITMASK,A DEC R4 ;LX-=K DEC XPOS ;XPOS-=K DJNZ R0,PIM_PD PIM_LBX: MOV R0,#0FFH ;R0=RIGHTMASK[P] PIM_PE: CLR C ;XSIZE与LX比较 MOV A,R6 SUBB A,R4 JNC PIM_PEX ;XSIZE>=LX ;XSIZELX PIM_PBX: MOV A,R3 JZ PIM_LCX ;K=0 DPTR不处理 MOV A,R6 ;R0=P ANL A,#07H JZ PIM_LCX ;P=0 DPTR不处理 MOV R0,A CLR C ;K-P MOV A,R3 SUBB A,R0 JC PIM_LCX ;K

=P CLR C ;DPTR到前一个字节 MOV A,DPL SUBB A,#1 MOV DPL,A MOV A,DPH SUBB A,#0 MOV DPH,A PIM_LCX: POP XPOS ;恢复行首位置 INC YPOS ;位置转下一行 INC R5 ;LY++ MOV A,R7 ;YSIZE与LY比较 XRL A,R5 JZ PIM_PAX ;YSIZE=LY JMP PIM_PA ;YSIZE<>LY PIM_PAX: MOV A,XPOS ;XPOS-K+XSIZE ANL A,#0F8H ; ADD A,R6 JC PIM_LDY ;超出范围 SUBB A,#XDOTS JNC PIM_LDY ;超出显示范围 MOV A,XPOS ;XPOS-K+XSIZE ANL A,#0F8H ; ADD A,R6 MOV XPOS,A CLR C ;恢复原YPOS位置 MOV A,YPOS SUBB A,R7 MOV YPOS,A JMP PIM_LDX PIM_LDY: MOV XPOS,#0 ;XPOS=0,YPOS=原YPOS+R5 PIM_LDX: RET ;------------------------------------------------------------------------------- ;子程序名称:PUTIMAGE(XPOS,YPOS,*S). ;功能:在(XPOS,YPOS)位置绘制XSIZE列及YISZE行点阵的图形*(S+2). ;输入:位置XPOS,YPOS;XSIZE=*S,YSIZE=*(S+1),S=DPTR+2. ;输出:XPOS=XPOS+XSIZE;如果XPOS>=XDOTS 则XPOS=0,YPOS=YPOS+YSIZE. ;影响:R0,R1,R2,R3,R4,R5,R6,R7. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- PUTIMAGE: ;显示图象子程序,在(XPOS,YPOS)位置显示一幅 ;图象,图象地址指针为DPTR, ;第2个字节为Y方向点阵数,随后的数据为图象 ;点阵数据. CLR A ;图象数据的第1个字节为X方向点阵数 MOVC A,@A+DPTR ;XSIZE=*S MOV R6,A ; INC DPTR ;S++ CLR A ;图象数据的第2个字节为Y方向点阵数 MOVC A,@A+DPTR ;YSIZE=*S MOV R7,A ; INC DPTR ;S++ CALL PUTSIZEIMAGE ;绘制图形 RET ;------------------------------------------------------------------------------- ;以下LCDRESET,LCDPOS,LCDFILL为T6963型硬件接口的240128液晶显示模块的基本子程序 ;------------------------------------------------------------------------------- ;子程序名称:LCDRESET() ;功能:液晶显示控制器初始化 ;输入:无 ;输出:无 ;影响:R0,R2,R3,A ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDRESET: ;液晶显示控制器初始化子程序 MOV A,#80H ;OR MODE CALL LCDWC ; MOV A,#98H ;图形模式 CALL LCDWC ; MOV R2,#00H ;设置图形空间首地址 MOV R3,#00H ;图形空间从RAM=0开始 MOV A,#42H CALL LCDWC3 ; MOV R2,#30 ;设置每行字节数 MOV R3,#00H ;每行字节数30个共240点 MOV A,#43H CALL LCDWC3 ; RET ;------------------------------------------------------------------------------- ;子程序名称:LCDPOS(XPOS,YPOS). ;功能:设置(XPOS,YPOS)位置对应的内部RAM地址. ;输入:位置XPOS,YPOS. ;输出:无 ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDPOS: ;设置(XPOS,YPOS)内部RAM地址的子程序 PUSH ACC ;保护现场ACC,B,R2,R3 PUSH B MOV A,R2 PUSH ACC MOV A,R3 PUSH ACC ; MOV A,XPOS ;R0=XPOS/8 ANL A,#0F8H RR A RR A RR A MOV R0,A ; MOV A,YPOS ;R2R3=30*YPOS+(XPOS/8) MOV B,#30 MUL AB ADD A,R0 MOV R2,A MOV A,B ADDC A,#0 MOV R3,A ; MOV A,#24H CALL LCDWC3 ;写内部RAM地址 POP ACC ;恢复现场ACC,B,R2,R3 MOV R3,A POP ACC MOV R2,A POP B POP ACC ; RET ;------------------------------------------------------------------------------- ;子程序名称:LCDFILL(A). ;功能:整屏显示A表示的字节数据. ;输入:A. ;输出:B=A. ;影响:R0,R2,R3,R4,R5,A,B. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDFILL: ;整屏显示A代表的字节数据子程序 MOV B,A MOV XPOS,#0 ;第1列位置 MOV YPOS,#0 ;第1行位置 MOV R2,#0 ;设置内部RAM地址为0 MOV R3,#0 MOV A,#24H CALL LCDWC3 MOV R4,#128 ;128行 LFL_PA: MOV R5,#30 ;30个字节数据共240列 LFL_PB: MOV A,B CALL LCDWD DJNZ R5,LFL_PB ; DJNZ R4,LFL_PA ; RET ;------------------------------------------------------------------------------- ;以下LCDWD,LCDRD,LCDWC,LCDWC2,LCDWC3为T6963C型硬件接口[MCS51总线接口方式]的 ; 基本子程序;LCDWDATA,LCDRDATA,LCDWAITIDLE为内部子程序. ;------------------------------------------------------------------------------- ;子程序名称:LCDWD(A). ;功能:向液晶显示控制器写图形数据. ;输入:A=图形数据. ;输出:无. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWD: ;送图形数据子程序 PUSH ACC XCH A,R2 PUSH ACC MOV A,#0C0H CALL LCDWC2 POP ACC MOV R2,A POP ACC RET ;------------------------------------------------------------------------------- ;子程序名称:LCDRD(). ;功能:从液晶显示控制器中读图形数据. ;输入:无. ;输出:A. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDRD: ;读图形数据子程序 MOV A,#0C1H CALL LCDWC CALL LCDRDATA RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWC3(R2,R3,A). ;功能:向液晶显示控制器送带二个参数的指令. ;输入:A=指令码,R2=指令参数1,R2=指令参数2. ;输出:无. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWC3: ;送3字节指令子程序 PUSH ACC ;指令参数R2,R3,指令码A MOV A,R2 CALL LCDWDATA MOV A,R3 CALL LCDWDATA POP ACC CALL LCDWC RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWC2(R2,A). ;功能:向液晶显示控制器送带一个参数的指令. ;输入:A=指令码,R2=指令参数. ;输出:无. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWC2: ;送2字节指令子程序 PUSH ACC ;指令参数R2,指令码A MOV A,R2 CALL LCDWDATA POP ACC CALL LCDWC RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWC(A). ;功能:向液晶显示控制器送指令. ;输入:A. ;输出:无. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWC: ;送指令子程序 PUSH DPH PUSH DPL CALL LCDWAITIDLE MOV DPTR,#LCDCADDR MOVX @DPTR,A POP DPL POP DPH RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWDATA(A). ;功能:向液晶显示控制器送数据. ;输入:A. ;输出:无. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWDATA: ;送数据子程序 PUSH DPH PUSH DPL CALL LCDWAITIDLE MOV DPTR,#LCDDADDR MOVX @DPTR,A POP DPL POP DPH RET ;------------------------------------------------------------------------------- ;子程序名称:LCDRDATA(). ;功能:从液晶显示控制器中读数据. ;输入:无. ;输出:A. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDRDATA: ;读数据子程序 PUSH DPH PUSH DPL CALL LCDWAITIDLE MOV DPTR,#LCDDADDR MOVX A,@DPTR POP DPL POP DPH RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWAITIDLE(). ;功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲. ;输入:无. ;输出:无. ;影响:R0. ;修改日期:2009.8.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWAITIDLE: ;忙检测子程序 PUSH ACC MOV R0,#200 WTI_PA: MOV DPTR,#LCDCADDR ;读当前控制器状态 MOVX A,@DPTR ANL A,#03H ;D0D1=11 空闲退出 XRL A,#03H JZ WTI_LAX DJNZ R0,WTI_PA ;D0D1<>00 表示LCD控制器忙,则继续检测 ;若忙时间超过1000uS,则表示LCD控制器硬件 ;出错,退出检测 NOP ;用户可在此设置错误代码,或仿真时设置断点 JMP WTI_PA WTI_LAX: POP ACC RET