📄 text2.asm
字号:
;********************************************************************************
RS EQU p2.0;液晶接口的定义
RW EQU p2.1;
E EQU p2.2;
HOUR EQU 31H;小时定义
MIN EQU 32H;分定义
SEC EQU 33H;秒定义
X EQU 35H;LCD存放地址
K1 BIT P2.4
K2 BIT P2.5
K3 BIT P2.6
K4 BIT P2.7
WLED EQU P3.7;LED控制位
;=====================================================================================
org 0000h; 原程序其始地址
LJMP MAIN
ORG 000BH ; TO定时器的中断入口地址
LJMP INTT0
;=======================================================================================
;LCD初始化设置
;================================================================
org 0025h ;主程序入口地址
MAIN: MOV SP ,#70H;设置堆栈
MOV p0,#01H ;清屏
CALL ENABLE ; 写入指令
MOV p0,#38H ;功能设置
CALL ENABLE
MOV p0,#0CH ;显示开关控制
CALL ENABLE
MOV p0,#06H ;+1;AC地址计数器自动加一
CALL ENABLE
;=======================================================================================
;LCD查表显示和定时器初始化
;=======================================================================================
SET_LCD:
MOV DPTR,#TABLE1; 查表显示1
MOV 30H,#1
LCALL WRITE1; LCD显示输出
MOV DPTR,#TABLE2; 查表显示2
MOV 30H,#2
LCALL WRITE1 ;LCD显示输出
LCALL INTT ;变量初始化
LCALL INTT_TIME ;TO定时器初始化
;MOV p0,#80H;第一行的开始位置
;cALL ENABLE
;MOV DPTR,#TABLE1;显示
;CALL WRITE1;到TABLE1取码
;MOV p0,#0C0H;第二行的位置
;CALL ENABLE
;MOV DPTR,#TABLE2;显示
;CALL WRITE1;到TABLE2 取码
;MOV p0,#0C2H;光标定位0C0H
;CALL ENABLE
AA:SJMP AA ;等待中断
;===========================================================================================
;键盘扫描
;====================================================================================
LOP: JB K1,L1 ;键盘扫描子程序
lcall BUSY ;是否为忙的子程序
LCALL LED_BL ;LED闪烁表示工作状态
MOV DPTR,#MADJ ;查表显示
MOV 30H,#1
LCALL WRITE1
LCALL SET_TIME; 设置时间
; INC HOUR
;MOV 50H,HOUR
;MOV A,50H
;CJNE A,#24,LOP1
;CLR HOUR
Jmp LOP
L1: JB K2,L2
;INC MIN
;MOV 51H,MIN
;MOV A,MIN
;CJNE A,#60,LOP1
;CLR MIN
JMP LOP
L2: JB K3,L3 ;K3键保留未做任何动作
JNB K3,$
;INC SEC
;MOV 52H,SEC
;MOV A,52H
;CJNE A,#60H,LOP1
;CLR SEC
JMP LOP
L3: JB K4,L4
JMP LOP
L4: ;JMP LOP1
LOP1: RET
;================================================================================================
;写入指令
;============================================================
ENABLE: CLR RS ;送命令 ;写入指令
CLR RW ;写入数据
CLR E ;写入数据
CALL DELAY
SETB E
RET
;================================================================================================
;查表输出显示
;=============================================================================
WRITE1: MOV A,30H ;LCD二行输出的查表显示
CJNE A,#1,LINE2
LINE1: MOV P0,#80H ;LCD第一行显示的首地址
LCALL ENABLE ; 写入指令
AJMP XX
LINE2: MOV P0,#0C0H ;LCD第二行显示的首地址
LCALL ENABLE ; 写入指令
XX: MOV R1,#00H ;显示table中的值
A1: MOV A,R1;到table取码
MOVC A,@A+DPTR
call wRITE2 ;显示到lcd
INC R1
CJNE A,#00H,A1 ;是否到00h
RET
WRITE2: MOV p0,A ;显示
SETB RS ;写入数据
CLR RW ;写入数据
CLR E ;写入数据
CALL DELAY ;短延时产生户用信号
SETB E ;写入地址
RET
;===================================================================================================
DELAY: MOV R3,#5; 2.5MS延时
D1: MOV R7,#0FFH
DJNZ R7,$
DJNZ R3,D1
RET
;=================================================================================================
table1: db" CHINA--DA SHUN ",00H
table2: db"ZHE BIAN JI ",00H
MADJ: DB"K2:H K3:M K4:OK",00H
;==================================================================================================
;工作灯闪烁表示LCD程序运行
;===========================================================================
LED_BL: MOV R4,#4 ; LED闪烁四次
LEO: CPL WLED
MOV R5,#100;MOV R5,#100
LEO1: LCALL DELAY
DJNZ R5,LEO1
DJNZ R4,LEO
RET
;===================================================================================================
;时,分,秒的初始化
;====================================================================================================
INTT: MOV SEC,#0; 变量初始化
MOV MIN,#0
MOV HOUR,#12
RET
;====================================================================================================
;K2小时加一,K3分钟加一,K4为正常走时
;===================================================================================
SET_TIME: ; 设置时间;K1键设置时间
CLR TR0
MOV SEC,#0
S0: JB K2,S1 ; K2键加时
JNB K2,$
INC HOUR
MOV A,HOUR
CJNE A,#24,S11
MOV HOUR,#0
S11: LCALL BUSY ;检查忙
mov p0,#01h ;清除屏幕,这条指令是能否显示的关键
lcall ENABLE;写入指令
CALL CONV ;时钟显示
MOV R5,#25
S111: LCALL DELAY
DJNZ R5,S111
JMP S0
S1: JB K3,S2 ; K3键加分
JNB K3,$
INC MIN
MOV A,MIN
CJNE A,#60,S21
MOV MIN,#0
S21: LCALL BUSY
mov p0,#01h ;清除屏幕,这条指令是能否显示的关键
lcall ENABLE;写入指令
LCALL CONV
MOV R5,#20
S211: LCALL DELAY
DJNZ R5,S211
JMP S0
S2: JB K4,S0; K4恢复走时
JNB K4,$
LCALL LED_BL
SETB TR0
RET
;=======================================================================================
;时钟的液晶显示
;=========================================================================================
CONV: MOV A,HOUR ; 时钟显示
MOV X,#5
LCALL SHOW_DIG2; 转化为字符并显示
INC X
MOV A,#":"
MOV B,X
LCALL LCDP2 ;显示地址程序
MOV A,MIN
INC X
LCALL SHOW_DIG2
;INC X
;LCALL SHOW_DIG2
INC X
MOV A,#":"
MOV B,X
LCALL LCDP2
MOV A,SEC
INC X
LCALL SHOW_DIG2
RET
SHOW_DIG2:MOV B,#10
DIV AB ;A为时位,B为个位
ADD A,#30H; 转换为字符
PUSH B ; 保护B的数据
MOV B,X
LCALL LCDP2; 确定A的显示地址
POP B
MOV A,B
ADD A,#30H
INC X
MOV B,X
LCALL LCDP2
RET
;===================================================================================
;ADD A,#0C0H 应该在液晶的第二行首地址,可显示时却在第一行??????????
;========================================================================================
LCDP2: PUSH ACC; 保护A的数据
MOV A,B
ADD A,#0C0H ;第二行的首地址
LCALL WCOM; 写入指令
POP ACC
LCALL WDATA ;写入数据
RET
WCOM: CLR RS ;送命令 写入指令
CLR RW ;写入数据
CLR E ;写入数据
CALL DELAY;2.5MS
SETB E ;写入地址
RET
WDATA: MOV p0,A ;显示 写入数据显示
SETB RS ;写入数据
CLR RW ;写入数据
CLR E ;写入数据
;rlc A
RLC A
RLC A
RLC A
RLC A
MOV P0,A
SETB RS ;写入数据
CALL DELAY ;短延时;2.5MS
CLR E ;写入数据
RET
;====================================================================================================
DE: MOV R6,#5
DJNZ R6,$
RET
EN1: SETB E
LCALL DE
CLR E
LCALL DE
RET
;======================================================================================================
;TO工作方式0 ,10MS定时 便于键盘扫描
;===========================================================================================
INTT_TIME:MOV TMOD,#01H ; TO的定时方式一
MOV IE,#10000010B
MOV TH0,#0D8H;延时10MS;10MS便于键盘扫描
MOV TL0,#0F0H
SETB TR0
RET
;====================================================================================================
;如何定时来解决液晶闪烁的问题呢?????
;=======================================================================================
INTT0: PUSH ACC
MOV TH0,#0D8H
MOV TL0,#0F0H
INC 40H
MOV A,40H
CJNE A,#10,TT;定时100MS;CJNE A,#100,TT;这里的1S又该怎么设置?????
MOV 40H,#0
CPL WLED
INC SEC
MOV A,SEC
CJNE A,#60,TT
INC MIN
MOV SEC,#0
MOV A,MIN
CJNE A,#60,TT
INC HOUR
MOV MIN,#0
MOV A,HOUR
CJNE A,#24,TT
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
TT: ;MOV P0,#01H;
;LCALL ENABLE;
;MOV p0,#06H ;+1;AC地址计数器自动加一
;CALL ENABLE
LCALL LOP ;键盘扫描;当无键按下时
LCALL BUSY ; 检查忙
mov p0,#01h;清除屏幕,这条指令是能否显示的关键
lcall ENABLE;写入指令
LCALL CONV; 显示输出;5MS;这里的5MS是否为影响1S定时的呢 与 键盘的扫描时间???????????
;=======================================================================================
;延时稳定液晶显示画面 在CONV中有25MS+5MS的时间了,这是否会影响1S定时????
;===========================================================================================
MOV R5,#20;25MS 在CONV中有25MS+5MS的时间了,这是否会影响1S定时?????
S51: LCALL DELAY;
DJNZ R5,S51;
;======================================================================================
POP ACC
RETI
;=======================================================================================
;液晶是否为忙
;===================================================================================
BUSY: MOV P0,#0FFH ;判断液晶显示器是否为忙的子程序; 这是液晶显示中最重要的一条指令
CLR RS ;写入指令
SETB RW; 读取数据
CLR E; 写入数据
NOP
SETB E ;写入地址
JB P0.7,BUSY ;如果P0.7为高电平表示忙就循环等待
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -