📄 lin.asm
字号:
;---------------------------------------------------
; CLL.ASM IO51 8051 LCD CLOCK
; 8051 ASM USE: KEIL
; COPYRIGHT CMY 2003
;---------------------------------------------------
; K1 : ADJ TIME K2:HOUR K3:MIN K4: OK
;----------------------------------------------
; 5 mS isr
; MOV TL0,#(8192-5000).MOD.32
; MOV TH0,#(8192-5000)/32
LO EQU 24
HI EQU 99
CO EQU 185;200 ; ADJ. TO MATCH TIME 200 x 5 mS=1000 mS
HOUR EQU 30H
MIN EQU 31H
SEC EQU 32H
DEDA EQU 33H ; DEDA COUNT 5 mS COUNT
SEC0 EQU 34H ; OLD SEC
X EQU 35H ; LCD X POS
;---------------------------------
; KEY4.....
K1 EQU P2.3 ;P1.4
K2 EQU P2.2 ;P1.5
K3 EQU P2.1 ;P1.6
K4 EQU P2.0 ;P1.7
; LCD .....
RS EQU P2.7 ;P1.0
EN EQU P2.5 ;P1.2
WLED EQU P3.7 ;EQU P0.0
;----------------------------------------------------------
ORG 0H
JMP START
ORG 0BH ; TIMER 0
JMP T0_INT
;-----------------------------
START:
CLR EN ; LCD OFF
;CLR P1.3;through
CLR P2.6 ;CLR P1.1;r/w = 0
;CLR P3.3;through
CALL LED_BL
;SETB P3.3
CALL SET_LCD;
CALL INIT;
CALL INIT_TIMER;
CALL MENU;display first line
LOOP:
CALL TIME_PRO;the last code choice if change
; TEST KEY .....................
JB K1,L1;choice have press k1
; K1 KEYED .................
;CLR P3.3
CALL LED_BL;led will light
;SETB P3.3
MOV DPTR,#MADJ ;the first line
MOV A,#1;the first line
CALL LCD_PRINT;display the press choice
CALL SET_TIME ; ADJ TIME choice have press key
CALL MENU;refresh the first line
JMP LOOP;go on
;....................
L1: JB K2,L2
; K2 KEYED..................
JMP LOOP
;.....................
L2: JB K3,L3
JNB K3,$
; K3 KEYED ..........
JMP LOOP
;.....................
L3: JB K4,L4
; K4 KEYED.............
JMP LOOP
;.........................................
L4:
JMP LOOP
;--------------------------------------------
LMESS1: DB "LCD LINE 1 .....",0
LMESS2: DB "TIME ",0
TITLE: DB "CLL.ASM 8051 CLOCK WITH LCD"
;--------------------------------------------
INIT:
MOV DEDA,#0
MOV SEC0,#0
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
RET
;-------------------------
INIT_TIMER:
MOV TMOD,#00000000B
MOV IE, #10000010B
MOV TL0,#LO
MOV TH0,#HI
SETB TR0
RET
;----------------------
; USE TIMER MODE 0
; COUNT=5ms/1us=5000
;----------------------
T0_INT:
PUSH ACC
MOV TL0,#LO
MOV TH0,#HI
INC DEDA
; 1 SEC TIME OUT CHECK
MOV A,DEDA
CJNE A,#CO,TT
MOV DEDA, #0
CPL WLED
INC SEC
MOV A,SEC
CJNE A,#60,TT
; 1 MIN TIME OUT
INC MIN
MOV SEC,#0
MOV A, MIN
CJNE A,#60,TT
; 1 HOUR TIME OUT
INC HOUR
MOV MIN,#0
MOV A, HOUR
CJNE A,#24,TT
MOV SEC,#0 ; RESET TIME TO 0
MOV MIN,#0
MOV HOUR,#0
TT:
POP ACC
RETI
;---------------------------------------------------------------
; K2:HH K3:MM K4:OK
SET_TIME:
CLR TR0
MOV SEC,#0
; SCAN 3 KEY TO ADJ............
S0:
JB K2,S1
; K1 KEYED ADJ HH......
INC HOUR
MOV A, HOUR
CJNE A,#24,S11
MOV HOUR,#0
S11:
CALL CONV ; CONV. TO ASCII
MOV R5,#20
CALL DELAY
JMP S0
;....................
S1: JB K3,S2
; K2 KEYED ADJ MM.......
INC MIN
MOV A, MIN
CJNE A,#60,S21
MOV MIN,#0
S21:
CALL CONV ; CONV. TO ASCII
MOV R5,#20
CALL DELAY
JMP S0
;.....................
S2: JB K4,S0
JNB K4,$
; K3 KEYED OK .........
CLR P3.3
CALL LED_BL
SETB P3.3
SETB TR0
RET
;-----------------------------------------------
; A:DIG X: LCD X POS
; SHOW ON LCD LINE1
SHOW_DIG:
MOV B,#10
DIV AB
ADD A,#30H
PUSH B
MOV B,X
CALL LCDP1
POP B
MOV A,B
ADD A,#30H
INC X
MOV B,X
CALL LCDP1
RET
;-------------------------
; A:DIG X: LCD X POS
; SHOW ON LCD LINE2
SHOW_DIG2:
MOV B,#10
DIV AB
ADD A,#30H
PUSH B
MOV B,X
CALL LCDP2
POP B
MOV A,B
ADD A,#30H
INC X
MOV B,X
CALL LCDP2
RET
;-------------------------
; LCD HH:MM:SS
; CONVERT TO ASCII AND SHOW
CONV:
; SHOW HOUR...............
MOV A,HOUR
MOV X,#5
CALL SHOW_DIG2
INC X
MOV A,#':'
MOV B,X
CALL LCDP2
; SHOW MIN...............
MOV A,MIN
INC X
CALL SHOW_DIG2
INC X
MOV A,#':'
MOV B,X
CALL LCDP2
; SHOW MIN...............
MOV A,SEC
INC X
CALL SHOW_DIG2
RET
;*******************************************************
; LCD CONTROL
;*******************************************************
SET_LCD:
CLR EN ; en=0
CALL INIT_LCD
MOV R5,#10
CALL DELAY
MOV DPTR,#LMESS1
MOV A,#1 ; LINE1
CALL LCD_PRINT
MOV DPTR,#LMESS2
MOV A,#2 ; LINE2
CALL LCD_PRINT
RET
;---------------------------------
INIT_LCD1:
MOV A,#38H
CALL WCOM
MOV A,#0CH
CALL WCOM
MOV A,#0EH
CALL WCOM
MOV A,#01H
CALL WCOM
RET
;-----------------------------------------
CLR_LINE1:
MOV A,#80H
CALL WCOM
MOV R0,#24
C1: MOV A,#' '
CALL WDATA
DJNZ R0,C1
RET
;-------------------------------
; A=LINE 1 OR 2
; DPTR = MESSAGE POINTER
LCD_PRINT:
CJNE A,#1,LINE2
LINE1: MOV A,#80H
CALL WCOM
CALL CLR_LINE
MOV A,#80H
CALL WCOM
JMP FILL
LINE2: MOV A,#0C0H
CALL WCOM
CALL CLR_LINE
MOV A,#0C0H
CALL WCOM
FILL:
CLR A
MOVC A,@A+DPTR
CJNE A,#0,LC1
RET
LC1:
CALL WDATA
INC DPTR
JMP FILL
RET
;---------------------------
CLR_LINE:
MOV R0,#24
CL1: MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
;-------------------------------
DE: MOV R7, #5
DJNZ R7,$
RET
;--------------------
EN1:
SETB EN
CALL DE
CLR EN
CALL DE
RET
;-------------------
INIT_LCD:
MOV P0, #38H
CALL EN1
MOV P0, #38H
CALL EN1
MOV P0, #38H
CALL EN1
MOV P0, #30H
CALL EN1
CALL INIT_LCD1
RET
;----------------------------
WCOM:
; WRITE HI 4 BIT
MOV P0, A
CLR RS ; SET COMMAND
CALL EN1
; WRITE LO 4 BIT
RET
;--------------------------------------
WDATA:
; WRITE HI 4 BIT
MOV P0, A
SETB RS ; SET DATA
CALL EN1
RET
;--------------------------------------
; PRINT A CHAR ON LCD LINE 1
; A=ASC DATA
; B=LINE X POS.
LCDP1:
; LINE 1
PUSH ACC
MOV A,B
ADD A,#80H
CALL WCOM
POP ACC
CALL WDATA
RET
;-------------------------------
; PRINT A CHAR ON LCD LINE 2
; A=ASC DATA
; B=LINE X POS.
LCDP2:
; LINE 1
PUSH ACC
MOV A,B
ADD A,#0C0H
CALL WCOM
POP ACC
CALL WDATA
RET
;-----------------------------------------------------------------------
; DELAY R5*10 ms
DELAY:
MOV R6,#50
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
;--------------------------------
LED_BL:
MOV R4,#4
LE0: CPL WLED
MOV R5,#10
CALL DELAY
DJNZ R4, LE0
RET
;-----------------------------------------------
MMENU: DB "51 CLOCK K1--SET",0
MADJ: DB "K2:H K3:M K4:OK",0
MENU:
MOV DPTR,#MMENU
MOV A,#1
CALL LCD_PRINT
RET
;--------------------------
; UPDATE SEC,MIN,HR
TIME_PRO:
MOV A,SEC
MOV B,SEC0
CJNE A,B,TI1 ; TIME CHANGE
JMP TI2
TI1: CALL CONV ; CONV. TO ASCII SHOW TO LCD
MOV SEC0,SEC
TI2: RET
;---------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -