hi các bạn hiện tại mình đang làm cái đồ án vi xử lý làm về đồng hồ LCD như chạy thời gian thực mình đặt trước nó rồi hẹn giờ (giờ với phút thôi)
Trước hết các bạn xem cái video về cái đồng hồ này
Mặc dù code hơi dài nhưng mình đọc qua cũng hỉu chút chút có điều vài chỗ chưa rõ, các bạn chuyên về cái này chắc đọc qua là sẽ hỉu hết được,vì mình không phải chuyên về lĩnh vực này chỉ học cho qua môn nên mang lên đây mong các bác bỏ chút thời gian xem qua giúp mình,cảm ơn nhìu lắm
Mình có một số câu hỏi mún hỏi các bác là :
-Khi mình chọn phút,giờ ah làm sao nó lại nhấp nháy được cái chỗ chọn giờ hoặc phút như trong video phần còn lại thì nó không nhấp nháy
-Làm sao mình xác đinh địa chỉ tức vị trí để mình cần in cái chuôi ra ở LCD vậy,mình có đọc qua về cái LCD bên này thấy nó quy đinh địa chỉ LCD ở phần DDRAM Text LCD nhưng trong code này nó set địa chỉ sao mình không hiểu lắm
-Các bạn có thể giải thích giúp mình ở cái hàm KHOI_TAO_LCD được không
Trước hết các bạn xem cái video về cái đồng hồ này
Mặc dù code hơi dài nhưng mình đọc qua cũng hỉu chút chút có điều vài chỗ chưa rõ, các bạn chuyên về cái này chắc đọc qua là sẽ hỉu hết được,vì mình không phải chuyên về lĩnh vực này chỉ học cho qua môn nên mang lên đây mong các bác bỏ chút thời gian xem qua giúp mình,cảm ơn nhìu lắm
PHP Code:
;KHAI BAO TAI NGUYEN DA SU DUNG
;THANH GHI:R7,R6
;RAM DA MUC DICH:20H, 1FH, 30H, 31H, 32H,33H, 34H
;--------------------------------
;KHAI BAO BIEN
RS EQU P2.0
LCD_E EQU P2.2
LCD_DATA EQU P1
GIO EQU 30H
PHUT EQU 31H
GIAY EQU 32H
GIO_HEN EQU 33H
PHUT_HEN EQU 34H
DEN EQU P3.0
NUT_CHON EQU P3.1
NUT_TANG EQU P3.2
NUT_GIAM EQU P3.3
NUT_HEN EQU P3.4
HEN EQU 1FH
KT_CHAY EQU 20H
;---------------------------------
ORG 0000H
LJMP START
;---------------------------------
ORG 03H ;external interrupt 0
RETI
ORG 0BH ;timer 0 interrupt
RETI
ORG 13H ;external interrupt 1
RETI
ORG 1BH ;timer 1 interrupt
LJMP NGAT_T1
RETI
ORG 23H ;serial port interrupt
RETI
;=====================================
ORG 30H
;=====================================
KHOI_TAO: ;set up control registers
MOV TCON,#00H
MOV TMOD,#00010000B ;timer 0 o che do 1
MOV PSW,#00H
MOV IE,#10001000B ;CHO PHEP NGAT TIMER1
MOV GIO,#23
MOV PHUT,#59
MOV GIAY,#55
MOV GIO_HEN,#0
MOV PHUT_HEN,#0
MOV P0,#0
CLR DEN
SETB HEN
CLR KT_CHAY; SET BANG 1 DE HIEN THI THOI GIAN, CLR DE KHONG HIEN THI THOI GIAN
RET
;-------------------------------------
DELAY_MS:
PUSH 07H
MOV R7,#00H
LOOP_MS:
INC R7
MOV A,R7
CJNE A,#0FAH,LOOP_MS
POP 07H
RET
;-------------------------------------
DELAY_100MS:
PUSH 07
MOV R7,#100
LOOP_100MS:
ACALL DELAY_MS
DJNZ R7,LOOP_100MS
POP 07
RET
;-------------------------------------
DELAY_HS: ; DE LAY 0.5s
PUSH 07
MOV R7,#5
LOOP_HS:
ACALL DELAY_100MS
DJNZ R7,LOOP_HS
POP 07
RET
;-------------------------------------
DELAY_100US:
PUSH 07H
MOV R7,# 50 ; 100 us
DJNZ R7,$
POP 07H
RET
;-------------------------------------
KHOI_TAO_LCD:
MOV A,#38h ;8 BIT - 2 HANG
CALL GHI_LENH
MOV A,#0CH ;BAT LCD ON - TAT CON TRO
CALL GHI_LENH
MOV A,#01h ;XOA MAN HINH
CALL GHI_LENH
MOV A,#80h ;THIET LAP DIA CHI CHO LCD – HANG 1
ACALL GHI_LENH
RET
;-------------------------------------
XOA_LCD:
MOV A,#01H ;XOA MAN HINH
CALL GHI_LENH
MOV A,#80H ;THIET LAP DIA CHI CHO LCD – HANG 1
ACALL GHI_LENH
RET
;-------------------------------------
GHI_LENH: ; Ghi lenh cho LCD
MOV LCD_DATA,A ; CHEP THANH GHI A DEN DATA
CLR RS ; DAT RS = 0 DE GUI LENH
SETB LCD_E ; LCD_E = 1 cho xung cao
ACALL DELAY_100US
CLR LCD_E ; LCD_E = 0 cho xung cao XUONG THAP
ACALL DELAY_MS
RET
;-------------------------------------
GHI_DLIEU: ; GHI DU LIEU RA LCD
MOV LCD_DATA,A ; SAO CHEP THANH GHI A VAO P0
SETB RS ; DAT RS = 1 DE GHI DU LIEU
SETB LCD_E ; DAT LCD_E = 1 CHO XUNG CAO
ACALL DELAY_100US
CLR LCD_E ; CHO LCD_E = 0 CHO XUNG CAO XUONG THAP
ACALL DELAY_MS
RET
;-------------------------------------
;HAM MAIN
;-------------------------------------
;ORG 30H
START:
ACALL KHOI_TAO ;KHOI TAO CAC THANH GHI
MOV TH1,#0B1H
MOV TL1,#0DFH
SETB TR1
ACALL KHOI_TAO_LCD
MOV DPTR, #TEN3
ACALL IN_XAU
ACALL DELAY_HS
ACALL XOA_LCD
LAP:
JB HEN, K_HEN
MOV A,#0C8H
ACALL GHI_LENH
MOV A,#'A'
ACALL GHI_DLIEU
SJMP TIEP_LAP
K_HEN:
MOV A,#0C8H
ACALL GHI_LENH
MOV A,#' '
ACALL GHI_DLIEU
TIEP_LAP:
JB NUT_HEN, KT_CHON
CPL HEN
ACALL DELAY_HS
LJMP LAP
KT_CHON:
JB NUT_CHON,KT_HEN
ACALL CHINH_THOI_GIAN
ACALL CHINH_HEN
ACALL DELAY_HS
KT_HEN:
JB HEN, LAP
MOV A,GIO
CJNE A,GIO_HEN,QUIT
MOV A,PHUT
CJNE A,PHUT_HEN,QUIT
SETB DEN ;CHO DEN NHAP NHAY
ACALL DELAY_HS
CLR DEN
ACALL DELAY_HS
QUIT:
LJMP LAP
;--------------------------------------------------
;GOI NGAT
NGAT_T1:
CLR TR1
MOV TH1,#0B1H
MOV TL1,#0DFH
SETB TR1
INC R1
CJNE R1,#50,TIEP_TUC
MOV R1,#0
ACALL DC_THOI_GIAN
JB KT_CHAY, TIEP_TUC ;KT_CHAY = 0 THI HIEN THI
ACALL HIEN_TG
TIEP_TUC:
RETI
;-------------------------------------
;CAP NHAT THOI GIAN THUC
DC_THOI_GIAN:
INC GIAY
MOV A,GIAY
CJNE A,#60,EXIT_DC_THOI_GIAN
MOV GIAY,#0
;----------------
INC PHUT
MOV A,PHUT
CJNE A,#60,EXIT_DC_THOI_GIAN
MOV PHUT,#0
;----------------
INC GIO
MOV A,GIO
CJNE A,#24,EXIT_DC_THOI_GIAN
MOV GIO,#0
;----------------
EXIT_DC_THOI_GIAN:
RET
;--------------------------------------------------
CHINH_THOI_GIAN:
TIME_OK2:
MOV A,#0C3h ;TAI VI TRI PHUT CHO NHAP NHAY HIEN THI CHINH PHUT
ACALL GHI_LENH
MOV A,#' '
ACALL GHI_DLIEU
MOV A,#' '
ACALL GHI_DLIEU
ACALL DELAY_HS
JB NUT_TANG,QUET_TIME_GIAM2
;NEU AN NUT TANG
MOV A,PHUT
CJNE A,#59,TANG_TIME_PHUT
;NEU PHUT=59
MOV PHUT,#0
SJMP TIME_OK2
TANG_TIME_PHUT:
INC PHUT
SJMP TIME_OK2
QUET_TIME_GIAM2:
JB NUT_GIAM,QUET_TIME_OK2
;NEU AN NUT GIAM
MOV A,PHUT
CJNE A,#00,GIAM_TIME_PHUT
;NEU PHUT=00
MOV PHUT,#59
SJMP TIME_OK2
GIAM_TIME_PHUT:
DEC PHUT
SJMP TIME_OK2
QUET_TIME_OK2:
JB NUT_CHON,TIME_OK2
TIME_OK3:
MOV A,#0C0h ;TAI VI TRI GIO NHAP NHAY HIEN THI CHINH GIO
ACALL GHI_LENH
MOV A,#' '
ACALL GHI_DLIEU
MOV A,#' '
ACALL GHI_DLIEU
ACALL DELAY_HS
;QUET NUT
JB NUT_TANG,QUET_TIME_GIAM3
;NEU AN NUT TANG
MOV A,GIO
CJNE A,#23,TANG_TIME_GIO
;NEU GIO=23
MOV GIO,#0
SJMP TIME_OK3
TANG_TIME_GIO:
INC GIO
SJMP TIME_OK3
;------------------------------------------------
QUET_TIME_GIAM3:
JB NUT_GIAM,QUET_TIME_OK3
;NEU AN NUT GIAM
MOV A,GIO
CJNE A,#00,GIAM_TIME_GIO
;NEU GIAY=00
MOV GIO,#23
SJMP TIME_OK3
GIAM_TIME_GIO:
DEC GIO
SJMP TIME_OK3
QUET_TIME_OK3:
JB NUT_CHON,TIME_OK3
RET
;-------------------------------------------------
CHINH_HEN:
SETB KT_CHAY
ACALL XOA_LCD
ACALL HIEN_HEN
CODE_HEN:
MOV A,#0C3h ; TAI VI TRI HEN THOI GIAN CHO NHAP NHAY PHUT DE HIEN THI CHINH PHUT
ACALL GHI_LENH
MOV A,#' '
ACALL GHI_DLIEU
MOV A,#' '
ACALL GHI_DLIEU
ACALL DELAY_HS
ACALL HIEN_HEN
ACALL DELAY_HS
;QUET NUT
JB NUT_TANG,QUET_NUT_GIAM1
;NEU AN NUT TANG
MOV A,PHUT_HEN
CJNE A,#59,TANG_PHUT_HEN
;NEU PHUT_HEN=59
MOV PHUT_HEN,#0
SJMP CODE_HEN
TANG_PHUT_HEN:
INC PHUT_HEN
SJMP CODE_HEN
QUET_NUT_GIAM1:
JB NUT_GIAM,QUET_NUT_CHON1
;NEU AN NUT GIAM
MOV A,PHUT_HEN
CJNE A,#00,GIAM_PHUT_HEN
;NEU PHUT_HEN=00
MOV PHUT_HEN,#59
SJMP CODE_HEN
GIAM_PHUT_HEN:
DEC PHUT_HEN
SJMP CODE_HEN
QUET_NUT_CHON1:
JB NUT_CHON,CODE_HEN
CHON2:
MOV A,#0C0H ;TAI VI TRI HEN THOI GIAN CHO NHAP NHAY DE HIEN THI HEN GIO
ACALL GHI_LENH
MOV A,#' '
ACALL GHI_DLIEU
MOV A,#' '
ACALL GHI_DLIEU
ACALL DELAY_HS
ACALL HIEN_HEN
ACALL DELAY_HS
;QUET NUT
JB NUT_TANG,QUET_NUT_GIAM2
;NEU AN NUT TANG
MOV A,GIO_HEN
CJNE A,#23,TANG_GIO_HEN
;NEU GIO_HEN=23
MOV GIO_HEN,#0
SJMP CHON2
TANG_GIO_HEN:
INC GIO_HEN
SJMP CHON2
QUET_NUT_GIAM2:
JB NUT_GIAM,QUET_NUT_CHON2
;NEU AN NUT GIAM
MOV A,GIO_HEN
CJNE A,#00,GIAM_GIO_HEN
;NEU GIO_HEN=00
MOV GIO_HEN,#23
SJMP CHON2
GIAM_GIO_HEN:
DEC GIO_HEN
SJMP CHON2
QUET_NUT_CHON2:
JB NUT_CHON,CHON2
CLR KT_CHAY
RET
;--------------------------------------
IN_XAU:
CLR A
MOVC A,@A+DPTR
;INC R0
INC DPTR
CJNE A,#0AH,TTUC1 ;NEU DOC DEN KY TU LF(0AH) THI DUNG LAI
JMP THOAT1
TTUC1:
ACALL GHI_DLIEU
LJMP IN_XAU
THOAT1:
RET
;-----------------------------------
IN_XAU_TG:
MOV A,@R0
INC R0
CJNE A,#0AH,TTUC2 ;NEU DOC DEN KY TU LF(0AH) THI DUNG LAI
JMP THOAT2
TTUC2:
ACALL GHI_DLIEU
LJMP IN_XAU_TG
THOAT2:
RET
;-----------------------------------
TAO_XAU_TG:
MOV A,GIO
ACALL XAU_CHUC
MOV 35H,A
MOV A,GIO
ACALL XAU_DVI
MOV 36H,A
MOV 37H,#':'
MOV A,PHUT
ACALL XAU_CHUC
MOV 38H,A
MOV A,PHUT
ACALL XAU_DVI
MOV 39H,A
MOV 3AH,#':'
MOV A,GIAY
ACALL XAU_CHUC
MOV 3BH,A
MOV A,GIAY
ACALL XAU_DVI
MOV 3CH,A
MOV 3DH,#0AH
RET
;-----------------------------------
TAO_XAU_HEN:
MOV A,GIO_HEN
ACALL XAU_CHUC
MOV 35H,A
MOV A,GIO_HEN
ACALL XAU_DVI
MOV 36H,A
MOV 37H,#':'
MOV A,PHUT_HEN
ACALL XAU_CHUC
MOV 38H,A
MOV A,PHUT_HEN
ACALL XAU_DVI
MOV 39H,A
MOV 3AH,#0AH
RET
;-----------------------------------
HIEN_TG:
MOV A,#80h ;THIET LAP DIA CHI CHO LCD – HANG 1
ACALL GHI_LENH
MOV R0,#35H
MOV DPTR,#TEN1
ACALL IN_XAU
MOV A,#0C0h ;THIET LAP DIA CHI CHO LCD – HANG 1
ACALL GHI_LENH
ACALL TAO_XAU_TG
ACALL IN_XAU_TG
RET
;-----------------------------------
HIEN_HEN:
MOV A,#80h ;THIET LAP DIA CHI CHO LCD – HANG 1
ACALL GHI_LENH
MOV R0,#35H
MOV DPTR,#TEN2
ACALL IN_XAU
MOV A,#0C0h ;THIET LAP DIA CHI CHO LCD – HANG 1
ACALL GHI_LENH
ACALL TAO_XAU_HEN
ACALL IN_XAU_TG
RET
;-----------------------------------
XAU_CHUC:
MOV B,#10
DIV AB
ACALL DOI_MA
RET
;-------------------------------------
XAU_DVI:
MOV B,#10
DIV AB
MOV A,B
ACALL DOI_MA
RET
;-----------------------------------
DOI_MA:
INC A
MOVC A,@A+PC
RET
;-----------------------------------
;TEXT SE XUAT HIEN TREN LCD
DB 00110000B,00110001B,00110010B,00110011B,00110100B
DB 00110101B,00110110B,00110111B,00111000B,00111001B
TEN1: DB 'THOI GIAN:',0AH
TEN2: DB 'HEN GIO:',0AH
TEN3: DB 'By thanhlikes09',0AH
;------------------------------------
END
-Khi mình chọn phút,giờ ah làm sao nó lại nhấp nháy được cái chỗ chọn giờ hoặc phút như trong video phần còn lại thì nó không nhấp nháy
-Làm sao mình xác đinh địa chỉ tức vị trí để mình cần in cái chuôi ra ở LCD vậy,mình có đọc qua về cái LCD bên này thấy nó quy đinh địa chỉ LCD ở phần DDRAM Text LCD nhưng trong code này nó set địa chỉ sao mình không hiểu lắm
-Các bạn có thể giải thích giúp mình ở cái hàm KHOI_TAO_LCD được không
Comment