LCD1602汇编程序.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流LCD1602汇编程序.精品文档.LCD1602汇编程序;* 描述: LCD1602 滚动显示 *;* 显示方式: *;* 1、从左到右逐字显示,闪动二次,清屏。 *;* 2、再从右到左逐字显示,闪动二次,清屏。 *;* 3、周期性地重复上述显示方式。 *LCD_RS EQU P2.0LCD_RW EQU P2.1LCD_EN EQU P2.2ORG 0000HAJMP MAINORG 0030HMAIN:MOV SP,#60HMOV R4,#02H ;设置闪烁次数ACALL LCD_INITMAIN1:ACALL LCDSET1MOV DPTR,#CHAR1ACALL WRITE1 ;MOV A,#0C0H ;显示第二行左边第一位位置ACALL LCD_CMDMOV DPTR,#CHAR2 ;显示ACALL WRITE1ACALL DELAY4 ;延时ACALL DELAY4ACALL SHAN ;闪烁两次ACALL LCDSET2MOV DPTR,#CHAR3 ;ACALL WRITE1MOV A,#0C0H ;显示第二行右边第一位位置ACALL LCD_CMDMOV DPTR,#CHAR4 ;显示ACALL WRITE1ACALL DELAY4 ;延时ACALL DELAY4ACALL SHAN ;闪烁两次ACALL MAIN1;LCD初始化设定子程序LCD_INIT:ACALL DELAY5MS ;延时15MSACALL DELAY5MS ;等待LCD 电源稳定ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#08H ;显示关ACALL LCD_CMD ;进行LCD 忙检测MOV A,#01H ;清除屏幕ACALL LCD_CMD ;进行LCD忙检测MOV A,#06H ;移动光标ACALL LCD_CMD ;进行LCD 忙检测MOV A,#0CH ;显示开,关光标ACALL LCD_CMD ;进行LCD 忙检测RET;显示位置与移动光标设定LCDSET1:MOV A,#01H ;清除屏幕ACALL LCD_CMDACALL DELAY5MSMOV A,#06H ;移动光标(光标加1)ACALL LCD_CMDACALL DELAY5MSMOV A,#80H ;显示第一行左边第一位位置ACALL LCD_CMDACALL DELAY5MSRETLCDSET2:MOV A,#01H ;清除屏幕ACALL LCD_CMDACALL DELAY5MSMOV A,#06H ;移动光标(光标减1)ACALL LCD_CMDACALL DELAY5MSMOV A,#80H ;显示第一行右边第一位位置ACALL LCD_CMDACALL DELAY5MSRET;写指令数据到LCD;RS=L,RW=L,D0-D7=指令码,E=高脉冲LCD_CMD:ACALL CHECKBUSYLCD_CMD_NC:CLR LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET; 发送字符串子程序WRITE1:MOV R0,#16WRITE0:CLR AMOVC A,A+DPTRINC DPTRACALL LCD_WDATACALL DELAY ;加延时形成滚动效果DJNZ R0,WRITE0RET;写显示数据到LCD;RS=H,RW=L,D0-D7=数据,E=高脉冲LCD_WDATA:ACALL CHECKBUSYSETB LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;检测LCD 控制器忙状态;读数据;RS=L,RW=H,E=H,输出:D0-D7=数据CHECKBUSY:PUSH ACCMOV P0,#0FFHCLR LCD_RSSETB LCD_RWSETB LCD_ENBUSYLOOP:NOPJB P0.7,BUSYLOOPCLR LCD_ENPOP ACCRET;闪烁子程序SHAN:MOV A,#08H ;关闭显示ACALL LCD_CMDACALL DELAY4MOV A,#0CH ;开显示,关闭光标ACALL LCD_CMDACALL DELAY4DJNZ R4,SHANMOV R4,#02H ;设置闪烁次数RET;延时120MS 子程序;发送字符串时使用DELAY:MOV R7,#240DL1: MOV R6,#250DL2: DJNZ R6,DL2DJNZ R7,DL1RET;延时800MS 子程序;闪烁时使用DELAY4:MOV R0,#40DL3: MOV R1,#100DL4: MOV R2,#100DL5: DJNZ R2,DL5DJNZ R1,DL4DJNZ R0,DL3RET;延时5MS子程序;LCD初始化使用DELAY5MS:MOV R1,#10DL6: MOV R2,#249DL7: DJNZ R2,DL7DJNZ R1,DL6RET;延时1MS子程序DELAY1MS:MOV R6,#14H ;20DL8: MOV R7,#19H ;25DL9: DJNZ R7,DL9DJNZ R6,DL8RETCHAR1:DB "Welcome to Cras-"CHAR2:DB " yBoye WorkGroup"CHAR3:DB " QQ: 15910380 "CHAR4:DB "TEL: 13991316679"END12864汇编程序X EQU 26H ;LCD 地址变量 RS EQU P2.0 RW EQU P2.1 EN EQU P2.2 PSB EQU P2.3 RST EQU P2.5 ORG 0000H JMP MAIN ORG 0003H ;外部中断INT0入口地址MAIN: MOV SP,#40H MOV A,#00H MOV R0,#20HLOOP0: MOV R0,A ;20H-26H清零 INC R0 CJNE R0,#27H,LOOP0 MOV IE,#81H ;允许总中断中断,使能 INT0 外部中断 MOV TCON,#01H ;触发方式为脉冲负边沿触发 SETB RST NOP SETB PSB ;8位数据,并口 CALL SET_LCD ;初始化TS12864m CALL MENU1 CALL MENU2 CALL MENU3 CALL MENU4LOOP1: MOV A,22H CJNE A,#40H,LOOP2 LOOP2: CJNE A,#04H,LOOP3 LOOP3: JMP LOOP1; LCD 初始化设置SET_LCD: CLR EN MOV A,#34H ;34H-扩充指令操作 CALL WCOM MOV A,#30H ;30H-基本指令操作 CALL WCOM MOV A,#0CH ;开显示,关光标, CALL WCOM MOV A,#01H ;清除 LCM 显示屏 CALL WCOM RET;在 LCM 各行显示信息字符LCD_SHOW: CJNE A,#1,LINE2 ;判断是否为第一行 LINE1: MOV A,#80H ;设置 LCD 的第一行地址 CALL WCOM ;写入命令 CALL CLR_LINE ;清除该行字符数据 MOV A,#80H ;设置 LCD 的第一行地址 CALL WCOM ;写入命令 JMP FILL LINE2: CJNE A,#2,LINE3 ;判断是否为第三行 MOV A,#090H ;设置 LCD 的第三行地址 CALL WCOM ;写入命令 CALL CLR_LINE ;清除该行字符数据 MOV A,#090H ;设置 LCD 的第三行地址 CALL WCOM JMP FILL LINE3: CJNE A,#3,LINE4 ;判断是否为第三行 MOV A,#088H ;设置 LCD 的第三行地址 CALL WCOM ;写入命令 CALL CLR_LINE ;清除该行字符数据 MOV A,#088H ;设置 LCD 的第三行地址 CALL WCOM JMP FILL LINE4: CJNE A,#4,LINE5 ;判断是否为第三行 MOV A,#098H ;设置 LCD 的第三行地址 CALL WCOM ;写入命令 CALL CLR_LINE ;清除该行字符数据 MOV A,#098H ;设置 LCD 的第三行地址 CALL WCOM FILL: CLR A ;填入字符 MOVC A,A+DPTR ;由消息区取出字符 CJNE A,#0,LC1 ;判断是否为结束码 LINE5: RET LC1: CALL WDATA ;写入数据 INC DPTR ;指针加1 JMP FILL ;继续填入字符 RET;清除该行 LCM 的字符CLR_LINE: MOV R0,#16 CL1: MOV A,#' ' CALL WDATA DJNZ R0,CL1 RET;LCM 显示工作菜单信息MENU1: MOV DPTR,#MENU1A MOV A,#1 ;在第一行显示信息 CALL LCD_SHOW RETMENU1A: DB "MUC 控制GPRS模块",0MENU2: MOV DPTR,#MENU2A MOV A,#2 ;在第二行显示信息 CALL LCD_SHOW RETMENU2A: DB "TEL:13991316679",0MENU3: MOV DPTR,#MENU3A MOV A,#3 ;在第三行显示信息 CALL LCD_SHOW RETMENU3A: DB "方案设计: 龚 伟",0MENU4: MOV DPTR,#MENU4A MOV A,#4 ;在第四行显示信息 CALL LCD_SHOW RETMENU4A: DB "程序编写: 靳 鹏",0; 写指令使能子程序;RS=L,RW=L,D0-D7=指令码,E=高脉冲WCOM: MOV P0,A CLR RS CLR RW SETB EN CALL DELAY0 CLR EN RET;写数据使能子程序;RS=H,RW=L,D0-D7=数据,E=高脉冲WDATA: MOV P0,A SETB RS CLR RW SETB EN CALL DELAY0 CLR EN RETDELAY0: MOV R7,#250 ;延时500微秒 DJNZ R7,$ RET END