小型液晶屏显示模块汇编语言程序注释
- 格式:doc
- 大小:49.50 KB
- 文档页数:8
1602汇编程序,刃单片机汇编程序,仅需修改引脚定义即可。
晶振大小12M,程序测试完全正确。
内部包含写数据、写命令(包括读忙和不读忙、初始化等子函数。
调用时先给LCD_DAT赋值,给出需要写入的数据或命令,然后调用。
;端口引脚定义区LCD_RS BIT P2.4 ;1602数据命令选择端口LCD_RW BIT P2.5 ;1602 读写选择端口LCD_EN BIT P2.6 ;1602 使能端口LCD_DATA EQU P0 ;1602 数据端口;变量声明区ALL_FLAG EQU 20H ;标志位LCD_FLAG EQU AL「FLAG.7 ;1602 读忙标志位LCD_DAT EQU 30H ;1602 数据命令字DELAYED EQU 31H 涎时字广★★★****★★★★★★★*★*★★**★*★★★*★*★★★★★*★*★*★1602读命令函数,高位存至LCD_LAG中★★★★★★★★★★★★★★★★★★★★★if******************* /LCD_R_DATA:MOV LCD_DATA,#OFFHSETB L CD RWNOPSETB L CD_ENNOPMOV Acc丄CD_DATAMOV C,Acc.7MOV LCD_FLAG,CCLR LCD_ENNOPJB LCD_FLAG ,L CD_BUSYRET/★****★***★*★***********************★*★*★*1602写数据函数,数据存在LCD_DAT★ if*************************************** /LCD_W_DATA:LCALLLCD_R_DATASETB L CD_RSNOPMOV LCD_DATA丄CD_DATSETB L CD_ENNOPCLR LCD_ENRET/* 1602LCD_DAT,检测忙信号LCD_W_CMD:LCALLLCD_R_DATACLR LCD_RSCLR LCD_RWNOPMOV LCD_DATA, LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET /* 1602 与命令函数,命令存在LCD_DAT,不检测忙信号LCD CMD: 才***********才********************才才*****7写命令函数,命令存F在CLR LCD RWNOPMOV LCD_DATA, LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET/***************************************** 4 QCC初始化函数★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/ LCD INIT:MOV DELAYED,#30LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD CMDMOV DELAYED,#®LCALL DELAY_MSMOV LCD_DAT,#038HLCALL LCD_W_CMDMOV LCD_DAT,#08HLCALL LCD_W_CMDMOV LCD_DAT,#01HLCALL LCD_W_CMDMOV LCD_DAT,#06HLCALL LCD_W_CMDMOV LCD_DAT,#OCHLCALL LCD_W_CMDRET****************************************延时函数,延时时间为DELAYEDP.5毫秒0-100毫秒的延时***************************************** /DELAY_MS:MOV R7QELAYEDD1: MOV R6,#0F8HD2: DJNZ R6,D2DJNZ R7,D1RET广****************************************延时函数,延时时间为DELAYED*2微秒0-500微秒的延时***************************************** /DELAY_US:MOV R乙ADU1:DJNZ R7,DU1RET。
;RMDZ.ASMCON8279 EQU 0492H ;定义CON8279为地址0492HDAT8279 EQU 0490H ;定义DAT8279为地址0490HCS0809 EQU 04D0H ;定义CS0809为地址04D0HASSUME CS:CODE;将CS段寄存器设置为存放CODE逻辑段的段地址CODE SEGMENT PUBLIC ;定义CODE逻辑段,组合类型为PUBLIC ORG 100H ;规定程序的起始地址为100HSTART:MOV DX,CS0809 ;将CS0809的地址04D0H装入DX寄存器MOV AL,34H ;将34H装入AL寄存器OUT DX,AL ;向地址04D0H输出值34H以进行初始化WAIT:MOV CX,0010H ;将循环次数0010H装入CX寄存器WAIT1:NOPNOP ;空操作LOOP WAIT1 ;循环执行WAIT1次数为0010H次MOV DX,CS0809 ;将CS0809的地址04D0H装入DX寄存器IN AL,DX ;从地址04D0H读出数据存至AL寄存器MOV BL,AL ;将AL寄存器的数据装入BL寄存器MOV DI, OFFSET V ALUETAB ;取变量V ALUETAB的偏移地址装入DI寄存器MOV BH, 00H ;使BH寄存器的值清零COMP1:MOV AL, CS:[DI] ;取变量V ALUETAB的第一个操作数存入AL寄存器CMP AL, BL ;比较AL和BL寄存器中值的大小JBE PRO1 ;若AL寄存器的值(V ALUETAB的值)不高于BL寄存器的;值(热敏电阻模块输出值),则跳转到PRO1JMP PRO2 ;否则跳转至PRO2PRO1:INC BH ;BH寄存器的值加一INC DI ;DI寄存器的值加一以指向V ALUETAB的下一个操作数JMP COMP1 ;跳转回COMP1PRO2:MOV AL, CS:[DI] ;将V ALUETAB中满足上述条件的此操作数存入AL寄存器MOV CL, AL ;将AL寄存器的数据装入CL寄存器DEC BH ;BH寄存器的值减一,此时BH寄存器的值就是所测温度十位数;上的数字DEC DI ;DI寄存器的值减一以指向V ALUETAB的前一个操作数MOV AL, CS:[DI] ;将此操作数存入AL寄存器SUB CL, AL ;CL寄存器的值减去AL寄存器的值MOV AL, CS:[DI] ;同上,将V ALUETAB的操作数存入AL寄存器SUB BL, AL ;BL寄存器的值减去AL寄存器的值MOV AL, 0AH ;将0AH装入AL寄存器MUL BL ;BL寄存器的值乘以0AH并存入AX寄存器DIV CL ;AX寄存器的值除以CL寄存器的值,商存入AL寄存器MOV BL, AL ;把商装入BL寄存器,经上述换算后,此时BL寄存器的值;就是所测温度个位数上的数字;========数码管显示模块========DISP:MOV DI,OFFSET SEGCOD ;取变量SEGCOD的偏移地址存入DI寄存器MOV AX,08H ;将08H装入AX寄存器MOV DX, CON8279 ;将地址0492H装入DX寄存器OUT DX, AX ;向地址0492H输出值08H进行数码管显示模块的初始化MOV AX, 90H ;将90H装入AX寄存器MOV DX, CON8279 ;将地址0492H装入DX寄存器OUT DX, AX ;向地址0492H输出值90H进行数码管显示模块的初始化MOV DX, DAT8279 ;将地址0490H装入DX寄存器MOV AL, BH ;将BH寄存器的值(温度十位数)装入AL寄存器MOV AH, 00H ;AH寄存器的值清零ADD DI, AX ;令DI寄存器的值加上AX寄存器的值,此时DI指向;SEGCOD中显示此温度十位数的数字的操作数MOV AL,CS:[DI] ;将DI指向的SEGCOD中的操作数存入AL寄存器OUT DX,AL ;向地址0490H输出AL寄存器的值使数码管显示相应的数字NOPNOP ;空操作MOV DI,OFFSET SEGCOD ;取变量SEGCOD的偏移地址存入DI寄存器MOV AL, BL ;将BL寄存器的值(温度个位数)装入AL寄存器MOV AH, 00H ;AH寄存器的值清零ADD DI, AX ;令DI寄存器的值加上AX寄存器的值,此时DI指向;SEGCOD中显示此温度个位数的数字的操作数MOV AL,CS:[DI] ;将DI指向的SEGCOD中的操作数存入AL寄存器OUT DX, AL ;向地址0490H输出AL寄存器的值使第二位数码管显示相应;的数字;=======数码管显示模块结束=======;=======LCD显示模块=======WRTAB: ;写TABLE变量MOV SI, OFFSET ASCIITAB;取变量ASCIITAB的偏移地址存入SI寄存器MOV DI, OFFSET TABLE ;取变量TABLE的偏移地址存入DI寄存器ADD DI, 1BH;DI寄存器的值加1BH,令DI指向TABLE中的第一个“?”MOV AL, BH ;将BH寄存器的值(温度十位数)装入AL寄存器MOV AH, 00H ;AH寄存器的值清零ADD SI, AX ;SI寄存器的值加AX寄存器的值,此时SI指向ASCIITAB;中表示此温度十位数的数字的ASCII码MOV AL, [SI] ;将SI指向的ASCIITAB中的ASCII码存入AL寄存器MOV [DI], AL ;将此ASCII码存入TABLE变量中的第一个“?”处MOV SI, OFFSET ASCIITAB ;取变量ASCIITAB的偏移地址存入SI寄存器ADD DI, 04H ;DI寄存器的值加04H,令DI指向TABLE中的第二个“?”MOV AL, BL ;将BL寄存器的值(温度个位数)装入AL寄存器MOV AH, 00H ;AH寄存器的值清零ADD SI, AX ;SI寄存器的值加AX寄存器的值,此时SI指向ASCIITAB;中表示此温度个位数的数字的ASCII码MOV AL, [SI] ;将SI指向的ASCIITAB中的ASCII码存入AL寄存器MOV [DI], AL ;将此ASCII码存入TABLE变量中的第二个“?”处DISPLCD: ;LCD显示MOV DX, 04A6H ;将地址04A6H装入DX寄存器MOV AX, 88H ;将88H装入AX寄存器OUT DX, AX ;向地址04A6H输出值88H进行LCD显示模块的初始化MOV AX, 70H ;将70H装入AX寄存器OUT DX, AX ;向地址04A6H输出值70H进行LCD显示模块的初始化MOV AL, 0F4H ;将0F4H装入AL寄存器CALL COMD ;调用COMD程序段CALL DELAY ;调用DELAY程序段START1:MOV SI,OFFSET TABLE ;取变量TABLE的偏移地址存入SI寄存器MOV CX, 36 ;由于TABLE中共有36个操作数,因此WR1需执行36次,;将循环次数36装入CX寄存器WR1:MOV DX, 04A4H ;将地址04A4H装入DX寄存器IN AX, DX ;读地址04A4H的值,存入AX寄存器AND AX, 80H ;将AX寄存器的值与80H进行与操作,目的是判断BUSY;是否为0JNZ WR1 ;若BUSY不为0,返回执行WR1,否则继续执行下面程序MOV AL, CS:[SI] ;将SI指向的TABLE中的操作数存入AL寄存器CALL COMD ;调用COMD程序段INC SI ;SI寄存器的值加一以指向TABLE中的下一个操作数LOOP WR1 ;循环执行WR1直至CX=0CALL DELAY ;调用DELAY程序段OK: JMP ALARM ;跳转至语音报警模块ALARM程序段DELAY: MOV CX,1000H ;DELAY程序段,将循环次数1000H存入CX寄存器DLYB: LOOP DLYB ;循环执行DL YB,次数为1000HRET ;过程返回指令COMD: ;COMD程序段MOV DX, 04A0H ;将地址04A0H装入DX寄存器OUT DX, AL ;向地址04A0H输出AL寄存器的值MOV DX, 04A6H ;将地址04A6H装入DX寄存器MOV AX, 71H ;将71H装入AX寄存器OUT DX, AX ;向地址04A6H输出AX寄存器的值,使REQ置位MON:MOV DX, 04A4H ;将地址04A4H装入DX寄存器IN AX, DX ;读地址04A4H的值,存入AX寄存器AND AX, 80H ;将AX寄存器的值与80H进行与操作,目的是判断BUSY;是否为1JZ MON ;若BUSY不为1,返回执行MON,否则继续执行下面程序MOV DX, 04A6H ;将地址04A6H装入DX寄存器MOV AX, 70H ;将70H装入AX寄存器OUT DX ,AX ;向地址04A6H输出AX寄存器的值,使REQ复位RET ;过程返回指令TABLE DB0F0H,00H,00H,21,17,0F0H,01H,00H,39,16,0F0H,02H,00H,46,34,0F0H,03H,00H,22 ,40,0F1H,08H,05H,58,0F1H,09H,05H,?,0F1H,0AH,05H,?;TABLE变量,存放使LCD进行显示的命令,;表示“当前温度:**(温度十位数字)(温度个位数字)”ASCIITAB DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H;ASCIITAB变量,按顺序存放从0到F的ASCII码;=======LCD显示模块结束=======;=======语音报警模块=======ALARM:MOV DX, 04B0H ;将地址04B0H装入DX寄存器MOV AL, 0AH ;将0AH装入AL寄存器MUL BH ;BH寄存器的值(温度十位数)乘以0AH并存入AX寄存器,;实际上只使用到AL寄存器,AH寄存器的值为00HADD AL, BL ;AL寄存器的值加上BL寄存器的值(温度个位数),得到温度值MOV AH, 50H ;将50H(80)装入AH寄存器CMP AL, AH ;比较AL和AH寄存器中值的大小JA ALMON ;若温度大于80,则跳转至ALMON,启动语音报警MOV AH, 4BH ;将4BH(75)装入AH寄存器CMP AL, AH ;比较AL和AH寄存器中值的大小JL ALMOFF ;若温度小于75,则跳转至ALMOFF,关闭语音报警,温度;取75的原因是避免实测温度值在80左右跳动引起报警系统的不稳定JMP DELAY0 ;跳转至DELAY0ALMON: ;启动语音报警MOV AL, 00H ;将00H装入AL寄存器OUT DX, AL ;向地址04B0H输出AL寄存器的值,即向语音录放模块的;PLAY输出低电平,开始回放事先录好的声音JMP DELAY0 ;跳转至DELAY0ALMOFF: ;关闭语音报警MOV AL, 0FFH ;将0FFH装入AL寄存器OUT DX, AL ;向地址04B0H输出AL寄存器的值,即向语音录放模块的;PLAY输出高电平,停止播放声音;=======语音报警模块结束=======DELAY0:MOV CX, 2710H ;将循环次数2710H装入CX寄存器DELAY1:NOPNOP ;空操作LOOP DELAY1 ;循环执行DELAY1,次数为2710H次JMP START ;跳转回START,循环执行程序SEGCOD DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;按顺序存放使数码管显示0到F的操作数V ALUETAB DB3CH,55H,71H,8DH,0A6H,0BBH,0CCH,0D8H,0E2H,0E9H,0EEH,0FFH;换算温度的数值表,由于热敏电阻具有非线性特性,因此需按数值表来换算得;出实际温度CODE ENDSEND START。
液晶显示器的程序设计简洁范本
```cpp
#include <LiquidCrystal.h>
// 定义LCD Pin
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setu
//初始化LCD
lcd.begin(16, 2);
//显示欢迎信息
lcd.print("LCD Program");
void loo
//滚动显示消息
lcd.scrollDisplayLeft(;
//延迟一段时间
delay(1000);
```
这是一个基本的液晶显示器程序,使用LiquidCrystal库来控制液晶
显示器。
在setup函数中,我们初始化了液晶显示器,并显示了欢迎信息。
在loop函数中,我们使用scrollDisplayLeft函数来滚动显示LCD上的
内容,之后使用delay函数延迟一段时间,以便观察滚动效果。
这只是一个简单的范本,液晶显示器的程序设计还可以根据实际需求
进行扩展和修改。
例如,我们可以通过增加按钮控制来实现菜单选择功能,或者通过使用传感器来动态更新显示内容等。
总结起来,液晶显示器的程序设计需要了解液晶显示器的硬件接口和
使用方法,并与所使用的开发板或单片机进行合适的软硬件连接。
通过使
用合适的库函数,可以轻松地实现各种液晶显示器的功能和效果。
要在计算机上执行汇编语言程序,其操作步骤如下:1. 编辑源程序使用编辑软件将汇编源程序输入到计算机中,建立*.ASM文件。
2.汇编源程序使用汇编程序将汇编源程序汇编成目标代码文件,即生成*.OBJ 文件。
目前使用较多的汇编程序是宏汇编程序MASM。
C>MASM A1↙3. 连接目标程序文件生成可执行文件生成OBJ文件后,必须用LINK程序连接目标代码程序和库函数代码生成可执行文件,生成的文件的扩展名为EXE。
C>LINK A1↙4.程序的执行建立了EXE文件后,就可以在DOS下直接执行程序了。
C>A1↙汇编程序调试工具debug命令:DEBUG调试命令介绍1.主要调试命令:(1)反汇编命令U:将存储器中的二进制数据翻译成较有意义的助记符形式,以帮助理解,如图1.5所示。
一般常用以下三种格式:a)-U↙:从当前IP处开始,对连续约32字节内容反汇编。
如对TEST.EXE,刚装入DEBUG时的IP=0000,则在输入U命令后有如下显示:-U↙13C2:0000 B402 MOV AH,0213C2:0002 B241 MOV DL,4113C2:0004 CD21 INT 2113C2:0006 B44C MOV AH,4C13C2:0008 CD21 INT 2113C2:000A 8B4606 MOV AX,[BP+06]………………13C2:0020 8B07 MOV AX,[BX]-图1.5 反汇编命令的执行结果在上例中,13C2:0000表示CS:IP的内容(其中CS的值是动态值);B402代表该处存放的二进制数据,亦即指令MOV AH,02H的机器代码;当连续约32字节的数据反汇编完后,重新回到DEBUG提示符“-”下,如果再键入U命令,则将继续对后面的内存区反汇编。
特别应该注意的是,由于反汇编命令针对内存区的二进制数据,而被调试程序仅占内存区的某一部分,故反汇编出来的内容并非全是被调试程序的代码,如上例中13C2:000A单元以后的部分,显然不是TEST.EXE的内容。
单片机:LCD(1602)动态显示(汇编)2009年06月13日星期六 15:31作者:gguoqing 出处:伟纳电子/mcu_view.asp?id=15显示内容:CHINESE *;* NEWYEAR *;**;* 显示方式:*;* 1、LCD第一行显示:CHINESE *;* LCD第二行显示:NEWYEAR *;* 2、先将两行字符写入DDRAM中,然后从右至左逐字移出显示。
*;* 3、在指定位置停留1.6秒后,闪烁2次,清屏。
*;* 4、反复循环上述显示方式。
* ;***************************************************** **************LCD_RS EQU P1.0LCD_RW EQU P1.1LCD_EN EQU P1.2;***************************************************** **************ORG 0000HAJMP MAINORG 0030H;***************************************************** **************MAIN:MOV SP,#60HACALL LCD_INIT ;LCD初始化MAIN1:ACALL CLR_LCD ;清LCDMOV A,#90H ;在第一行第17列的位置ACALL LCD_CMDMOV DPTR,#LINE1 ;第一行字符串的起始地址送入DPTR。
ACALL WRITEMOV A,#0D0H ;在第二行第17列的位置ACALL LCD_CMDMOV DPTR,#LINE2 ;第二行字符串的起始地址送入DPTR。
ACALL WRITEMOV R3,#10H ;向左移动16格LOOPA:MOV A,#18H ;字符同时左移一格ACALL LCD_CMDMOV R5,#03H ;延时375MSACALL DELAY125MSDJNZ R3,LOOPAACALL DELAY4 ;延时1.6sACALL DELAY4MOV R4,#02H ;设置闪烁次数ACALL FLASH ;开始闪烁AJMP MAIN1LINE1:DB " CHINESE ",00HLINE2:DB " NEW YEAR ",00H;***************************************************** **********;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,#0CH ;显示开,关光标ACALL LCD_CMD ;进行LCD忙检测RET;***************************************************** **********;清LCD子程序;***************************************************** **********CLR_LCD:MOV A,#01H ;清除屏幕ACALL LCD_CMD ;进行LCD忙检测RET;***************************************************** **********;写指令数据到LCD;RS=L,RW=L,D0-D7=指令码,E=高脉冲;***************************************************** **********LCD_CMD:CALL CHECKBUSYLCD_CMD_NC:CLR LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;***************************************************** **********;写显示数据到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=数据;P0.7=1,LCD忙,等待。
;----------逐字依次输入方式-----------COM EQU 20H ; 指令寄存器DAT EQU 21H ; 数据寄存器CW_Add EQU 8000H ; 指令口写地址CR_Add EQU 8200H ; 指令口读地址DW_Add EQU 8100H ; 数据口写地址DR_Add EQU 8300H ; 数据口读地址ORG 0000HMAIN:MOV SP,#60HMOV A,#30H ;功能指令设置MOV DPTR,#CW_AddMOV R2,#03HL1:MOVX @DPTR,ALCALL DELAYDJNZ R2,L1MOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0FH ;设置显示方式LCALL PR1MOV COM,#80H ;设置DDRAM地址00HLCALL PR1MOV DPTR,#TABMOV R2,#12 ;显示前8位MOV R3,#00WRIN: MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2LCALL DELAYINC R3DJNZ R2,WRINSJMP $;-------写指令代码子程序---------PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;--------写显示数据子程序----------PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR21:MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRETDELAY:MOV R6,#00HMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETTAB: DB 43H,75H,72H,73H,6FH,72H,20H ;Cursor DB 57H,72H,69H,74H,65H ;writeEND;----------逐字依次输入,两行显示方式-----------COM EQU 20H ; 指令寄存器DAT EQU 21H ; 数据寄存器CW_Add EQU 8000H ; 指令口写地址CR_Add EQU 8200H ; 指令口读地址DW_Add EQU 8100H ; 数据口写地址DR_Add EQU 8300H ; 数据口读地址ORG 0000HMAIN:MOV SP,#60HMOV A,#30H ;功能指令设置MOV DPTR,#CW_ADDMOV R2,#03HL1:MOVX @DPTR,ALCALL DELAYDJNZ R2,L1MOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#06H ;设置显示方式LCALL PR1MOV COM,#0fH ;清屏LCALL PR1MOV COM,#01H ;设置输入方式LCALL PR1MOV COM,#80H ;设置DDRAM地址00HLCALL PR1MOV DPTR,#TABMOV R2,#07 ;显示前8位MOV R3,#00HWRIN: MOV A,R3MOVC A,@A+DPTRMOV DA T,ALCALL PR2LCALL DELAYINC R3DJNZ R2,WRINMOV COM,#0C0H ;设置DDRAM地址40HLCALL PR1MOV R2,#05H ;显示后4位WRIN1: MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2LCALL DELAYINC R3DJNZ R2,WRIN1SJMP MAIN;-------写指令代码子程序---------PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;--------写显示数据子程序----------PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR21:MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRETDELAY:MOV R6,#00HMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETTAB: DB 43H,75H,72H,73H,6FH,72H,20H ;Cursor DB 57H,72H,69H,74H,65H ;writeEND;----------光标左移输入,两行显示方式-----------COM EQU 20HDAT EQU 21HCW_ADD EQU 8000HCR_ADD EQU 8200HDW_ADD EQU 8100HDR_ADD EQU 8300HORG 0000HMAIN:MOV SP,#60HMOV A,#30H ;功能指令设置MOV DPTR,#CW_ADDMOV R2,#03HL1:MOVX @DPTR,ALCALL DELAYDJNZ R2,L1MOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0FH ;设置显示方式LCALL PR1MOV COM,#04H ;设置输入方式,减方式LCALL PR1MOV COM,#0C5H ;设置DDRAM地址44HLCALL PR1MOV DPTR,#TABMOV R2,#05 ;显示后5位MOV R3,#11 ;从第12位开始显示WRIN: MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2LCALL DELAYDEC R3DJNZ R2,WRINMOV COM,#87H ;设置DDRAM地址07HLCALL PR1MOV R2,#08H ;显示前8位WRIN1: MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2LCALL DELAYDEC R3DJNZ R2,WRIN1SJMP $;-------写指令代码子程序---------PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;--------写显示数据子程序----------PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR21:MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRETDELAY:MOV R6,#00HMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETTAB: DB 43H,75H,72H,73H,6FH,72H,20H ;Cursor DB 57H,72H,69H,74H,65H ;writeEND;----------左滚动输入方式-----------COM EQU 20H ; 指令寄存器DAT EQU 21H ; 数据寄存器CW_Add EQU 8000H ; 指令口写地址CR_Add EQU 8200H ; 指令口读地址DW_Add EQU 8100H ; 数据口写地址DR_Add EQU 8300H ; 数据口读地址ORG 0000HMAIN:MOV SP,#60HMOV A,#30H ;功能指令设置MOV DPTR,#CW_ADDMOV R2,#03HL1:MOVX @DPTR,ALCALL DELAYDJNZ R2,L1MOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0EH ;设置显示方式LCALL PR1MOV COM,#07H ;设置输入方式,画面滚动LCALL PR1MOV COM,#8cH ;设置DDRAM地址07HLCALL PR1MOV DPTR,#TABMOV R2,#012 ;显示前7位MOV R3,#00WRIN: MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2LCALL DELAYINC R3DJNZ R2,WRINSJMP $;-------写指令代码子程序---------PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;--------写显示数据子程序----------PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR21:MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRETDELAY:MOV R6,#00HMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETTAB: DB 43H,75H,72H,73H,6FH,72H,20H ;CursorDB 57H,72H,69H,74H,65H ;writeEND;----------自定义字符库方式-----------COM EQU 20HDAT EQU 21HCW_ADD EQU 8000HCR_ADD EQU 8200HDW_ADD EQU 8100HDR_ADD EQU 8300HORG 0000HMAIN:MOV SP,#60HMOV A,#30H ;功能指令设置MOV DPTR,#CW_ADDMOV R2,#03HL1:MOVX @DPTR,ALCALL DELAYDJNZ R2,L1MOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0FH ;设置显示方式LCALL PR1LCALL CG_WRITE ;调用自定义的字库子程序MOV COM,#80H ;设置DDRAM地址LCALL PR1MOV DPTR ,#TABDY ;设置字表首地址MOV R2,#08MOV R3,#00HLOOP1:MOV A,R3MOVC A,@A+DPTRMOV DA T,ALCALL PR2INC R3DJNZ R2,LOOP1MOV COM,#0C0H ;设置DDRAM地址LCALL PR1MOV R2,#08HLOOP2:MOV A,R3MOVC A,@A+DPTRMOV DA T,ALCALL PR2INC R3DJNZ R2,LOOP2SJMP $CG_WRITE:MOV COM,#40H ;编字库LCALL PR1MOV R2,#64MOV R3,#00HMOV DPTR,#CGTAB ;设置字模数据的首地址CG1:MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2INC R3DJNZ R2,CG1RET;-------写指令代码子程序---------PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;--------写显示数据子程序----------PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR21:MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRETDELAY:MOV R6,#00HMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETCGTAB:DB 08H,0FH,12H,0FH,0AH,1FH,02H,02H ;"年"代码=00H DB 0FH,09H,0FH,09H,0FH,09H,11H,00H ;"月"代码=01H DB 1FH,11H,11H,1FH,11H,11H,1FH,00H ;"日"代码=02HDB 11H,0AH,04H,1FH,04H,1FH,04H,00H ;"$"代码=03HDB 0EH,00H,1FH,0AH,0AH,0AH,13H,00H ;"元"代码=04H DB 18H,18H,07H,08H,08H,08H,07H,00H ;"摄氏度"代码=05H DB 04H,0AH,15H,04H,04H,04H,04H,00H ;"↑"代码=06HDB 17H,15H,15H,15H,15H,15H,17H,00H ;"10"代码=07H TABDY:DB 57H,46H,48H,30H,36H,00H,34H,01H ;WFH06年4月DB 33H,02H,54H,3DH,32H,33H,05H,06H ;3日T=23摄氏度↑END。
; JCM12232 CPU=SED1520 ; JCM8952.PCB 2007-08-30 DEBUGGER OK ;左半屏与右半屏显示:锦昌公司您好 E1 EQU P3.1 ;读写使能1读0写 E2 equ p3.3 A0 EQU P3.5 ;信号作为命令还是数据 RST EQU P3.0 ;复位,0有效 RW EQU P3.4 ;读写选择1读,0写 X equ 30h ;页地址 Y equ 31h ;列地址 ;################################################################# ORG 0000H ;起始地址 LJMP MAIN ;长转移 ORG 0003H LJMP PAUSE MAIN: ;启动外部中断INT0的设置 MOV IE,#81H ;中断使能寄存器,使能外部中断0 MOV IP,#01H ;中断优先控制寄存器,外部中断0优先级最高 MOV TCON,#00H ;定时/计数控制寄存器清零 CLR E1 CLR E2 CLR RW;写 LCALL INIT ;初始化模块 DISP: MOV 34H,#0ffH ;显示所有点 LCALL DISPLAY_ALL ;子程序调用 LCALL DLY100 LCALL DLY100 LCALL DLY100 MOV 34H,#00H ;所有点不显示 LCALL DISPLAY_ALL MOV R1,#0E3H ;reset LCALL WRI ;调用写指令子程序 LCALL plybw ;显示黑白相间块 LCALL DLY100 LCALL DLY100 LCALL DLY100 MOV 34H,#00H ;清显示屏 LCALL DISPLAY_ALL MOV R1,#0e3H ;reset LCALL WRI ;*************************************************** mov 31h,#0 mov 30h,#0 ; MOV 30H,#0 ;页地址 MOV 31H,#0 ;列地址 MOV DPTR,#HZI1 ;锦 LCALL outhz MOV 30H,#0 MOV 31H,#16 MOV DPTR,#HZI2 ;昌 LCALL outhz MOV 30H,#0 MOV 31H,#32 MOV DPTR,#HZI5 ;公 LCALL outhz MOV 30H,#0 MOV 31H,#48 MOV DPTR,#HZI6 ;司 LCALL outhz MOV 30H,#2 ;x MOV 31H,#8 ;y MOV DPTR,#HZI7 ;您 LCALL outhz MOV 30H,#2 MOV 31H,#40 MOV DPTR,#HZI8 ;好 LCALL outhz LCALL DLY100 LJMP $ ;当前地址,计数器PC值不变 ;###################################################### init: CLR RST ;RESET LCALL DLY50 ; 延时50 LCALL DLY50 LCALL DLY50 LCALL DLY50 SETB RST ;置1 MOV R1,#0aFH ;DISPLAY ON;00010101111 LCALL WRI MOV R1,#0C0H ;START = 0,显示起始行0 LCALL WRI MOV R1,#0a4H ;driver,动态驱动 LCALL WRI MOV R1,#0a9h ;duty 32,占空比1/32 LCALL WRI MOV R1,#0a0H ;adc,顺时针方向读入显示RAM的数据 LCALL WRI MOV R1,#0e3H ;reset显示起始行第0行,列地址0,页地址置3 LCALL WRI MOV 34H,#00H ;所有行都不显示 LCALL DISPLAY_ALL RET ;#################################################### DISPLAY_ALL: MOV R1,#0e3H ;reset显示起始行第0行,列地址0,页地址置3 LCALL WRI MOV R7,#4 ;DISPLAY DATA= 34H每页8行,每次循环2行,共需循环4次 MOV R2,#0B8H ;显示起始行为第20像素行 LOP1: MOV A,R2 MOV R1,A ; X+1像素行加1 LCALL WRI MOV R1,#00H ; Y ,0像素列 LCALL WRI MOV R5,#61 ;半屏61像素 MOV R1,#0e0H ;RMW 每次写数据后像素列地址加1,读数据后不变 LCALL WRI LOP11: MOV R1,34H LCALL WRD ;调用写数据子程序,将所有像素点对应的RAM中全置为00H DJNZ R5,LOP11 ;将第X像素行的数据写入显示RAM MOV R1,#0eeH ;end,对显示RAM的改写方式结束,以后无论读写数据Y均加 LCALL WRI INC R2 DJNZ R7,LOP1 RET ;########################################### ;将存储空间的字符表示码放到显示RAM中 outhz: MOV R1,#0e3H ;reset LCALL WRI ;30h=x (0-6) ,31h=y(0-63-16) MOV R7,#2 ;每个字符16像素列的占2行存储空间 MOV A,#0B8H ;从第20像素开始显示 ADD A,30H ;B8+X MOV 30H,A ;A>>30H HZ2: ; MOV A,R2 MOV R1,30H ; X+1 LCALL WRI MOV A,#00H ; Y ADD A,31H ; MOV 31H,A ;40+Y MOV R1,A LCALL WRI MOV R5,#16 ;每个字符表占16列存储空间 MOV R1,#0E0H ;RMW,设置改写方式(对RAM改写) LCALL WRI HZ1: MOV A,#00H MOVC A,@A+DPTR MOV R1, A LCALL WRD LCALL DLY10 INC DPTR DJNZ R5,HZ1 ;R5减1,不为0则转移 MOV R1,#0EEH ;end改写方式结束,无论读写数据后列地址都加1 LCALL WRI INC 30H ;行地址加1 DJNZ R7,HZ2 RET ;################################################### plybw: MOV R1,#0E3H ;reset,0行0列,页地址为3?? LCALL WRI mov 30h,#0 mov 31h,#0 mov dptr,#bw ;存储空间bw为黑白相间码 MOV R7,#4 ;每次循环显示2行,DDRAM地址表每页8行,共需循环4次 MOV A,#0B8H ADD A,30H ;B8+X MOV 30H,A ;A>>30H HZ2bw: MOV R1,30H ; X+1通过下面的INC 30H实现加1 LCALL WRI MOV A,#00H ; Y ADD A,31H ;40+Y MOV R1,A LCALL WRI MOV R5,#61 ;半屏61列,共122列 MOV R1,#0e0H ;RMW LCALL WRI HZ1bw: MOV A,#00H MOVC A,@A+DPTR MOV R1,A LCALL WRD LCALL DLY10 INC DPTR DJNZ R5,HZ1bw MOV R1,#0eeH ;end LCALL WRI INC 30H DJNZ R7,HZ2bw RET ;################################################### WRI: ;写指令子程序 CLR E1 CLR E2 CLR A0 MOV P1,R1 LCALL DLY10 SETB E1 SETB E2 LCALL DLY10 CLR E1 CLR E2 LCALL DLY10 LCALL DLY10 LCALL DLY10 RET ;********************************************************* WRD: ; 写数据子程序 CLR E1 CLR E2 SETB A0 MOV P1,R1 LCALL DLY10 SETB E1 setb E2 LCALL DLY10 CLR E1 CLR E2 LCALL DLY10 LCALL DLY10 LCALL DLY10 RET ;########################################################### DLY10:MOV R3,#01H ;延时10单位时间 DL1:MOV R4,#05H DL2:MOV R6,#0fH