📄 miao.asm
字号:
MOV SEC,#0 ;秒、分、时单元清零
MOV MIN,#0
MOV HOUR,#0
TT: POP ACC
RETI
;--------------------------------------------------------
;时间数据转换为 ASCII 码并显示
;--------------------------------------------------------
CONV:
MOV A,HOUR ;加载小时数据
MOV LCD_X,#5 ;设置位置
CALL SHOW_DIG2 ;显示数据
INC LCD_X ;
MOV A,#':' ;显示“:”
MOV B,LCD_X ;
CALL LCDP2 ;
MOV A,MIN ;加载分钟数据
INC LCD_X ;设置位置
CALL SHOW_DIG2 ;显示数据
INC LCD_X ;
MOV A,#':' ;显示“:”
MOV B,LCD_X ;
CALL LCDP2 ;
MOV A,SEC ;加载秒数数据
INC LCD_X ;设置位置
CALL SHOW_DIG2 ;显示数据
INC LCD_X ;
MOV A,#':' ;显示“:”
MOV B,LCD_X ;
CALL LCDP2 ;
MOV A,SEC0 ;加载秒数数据
INC LCD_X ;设置位置
CALL SHOW_DIG2
RET
;--------------------------------------------------------
;在LCD1602的第二行显示数字
;--------------------------------------------------------
SHOW_DIG2:
MOV B,#10 ;设置被除数
DIV AB ;结果A存商数,B存余数
ADD A,#30H ;A为十位数,转换为字符
PUSH B ;B放入堆栈暂存
MOV B,LCD_X ;设置 LCD 显示的位置
CALL LCDP2 ;由 LCD 显示出来
POP B ;
MOV A,B ;B为个位数
ADD A,#30H ;转换为字符
INC LCD_X ;LCD 显示位置加1
MOV B,LCD_X ;设置 LCD 显示的位置
CALL LCDP2 ;由 LCD 显示出来
RET
;--------------------------------------------------------
;在LCD的第二行显示字符
;--------------------------------------------------------
LCDP2:
PUSH ACC ;入栈保护
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
;--------------------------------------------------------
;在LCD的第一行或第二行显示字符
;--------------------------------------------------------
LCD_PRINT:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1: MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
JMP FILL
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1: CALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;--------------------------------------------------------
;清除 LCD 指定行的字符
;“空白”的ASCII代码为20H。
;--------------------------------------------------------
CLR_LINE:
MOV R0,#24
CL1: MOV A,#20H ;' '
CALL WDATA
DJNZ R0,CL1
RET
;--------------------------------------------------------
;写控制指令子程序
;写控制指令到LCD
;传入参数: ACC(要写入的指令)
;RS=L,RW=L,E=高脉冲,D0-D7=指令码 。
;--------------------------------------------------------
WCOM:
ACALL CHECKBUSY
WCOM_NC:
MOV P0,A ;写入指令
CLR LCD_EN
NOP
NOP
CLR LCD_RS
CLR LCD_RW
SETB LCD_EN
ACALL DEL_250
CLR LCD_EN
RET
;--------------------------------------------------------
;写数据子程序
;写显示数据到LCD
;传入参数: ACC(要写入的数据)
;RS=H,RW=L,E=高脉冲,D0-D7=数据码 。
;--------------------------------------------------------
WDATA:
ACALL CHECKBUSY
MOV P0,A ;写入数据
CLR LCD_EN
NOP
NOP
SETB LCD_RS
CLR LCD_RW
SETB LCD_EN
CALL DEL_250
CLR LCD_EN
RET
DEL_250:
MOV R7,#125 ;延时250微秒
DJNZ R7,$
RET
;--------------------------------------------------------
;检测LCD控制器忙碌状态
;正常读写操作之前必须检测LCD控制器状态
;BUSY FLAG(P0.7)=1时,忙,不能接收MCU送来的指令和数据。
;BUSY FLAG(P0.7)=0时,闲,能够接收MCU送来的指令和数据。
;读数据时
;RS=L,RW=H,E=H,输出:D0-D7=数据
;--------------------------------------------------------
CHECKBUSY:
PUSH ACC
MOV P0,#0FFH ;置P0口为输入状态
CLR LCD_EN
NOP
NOP
SETB LCD_RW
CLR LCD_RS
SETB LCD_EN
BUSYLOOP:
NOP
JB P0.7,BUSYLOOP
CLR LCD_EN
POP ACC
RET
;--------------------------------------------------------
;蜂鸣器响一声子程序
;驱动交流蜂鸣器
;--------------------------------------------------------
BEEP_BL:
MOV R6,#150
BL1: CALL BL2
CPL BEEP
DJNZ R6,BL1
CALL DELAY5MS
CALL DELAY5MS
CALL DELAY5MS
RET
BL2: MOV R7,#180
BL3: NOP
DJNZ R7,BL3
RET
;--------------------------------------------------------
;延时5MS子程序
;--------------------------------------------------------
DELAY5MS:
MOV R6,#25
DEL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
RET
;--------------------------------------------------------
MADJ: DB " BEGIN COUNT 1 ",0
MADJ1: DB " PAUSE COUNT 2 ",0
MADJ2: DB " BEGIN COUNT 3 ",0
MADJ3: DB " PAUSE COUNT 4 ",0
;--------------------------------------------------------
;第二行滚动显示网址子程序
;--------------------------------------------------------
MENU:
MOV A,#06H ;移动光标(光标加1)
CALL WCOM
CALL DELAY5MS
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
MOV DPTR,#CHAR
FILL1: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息区取出字符
CJNE A,#0,LC2 ;判断是否为结束码
RET
LC2: CALL WDATA ;写入数据
INC DPTR ;指针加1
CALL DELAY100
CALL DELAY100
JMP FILL1 ;继续填入字符
RET
CHAR:
DB " www.saxmcu.com ",0
;--------------------------------------------------
;延时100MS子程序
;--------------------------------------------------
DELAY100:
MOV r7,#200
DL1: MOV r6,#250
DL2: DJNZ R6,DL2
DJNZ R7,DL1
RET
;--------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -