⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lin.asm

📁 AT89c52+1602LCD 显示时间
💻 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 + -