Thông báo

Collapse
No announcement yet.

Code+Simulation : Đồng hồ số hiển thị gian + nhiệt độ + báo thức

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Code+Simulation : Đồng hồ số hiển thị gian + nhiệt độ + báo thức

    Xin chào các bác !

    Em đang làm project : " Đồng hồ số hiển thị gian + nhiệt độ + báo thức " dùng RTC DS1307 và LM35.

    Hiện tại em đã hoàn thành code của chương trình này bằng ASM.
    Chương trình có các chức năng cơ bản như sau:
    1. Hiển thị thời gian, ngày tháng năm theo lịch dương ( Bằng cách quét LED 7 thanh)
    2. Hiển thị nhiệt độ ( trong phần này có phần xử lý số liệu trích mẫu nhiệt độ để đưa ra kết quả)
    3. Cài đặt thời gian và báo thức bằng phím bấm

    Code:
       ; KHAI BAO BIEN BAN DAU
    ;====================================
    ;==== DINH NGHIA CAC THANH GHI ======
    ;====================================
    FLAG_MODE      DATA 30H
    FLAG_SET       DATA 31H
    FLAG_ALARM     DATA 32H
    PERCENT_SEC    DATA 33H
    VARI_JUMP      DATA 34H
    PULSE_JUMP     DATA 35H
    TEMP           DATA 36H
    SEC            DATA 37H
    MIN            DATA 38H
    HOUR           DATA 39H
    DAY            DATA 3AH
    DATE           DATA 3BH
    MONTH          DATA 3CH
    YEAR           DATA 3DH
    MIN_ALARM      DATA 3EH
    HOUR_ALARM     DATA 3FH
    D0_SEC         DATA 40H; Don vi cua giay
    D1_SEC         DATA 41H; Hang chuc cua giay
    D0_MIN         DATA 42H
    D1_MIN         DATA 43H
    D0_HOUR        DATA 44H
    D1_HOUR        DATA 45H
    D0_DATE        DATA 46H
    D1_DATE        DATA 47H
    D0_MONTH       DATA 48H
    D1_MONTH       DATA 49H
    D0_YEAR        DATA 4AH
    D1_YEAR        DATA 4BH
    D0_TEMP        DATA 4CH
    D1_TEMP        DATA 4DH
    D2_TEMP        DATA 4EH
    D0_MIN_ALARM   DATA 4FH
    D1_MIN_ALARM   DATA 50H
    D0_HOUR_ALARM  DATA 51H
    D1_HOUR_ALARM  DATA 52H
    
    ;====================================
    ;======= DINH NGHIA CAC BIT =========
    ;====================================
    CS              BIT    P2.4
    READ            BIT    P2.5
    WRITE           BIT    P2.6
    IR              BIT    P3.1
    REST_LED        BIT    P3.0
    SW_1            BIT    P3.2
    SW_2		    BIT	   P3.3
    SW_3		    BIT	   P3.4
    ALARM_BUZZ		BIT	   P3.5
    SCL             BIT    P3.6
    SDA             BIT    P3.7
    ;===================================
    ;====== DINH NGHIA CA HANG SO=======
    ;===================================
    LED_DATA        EQU  P0
    BYTE_W          EQU  11010000B; BYTE 0D0H DE THONG BAO THAO TAC GHI
    BYTE_R          EQU  11010001B; BYTE 0D01 DE THONG BAO THAO TAC DOC
    ADD_LOW         EQU  53H
    DATA_DS         EQU  54H
    
    
    ;========================================
    ORG 0000H
    LJMP INITIAL_ALL
    ;========================================
    ORG 000BH
    LJMP INTERRUPT_TIMER
    ;========================================
    
    
    
    ORG 0030H
    INITIAL_ALL:
    ;==================	KICH HOAT CHUONG TRINH NGAT
       MOV IE,#10001010B   
    ;=================  KICH HOAT TIMER
       MOV TMOD,#11H
       MOV TL0,#00H
       MOV TH0,#0DCH
       SETB TR0
    ;================
       MOV PERCENT_SEC  ,#0
       MOV VARI_JUMP    ,#0
       MOV PULSE_JUMP   ,#0
       MOV TEMP         ,#0
       MOV SEC          ,#0
       MOV MIN          ,#0
       MOV HOUR         ,#0
       MOV DAY          ,#0
       MOV DATE         ,#0
       MOV MONTH        ,#0
       MOV YEAR         ,#0
       MOV FLAG_SET     ,#0
       CLR ALARM_BUZZ
    READ_INTIAL_ALARM:
    ;============     Read FLAG_ALARM tu DS1307
       MOV    ADD_LOW,#08H
       LCALL  READ_BYTE
       MOV    A,DATA_DS
       CALL   BCD_HEX
       MOV    FLAG_ALARM,A
       LCALL  I2C_STOP
    ;=========== 	 Read MIN_ALARM tu DS1307
       MOV    ADD_LOW,#09H
       LCALL  READ_BYTE
       MOV    A,DATA_DS
       CALL   BCD_HEX
       MOV    MIN_ALARM,A
       LCALL  I2C_STOP
    ;===========    Read HOUR_ALARM tu DS1307
       MOV    ADD_LOW,#0AH
       LCALL  READ_BYTE
       MOV    A,DATA_DS
       CALL   BCD_HEX
       MOV    HOUR_ALARM,A
       LCALL  I2C_STOP
    ;===========================================
    MAIN:
    ;=========================================== Chuong Trinh tai day
       MOV   A,FLAG_MODE
       CJNE  A,#0,UPDATE_TIME_ALARM    
       LCALL READ_DATA_DS1307
       LCALL CHECK_ALARM_BUZZ
       LCALL DISPLAY_LED
       LCALL READ_DATA_ADC0804
       LCALL DISPLAY_LED
    UPDATE_TIME_ALARM:
    ;================= Flag MODE khac khong thi dang o che do cai dat gio va ba'o thu'c
       LCALL SCAN_KEY
       SJMP  MAIN
    
    ;========================================== 1. CHUONG TRINH DOC DU LIEU TU RTC DS1307 ================
    READ_DATA_DS1307:
    ;================================================= =READS SECONDS
       MOV   ADD_LOW,#00H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       LCALL BCD_HEX
       MOV   SEC,A
       LCALL I2C_STOP
    ;================================================= =READS MINUTES
       MOV   ADD_LOW,#01H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       LCALL BCD_HEX
       MOV   MIN,A
       LCALL I2C_STOP
    ;================================================= =READS HOURS
       MOV   ADD_LOW,#02H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       LCALL BCD_HEX
       MOV   HOUR,A
       LCALL I2C_STOP
    ;================================================= = READ DAY
       MOV   ADD_LOW,#03H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       CALL  BCD_HEX
       MOV   DAY,A
       LCALL I2C_STOP
    ;================================================= = READ DATE 
       MOV   ADD_LOW,#04H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       CALL  BCD_HEX
       MOV   DATE,A
       LCALL I2C_STOP
    ;================================================= = READ MONTH
       MOV   ADD_LOW,#05H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       CALL  BCD_HEX
       MOV   MONTH,A
       LCALL I2C_STOP
    ;================================================= = READ YEAR
       MOV   ADD_LOW,#06H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       CALL  BCD_HEX
       MOV   YEAR,A
       LCALL I2C_STOP
    RET
    
    
    ;=========================================================================
    ;===================         CHUONG TRINH CON GIAO TIEP I2C VOI DS1307            ===========
    ;===================== 1.1 CHUONG TRINH CON TAO " STOP CONDITIONAL " TRONG I2C =============
    I2C_STOP:
       CLR    SDA
       SETB   SCL
       NOP
       SETB   SDA
    RET
    ;==================== 1.2 CHUONG TRINH CON DE GHI DATA TRONG  I2C ==============
    WRITE_BYTE:
       CLR    SDA ;START BIT
       CLR    SCL
       MOV    A,#BYTE_W ;SEND CONTROL BYTE
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,WRITE_BYTE ;LOOP UNTIL BUSY
       CLR    SCL
       MOV    A,ADD_LOW ;SEND ADDRESS LOW
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,WRITE_BYTE ;LOOP UNTIL BUSY
       CLR    SCL
       MOV    A,DATA_DS ;SEND DATA
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,WRITE_BYTE ;LOOP UNTIL BUSY
       CLR    SDA
       CLR    SCL
       SETB   SCL ;STOP BIT
       SETB   SDA
    RET
    ;========================= CHUONG TRINH CON DE GUI 1 BYTE  TRONG I2C =======================
    LOOP_WRITE_BYTE:
       PUSH  02H
       MOV   R2,#08H
    LOOP_SEND:
       RLC   A
       MOV   SDA,C
       SETB  SCL
       CLR   SCL
       DJNZ  R2,LOOP_SEND
       POP 02H
    RET
    ;======================== 1.3 CHUONG TRINH CON DE DOC DATA TRONG  I2C  ============================
    READ_BYTE:
       CLR    SDA ;START BIT
       CLR    SCL
       MOV    A,#BYTE_W ;SEND CONTROL BYTE
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,READ_BYTE ;LOOP UNTIL BUSY
       CLR    SCL
       MOV    A,ADD_LOW ;SEND ADDRESS LOW
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,READ_BYTE ;LOOP UNTIL BUSY
       CLR    SCL
       SETB   SCL
       SETB   SDA
       CLR    SDA ;START BIT
       CLR    SCL
       MOV    A,#BYTE_R ;SEND CONTROL BYTE
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,READ_BYTE ;LOOP UNTIL BUSY
       CLR    SCL
       LCALL  LOOP_READ
       SETB   SDA
       SETB   SCL
       CLR    SCL
       SETB   SCL ;STOP BIT
       SETB   SDA
    RET
    ;========================= CHUONG TRINH CON DE DOC 1 BYTE  TRONG I2C =======================
    LOOP_READ:  
       PUSH    02H
       MOV     R2,#08H
    LOOP_READ1:
       SETB    SCL
       MOV     C,SDA
       CLR     SCL
       RLC     A
       DJNZ    R2,LOOP_READ1
       MOV     DATA_DS,A
       POP     02H
    RET
    
    
    
    
    ;=====================================  2. Chuong trinh kiem tra bao thuc ===================
    CHECK_ALARM_BUZZ:
        MOV    A,FLAG_ALARM
        CJNE   A,#0,CHECK_HOUR_ALARM_BUZZ
        LJMP   ALARM_NOT_BUZZ
    CHECK_HOUR_ALARM_BUZZ:
        MOV    A,HOUR_ALARM
        CJNE   A,HOUR,EXIT_CHECK_ALARM_BUZZ
    CHECK_MIN_ALARM_BUZZ:
        MOV    A,MIN_ALARM
        CJNE   A,MIN,EXIT_CHECK_ALARM_BUZZ
        SETB   ALARM_BUZZ
    	SJMP   EXIT_CHECK_ALARM_BUZZ
    ALARM_NOT_BUZZ:
        CLR    ALARM_BUZZ
    EXIT_CHECK_ALARM_BUZZ:
    RET
    
    ;======================== 3.1 CHUONG TRINH DOC DU LIEU TU ADC 0804 ==============================
    READ_DATA_ADC0804:
        LCALL NHAPSOLIEU
        LCALL XULYSOLIEU
    ;======================== CHUONG TRINH NAY SU DUNG RAM TU VUNG 58H DEN 6FH DE TINH TOAN =========
    
    ;=============================3.1.1 NHAP 8 MAU SO LIEU VAO RAM===================================
    NHAPSOLIEU:  
       MOV   R0,#58H
    LOOPNSL:
       ACALL ADC
       MOV   @R0,A
       INC   R0
       CJNE  R0,#60H,LOOPNSL
    RET
    ;================================ CHUONG TRINH CON DOC DU LIEU TU ADC0804==============
    ADC:
       ACALL CONVERT
       ACALL READADC
    RET
    ;=================================
    CONVERT:
       SETB  IR 
       CLR   CS
       CLR   WRITE
       NOP
       SETB  WRITE
       SETB  CS
       JB    IR,$
    RET
    ;=================================
    READADC:
      CLR   CS
      CLR   READ
      SETB  READ
      MOV   A,P1
      CLR   READ
      SETB  CS
    RET
    ;======================== 3.2 CHUONG TRINH XU LIEU DU LIEU TREN 8051 ==============================
    XULYSOLIEU:
      LCALL TINHTBC
      LCALL XUATSOLIEU
    RET
    ;=======================3.2.1 TINH TRUNG BINH CONG ==============================
    TINHTBC:
      ACALL CHIATUNGMAU
      ACALL TINHTHUONGVAPHANDU
    RET
    ;======================= CHIA TUNG MAU SO LIEU CHO 8 ===================
    
    CHIATUNGMAU:
      MOV A,#58H
      MOV R0,#60H ; BAT DAU NGAN NHO CHUA THUONG 
      MOV R1,#68H ; BAT DAU NGAN NHO CHUA SO DU
    LOOPPC:
      MOV R7,A
      MOV B,R0
      MOV R0,A
      MOV A,@R0
      MOV R0,B
      MOV B,#8
      DIV AB
      MOV @R0,A
      MOV A,B
      MOV @R1,A
      MOV A,R7
      INC A
      INC R0
      INC R1
      CJNE R0,#68H,LOOPPC
    RET
    ;===================TINH THUONG VA PHAN DU THUC SU PHEP CHIA TRUNG BINH CONG ==============
    TINHTHUONGVAPHANDU:
      ACALL TINHPHANDUCUATRUNGBINHCONG8SO
      ACALL TINHTHUONGCUATRUNGBINHCONG8SO
    RET
    ;==========================================
    TINHPHANDUCUATRUNGBINHCONG8SO:
      MOV R1,#68H
      MOV A,#0
      MOV R5,#0
      MOV R7,#8
    LOOPTPD:
      MOV R6,A
      MOV A,@R1
      ADD A,R5
      MOV R5,A
      MOV A,R6
      INC R1
      CJNE R1,#70H,LOOPTPD
      MOV A,R5
      MOV B,#8
      DIV AB
      MOV R3,A; PHAN THEM VAO THUONG THUC SU CUA TRUNG BINH CONG
      MOV R4,B; PHAN DU THUC SU CUA TRUNG BINH CONG
    RET
    ;========================================
    TINHTHUONGCUATRUNGBINHCONG8SO:
      MOV R0,#60H
      MOV R7,#0
    LOOPTT:
      MOV A,@R0
      ADD A,R7
      MOV R7,A
      INC R0
      CJNE R0,#68H,LOOPTT
      MOV A,R7
      ADD A,R3
      MOV R3,A
    RET
    
    
    ;===================  3.2.2 XUAT SO LIEU =====================
    XUATSOLIEU:
       LCALL SAUDAUPHAY
       LCALL HANGTRAM
       LCALL HANGCHUCVADONVI
    RET
    ;====================================
    SAUDAUPHAY:
      MOV A,R4
      MOV B,#10
      MUL AB
      MOV B,#8
      DIV AB
      MOV D0_TEMP,A  
      MOV R5,B
    RET
    HANGTRAM:
      MOV A,R3
      MOV B,#100
      DIV AB
      MOV R1,A
      MOV R2,B
    RET
    HANGCHUCVADONVI:
      MOV A,R2
      MOV B,#10
      DIV AB
      MOV D2_TEMP,A
      MOV D1_TEMP,B
    RET
    ;==================================================================
    ;==================== 4.CHUONG TRINH HIEN THI =====================
    DISPLAY_LED:
       MOV   A,FLAG_MODE
    CHECK_FLAG_MODE_DISPLAY_0:
    ;========================== Kiem tra xem flag_mode dang o che do nao
      CJNE   A,#0,CHECK_FLAG_MODE_DISPLAY_1
      LCALL  DISPLAY_NORMAL
      LJMP   EXIT_DISPLAY_LED
    CHECK_FLAG_MODE_DISPLAY_1:
      CJNE   A,#1,CHECK_FLAG_MODE_DISPLAY_2
      LJMP   DISPLAY_BLINK_TIME
    CHECK_FLAG_MODE_DISPLAY_2:
      LJMP   DISPLAY_BLINK_ALARM
    ;======================================== MODE DISPLAY TIME
    DISPLAY_BLINK_TIME: 
    ;========================== Che do hien thi thoi gian co nha'y hoac khong nha'y
      MOV    A,VARI_JUMP
      CJNE   A,#0,CHECK_DISPLAY_BLINK_TIME
      LCALL  DISPLAY_NORMAL
      AJMP   EXIT_DISPLAY_LED
    CHECK_DISPLAY_BLINK_TIME:
      CALL   BLINK_TIME
      JMP    DISPLAY_BLINK_TIME
    EXIT_DISPLAY_LED :
    RET
    ;====================================  MODE DISPLAY ALARM
    DISPLAY_BLINK_ALARM:
      MOV    A,VARI_JUMP
      CJNE   A,#0,CHECK_DISPLAY_BLINK_ALARM
      LJMP   DISPLAY_ALARM_NORMAL
    CHECK_DISPLAY_BLINK_ALARM:
      LCALL  BLINK_ALARM
      LJMP    DISPLAY_BLINK_ALARM
    ;========================================= CHUONG TRINH CON NHAY MODE TIME=============
    DISPLAY_NORMAL:
    ;=================== Hien thi thoi gian khong nha'y
      LCALL DISPLAY_TEMP
      LCALL DISPLAY_SEC
      LCALL DISPLAY_MIN
      LCALL DISPLAY_HOUR
      LCALL DISPLAY_DAY
      LCALL DISPLAY_DATE
      LCALL DISPLAY_MONTH
      LCALL DISPLAY_YEAR
    RET
    ;=================================
    BLINK_TIME:
    ;================== Hien thi thoi gian co nha'y bang cach kiem tra gia tri flag_set
       MOV   A,FLAG_SET
    ;================== NHAY 2 LED PHUT =======
       CJNE  A,#1,CHECK_FLAG_BLINK_1 
       LCALL DISPLAY_SEC
    ;=====
       MOV   P2,#5
       LCALL DISPLAY_DOT_LED
       MOV   P2,#6
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_HOUR
       LCALL DISPLAY_DAY
       LCALL DISPLAY_DATE
       LCALL DISPLAY_MONTH
       LCALL DISPLAY_YEAR
       LCALL DISPLAY_TEMP
    ;================== NHAY 2 LED GIO =======
    CHECK_FLAG_BLINK_1 :
       MOV   A,FLAG_SET
       CJNE  A,#2,CHECK_FLAG_BLINK_2
       LCALL DISPLAY_SEC
       LCALL DISPLAY_MIN
    ;=====
       MOV   P2,#7
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_DAY
       LCALL DISPLAY_DATE
       LCALL DISPLAY_MONTH
       LCALL DISPLAY_YEAR
       LCALL DISPLAY_TEMP
    ;================== NHAY LED THU =======
    CHECK_FLAG_BLINK_2:
       MOV A,FLAG_SET
       CJNE A,#3,CHECK_FLAG_BLINK_3
       LCALL DISPLAY_SEC
       LCALL DISPLAY_MIN
       LCALL DISPLAY_HOUR
       LCALL DISPLAY_DATE
       LCALL DISPLAY_MONTH
       LCALL DISPLAY_YEAR
       LCALL DISPLAY_TEMP
    ;================== NHAY 2 LED NGAY =======
    CHECK_FLAG_BLINK_3:
       MOV   A,FLAG_SET
       CJNE  A,#4,CHECK_FLAG_BLINK_4
       LCALL DISPLAY_SEC
       LCALL DISPLAY_MIN
       LCALL DISPLAY_HOUR
       LCALL DISPLAY_DAY
    ;=====
       MOV   P2,#13
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_MONTH
       LCALL DISPLAY_YEAR
       LCALL DISPLAY_TEMP
    ;================== NHAY 2 LED THANG =======
    CHECK_FLAG_BLINK_4:
       MOV   A,FLAG_SET
       CJNE  A,#5,CHECK_FLAG_BLINK_5
       LCALL DISPLAY_SEC
       LCALL DISPLAY_MIN
       LCALL DISPLAY_HOUR
       LCALL DISPLAY_DAY
       LCALL DISPLAY_DATE
    ;=====
       MOV   P2,#11
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_YEAR
       LCALL DISPLAY_TEMP
    ;================== NHAY 2 LED NAM =======
    CHECK_FLAG_BLINK_5:
       MOV   A,FLAG_SET
       CJNE  A,#6,EXIT_BLINK
       LCALL DISPLAY_SEC
       LCALL DISPLAY_MIN
       LCALL DISPLAY_HOUR
       LCALL DISPLAY_DAY
       LCALL DISPLAY_DATE
       LCALL DISPLAY_MONTH
       LCALL DISPLAY_TEMP
    EXIT_BLINK:
    RET
    ;=================================	CHUONG TRINH CON HIEN THI CAC LED =============================
    DISPLAY_SEC:
       MOV    A,D0_SEC
       MOV    DPTR,#MALED_NORMAL
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#3
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    ;==========
       MOV    A,D1_SEC
       MOV    DPTR,#MALED_NGUOC_DP 
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#4
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;=================================
    DISPLAY_MIN:
       MOV    A,D0_MIN
       MOV    DPTR,#MALED_DP 
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#5
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    ;============
       MOV    A,D1_MIN
       MOV    DPTR,#MALED_NGUOC_DP 
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#6
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;=================================
    DISPLAY_HOUR:
       MOV    A,D0_HOUR
       MOV    DPTR,#MALED_DP 
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#7
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    ;============
       MOV    A,D1_HOUR
       MOV    DPTR,#MALED_NORMAL
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#8
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;================================
    DISPLAY_DAY:
       MOV    A,DAY
       MOV    DPTR,#MALED_NORMAL
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#15
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;=================================
    DISPLAY_DATE:
       MOV    A,D0_DATE
       MOV    DPTR,#MALED_DP
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#13
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    ;============
       MOV    A,D1_DATE
       MOV    DPTR,#MALED_NORMAL
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#14
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;=================================
    DISPLAY_MONTH:
       MOV    A,D0_MONTH
       MOV    DPTR,#MALED_DP
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#11
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    ;============
       MOV    A,D1_MONTH
       MOV    DPTR,#MALED_NORMAL 
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#12
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;=================================
    DISPLAY_YEAR:
       MOV   A,D0_YEAR
       MOV   DPTR,#MALED_NORMAL 
       MOVC  A,@A+DPTR
       MOV   LED_DATA,A
       MOV   P2,#9
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;============
       MOV   A,D1_YEAR
       MOV   DPTR,#MALED_NORMAL 
       MOVC  A,@A+DPTR
       MOV   LED_DATA,A
       MOV   P2,#10
       SETB  REST_LED
       LCALL DL
       CLR REST_LED
    RET
    DISPLAY_TEMP:
       MOV   A,D0_TEMP
       MOV   DPTR,#MALED_NORMAL
       MOVC  A,@A+DPTR
       MOV   LED_DATA,A
       MOV   P2,#0
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;============
       MOV   A,D1_TEMP
       MOV   DPTR,#MALED_DP 
       MOVC  A,@A+DPTR
       MOV   LED_DATA,A
       MOV   P2,#1
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;=============
       MOV   A,D2_TEMP
       MOV   DPTR,#MALED_NORMAL  
       MOVC  A,@A+DPTR
       MOV   LED_DATA,A
       MOV   P2,#2
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    RET
    ;====================================== CHUONG TRINH CON MODE ALARM ===========================
    ;==================
    BLINK_ALARM:
    ;=================================
       MOV   A,FLAG_SET
       CJNE  A,#0,CHECK_FLAG_BLINK_ALARM_0
    DISPLAY_MODE_ALARM:
       LCALL DISPLAY_ALARM_AL
       LCALL DISPLAY_MIN_ALARM
       LCALL DISPLAY_HOUR_ALARM
       LCALL DISPLAY_TEMP
    
    ;================== NHAY 2 LED PHUT =======
    CHECK_FLAG_BLINK_ALARM_0:
       MOV  A,FLAG_SET
       CJNE  A,#1,CHECK_FLAG_BLINK_ALARM_1 
       LCALL DISPLAY_ALARM_AL
       LCALL DISPLAY_ALARM_ON_OFF
    ;=====
       MOV   P2,#6
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_HOUR_ALARM
       LCALL DISPLAY_TEMP
    ;================== NHAY 2 LED GIO =======
    CHECK_FLAG_BLINK_ALARM_1 :
       MOV   A,FLAG_SET
       CJNE  A,#2,EXIT_DISPLAY_FLAG_ALARM
       LCALL DISPLAY_ALARM_AL
       LCALL DISPLAY_ALARM_ON_OFF
       LCALL DISPLAY_MIN_ALARM
    ;=====
       MOV   P2,#7
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_TEMP
    EXIT_DISPLAY_FLAG_ALARM:
    RET
    ;=================================
    DISPLAY_ALARM_NORMAL:
    ;===================== Hien thi o che do Alarm khong nha'y LED
        LCALL DISPLAY_ALARM_AL
        LCALL DISPLAY_ALARM_ON_OFF
        LCALL DISPLAY_MIN_ALARM
        LCALL DISPLAY_HOUR_ALARM
        LCALL DISPLAY_TEMP
    RET
    ;==============================
    DISPLAY_ALARM_AL:
    ;======================== TAO CHU A================ 
       MOV   LED_DATA,#88H
       MOV   P2,#14
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;======================= TAO CHU L=================
       MOV   LED_DATA,#0C7H
       MOV   P2,#13
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    RET
    ;===========================
    DISPLAY_ALARM_ON_OFF:
    ;============== Flag_alarm = 0 thi hien OFF, Flag_alarm=1 thi hien ON
       MOV   A,FLAG_ALARM
       CJNE  A,#0,DISPLAY_ALARM_ON
    DISPLAY_ALARM_OFF:
    ;======= TAO CHU 0======
       MOV   LED_DATA,#0C0H
       MOV   P2,#12
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;======== TAO CHU F =====
       MOV   LED_DATA,#8EH
       MOV   P2,#11
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;======= TAO CHU F ======
       MOV   LED_DATA,#8EH
       MOV   P2,#10
       SETB  REST_LED
       LCALL DL
       CLR REST_LED
    RET
    ;=====================
    DISPLAY_ALARM_ON:
    ;===================== TAO CHU 0===================
       MOV   LED_DATA,#0C0H
       MOV   P2,#12
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;=================== TAO CHU N=====================
       MOV   LED_DATA,#0C8H
       MOV   P2,#11
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    RET
    ;=====================
    DISPLAY_MIN_ALARM:
      MOV   A,D0_MIN_ALARM
      MOV   DPTR,#MALED_NORMAL 
      MOVC  A,@A+DPTR
      MOV   LED_DATA,A
      MOV   P2,#5
      SETB  REST_LED
      LCALL DL
      CLR   REST_LED
    ;============
      MOV   A,D1_MIN_ALARM
      MOV   DPTR,#MALED_NGUOC_DP 
      MOVC  A,@A+DPTR
      MOV   LED_DATA,A
      MOV   P2,#6
      SETB  REST_LED
      LCALL DL
      CLR   REST_LED
    RET
    ;==========================
    DISPLAY_HOUR_ALARM:
      MOV   A,D0_HOUR_ALARM
      MOV   DPTR,#MALED_DP 
      MOVC  A,@A+DPTR
      MOV   LED_DATA,A
      MOV   P2,#7
      SETB  REST_LED
      LCALL DL
      CLR   REST_LED
    ;============
      MOV   A,D1_HOUR_ALARM
      MOV   DPTR,#MALED_NORMAL 
      MOVC  A,@A+DPTR
      MOV   LED_DATA,A
      MOV   P2,#8
      SETB  REST_LED
      LCALL DL
      CLR   REST_LED
    RET
    ;================
    DISPLAY_DOT_LED:
       MOV   LED_DATA,#07FH
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    RET
    ;================================= CHUONG TRINH CON DELAY TRONG KHAU HIEN THI ================
    DL:
      MOV   R7,#200
      DJNZ  R7,$
    RET
    
    ;=============================== CHUONG TRINH CON CONVERT CAC KIEU DU LIEU =============
    BCD_HEX:
      MOV   B,#10H
      DIV   AB
      MOV   TEMP,B ;CAT HANG DON VI
      MOV   B,#10
      MUL   AB
      ADD   A,TEMP
    RET
    ;==========================================
    HEX_BCD:
    ;==========================================
      MOV  B,#10
      DIV  AB
      MOV  TEMP,B ;CAT HANG DON VI
      MOV  B,#10H
      MUL  AB
      ADD  A,TEMP
    RET
    ;===============================================================
    ;============================= CHUONG TRINH NGAT TIMER==========
    INTERRUPT_TIMER :
      INC  PULSE_JUMP
      INC  PERCENT_SEC ;DAT TIMER CHAY 1/100 GIAY
      MOV  TL0,#0H
      MOV  TH0,#0DCH
      SETB TR0
    ;===============
      PUSH ACC
      PUSH PSW ;THANH GHI TRANG TH?I CHUONG TR?NH
      PUSH B
    ;==========
      MOV  A,PULSE_JUMP ;TAO XUNG NHAP NHAY = 1/4 GIAY
      CJNE A,#25,INTERRUPT_TIMER_1
      MOV  PULSE_JUMP,#0
      INC  VARI_JUMP
      MOV  A,VARI_JUMP
      CJNE A,#3,INTERRUPT_TIMER_1
      MOV  VARI_JUMP,#0
    ;=========
    INTERRUPT_TIMER_1:
      MOV  A,PERCENT_SEC ;KIEM TRA BIEN PHAN_TRAM_GIAY - THOAT KHOI NGAT TIME0 NEU KHONG =
      CJNE A,#100,EXIT_INTERRUPT_TIMER
      MOV  PERCENT_SEC,#0 ;NEU = 100 TH? SET BIEN NAY = 0
    ;=========
    EXIT_INTERRUPT_TIMER:
      LCALL TACHSO
      POP   B
      POP   PSW
      POP   ACC
    RETI
    ;=====================================================================
    ;=====================================================================
    TACHSO:
    ;============ TACH GIAY	==========
       MOV A,SEC ;LAN LUOT CHIA CAC BIEN: GIAY, PHUT, GIO CHO 10
       MOV B,#10 ;DE TACH PHAN DON VI VA HANG CHUC RA, DE CAT RIENG VAO CAC BIEN TUONG UNG.
       DIV AB ;PHAN NGUYEN TRONG A, PHAN DU TRONG B
       MOV D1_SEC,A ;LUU LAI HANG CHUC GIAY
       MOV D0_SEC,B ;LUU LAI DON VI GIAY
    ;==========	 TACH PHUT	==========
       MOV A,MIN
       MOV B,#10
       DIV AB
       MOV D1_MIN,A
       MOV D0_MIN,B
    ;==========	  TACH PHUT	   ==========
       MOV A,HOUR
       MOV B,#10
       DIV AB
       MOV D1_HOUR,A
       MOV D0_HOUR,B
    ;==========	  TACH NGAY		==========
       MOV A,DATE
       MOV B,#10
       DIV AB
       MOV D1_DATE,A
       MOV D0_DATE,B
    ;==========	   TACH THANG	 ==========
       MOV A,MONTH
       MOV B,#10
       DIV AB
       MOV D1_MONTH,A
       MOV D0_MONTH,B
    ;==========	TACH NAM	   ==========
       MOV A,YEAR
       MOV B,#10
       DIV AB
       MOV D1_YEAR,A
       MOV D0_YEAR,B
    
    ;==========	 TACH PHUT CUA ALARM	==========
       MOV A,MIN_ALARM
       MOV B,#10
       DIV AB
       MOV D1_MIN_ALARM,A
       MOV D0_MIN_ALARM,B
    ;==========	  TACH GIO CUA ALARM   ==========
       MOV A,HOUR_ALARM
       MOV B,#10
       DIV AB
       MOV D1_HOUR_ALARM,A
       MOV D0_HOUR_ALARM,B
    RET
    ;====================================================================================================
    ;=======================================5. Chuong trinh kiem tra phim bam============================
    SCAN_KEY:
    ;==================================================
    SW1:
       JB   SW_1,SW2
       INC  FLAG_MODE
       MOV  A,FLAG_MODE
       CJNE A,#1,CHECK_MODE
       MOV  FLAG_SET,#1
       SJMP MODE_DONE
    CHECK_MODE:
       CJNE  A,#2,CHECK_MODE_OUT
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LCALL UPDATE_TIME
    INTIAL_MODE_ALARM:
       MOV   FLAG_SET,#0
       SJMP  MODE_DONE
    CHECK_MODE_OUT:
       CJNE   A,#3,MODE_DONE
       MOV    FLAG_MODE,#0
       LCALL  UPDATE_ALARM
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LJMP   NOKEY
    MODE_DONE:
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       SJMP   SW2
    ;=============================
    SW2:
       JB     SW_2,SW3
       MOV    A,FLAG_MODE
       CJNE   A,#1,MODE_ALARM
    ;=================
    MODE_TIME:
       INC    FLAG_SET
       MOV    A,FLAG_SET
       CJNE   A,#7,MODE_TIME_DONE
       MOV    FLAG_SET,#1
    MODE_TIME_DONE:
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LJMP   SW3
    ;==================
    MODE_ALARM:
       INC    FLAG_SET
       MOV    A,FLAG_SET
       CJNE   A,#3,MODE_ALARM_DONE
       MOV    FLAG_SET,#0
    MODE_ALARM_DONE:
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LJMP   SW3
    ;==================
    SW3:
      JB     SW_3,NOKEY
      MOV    A,FLAG_MODE ; CHECK MODE
      CJNE   A,#1,MODE_ALARM_INC
    ;================================
    MODE_TIME_INC:
      MOV    A,FLAG_SET ; CHECK DATA SET
    CHECK_MODE_TIME_INC:
    ;==================
    CHECK_MODE_TIME_INC_1:
      CJNE   A,#1,CHECK_MODE_TIME_INC_2
      LJMP   TIME_INC_MIN
    CHECK_MODE_TIME_INC_2:
      CJNE   A,#2,CHECK_MODE_TIME_INC_3
      LJMP   TIME_INC_HOUR
    CHECK_MODE_TIME_INC_3:
      CJNE   A,#3,CHECK_MODE_TIME_INC_4
      LJMP   TIME_INC_DAY
    CHECK_MODE_TIME_INC_4:
      CJNE   A,#1,CHECK_MODE_TIME_INC_5
      LJMP   TIME_INC_DATE
    CHECK_MODE_TIME_INC_5:
      CJNE   A,#1,CHECK_MODE_TIME_INC_6
      LJMP   TIME_INC_MONTH
    CHECK_MODE_TIME_INC_6:
      LJMP TIME_INC_YEAR
    ;============================================ 
    NOKEY:
      LCALL DISPLAY_LED
    RET
    ;======================== MODE TANG ALARM
    MODE_ALARM_INC:
      MOV   A,FLAG_SET
    CHECK_MODE_ALARM_INC:
    CHECK_MODE_ALARM_INC_0:
      CJNE  A,#0,CHECK_MODE_ALARM_INC_1
      LJMP  ALARM_INC_FLAG
    CHECK_MODE_ALARM_INC_1:
      CJNE  A,#1,CHECK_MODE_ALARM_INC_2
      LJMP  ALARM_INC_MIN
    CHECK_MODE_ALARM_INC_2:
      LJMP ALARM_INC_HOUR
    ;============================== CHUONG TRINH TANG CAC DATA CUA TIME ========================
    TIME_INC_MIN:
      INC    MIN 
      MOV    A,MIN
      CJNE   A,#60,DONE_TIME_INC_MIN
      MOV    MIN,#0
    DONE_TIME_INC_MIN:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;================
    TIME_INC_HOUR:
      INC   HOUR 
      MOV   A,HOUR
      CJNE  A,#24,DONE_TIME_INC_HOUR
      MOV   HOUR,#0
    DONE_TIME_INC_HOUR:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;===============
    TIME_INC_DAY:
      INC   DAY 
      MOV   A,DAY
      CJNE  A,#8,DONE_TIME_INC_DAY
      MOV   DAY,#1
    DONE_TIME_INC_DAY:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;===============
    TIME_INC_DATE:
      INC   DATE 
      MOV   A,DATE
      CJNE  A,#32,DONE_TIME_INC_DATE
      MOV   DATE,#1
    DONE_TIME_INC_DATE:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;===============
    TIME_INC_MONTH:
      INC   MONTH 
      MOV   A,MONTH
      CJNE  A,#13,DONE_TIME_INC_MONTH
      MOV   MONTH,#1
    DONE_TIME_INC_MONTH:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;===============
    TIME_INC_YEAR:
      INC   YEAR 
      MOV   A,YEAR
      CJNE  A,#99,DONE_TIME_INC_YEAR
      MOV   YEAR,#0
    DONE_TIME_INC_YEAR:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;========================================= TANG CAC GIA TRI CUA ALARM============================
    ALARM_INC_FLAG :
      INC   FLAG_ALARM
      MOV   A,FLAG_ALARM
      CJNE  A,#2,DONE_ALARM_INC_FLAG
      MOV   FLAG_ALARM,#0
    DONE_ALARM_INC_FLAG:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;=============
    ALARM_INC_MIN:
      INC    MIN_ALARM 
      MOV    A,MIN_ALARM
      CJNE   A,#60,DONE_ALARM_INC_MIN
      MOV    MIN_ALARM,#0
    DONE_ALARM_INC_MIN:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;=============
    ALARM_INC_HOUR:
      INC   HOUR_ALARM 
      MOV   A,HOUR_ALARM
      CJNE  A,#24,DONE_ALARM_INC_HOUR
      MOV   HOUR_ALARM,#0
    DONE_ALARM_INC_HOUR:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;============================ CHUONG TRINH CAP NHAT THOI GIAN DA SET VAO DS1307  ==================
    UPDATE_TIME:
      MOV    DATA_DS,00H
      MOV    ADD_LOW,#00H
      LCALL  WRITE_BYTE
    ;==========
      MOV    A,MIN
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#01H
      LCALL  WRITE_BYTE
    ;==========
      MOV    A,HOUR
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#02H
      LCALL  WRITE_BYTE
    ;==========
      MOV   A,DAY
      LCALL HEX_BCD
      MOV   DATA_DS,A
      MOV   ADD_LOW,#03H
      LCALL WRITE_BYTE
    ;==========
      MOV   A,DATE
      LCALL HEX_BCD
      MOV   DATA_DS,A
      MOV   ADD_LOW,#04H
      LCALL WRITE_BYTE
    ;==========
      MOV    A,MONTH
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#05H
      LCALL  WRITE_BYTE
    ;==========
      MOV   A,YEAR
      LCALL HEX_BCD
      MOV   DATA_DS,A
      MOV   ADD_LOW,#06H
      LCALL WRITE_BYTE
    RET
    ;==========================
    UPDATE_ALARM:
      MOV    A,FLAG_ALARM
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#08H
      LCALL  WRITE_BYTE
    ;==========
      MOV    A,MIN_ALARM
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#09H
      LCALL  WRITE_BYTE
    ;==========
      MOV    A,HOUR_ALARM
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#0AH
      LCALL  WRITE_BYTE
    RET
    ;==========================
    DELAY_VIBRATION:
      PUSH   00H
      MOV    R0,#20
    LOOP_DELAY_VIBRATION:
      LCALL  DISPLAY_LED
      DJNZ   R0,LOOP_DELAY_VIBRATION
      POP    00H
    RET
    ;================================
    MALED_NORMAL  : DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
    MALED_DP      : DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
    MALED_NGUOC_DP: DB 40H,4FH,24H,06H,0BH,12H,10H,47H,00H,02H
    ;=================================
    END
    Mới học vi điều khiển được một thời gian, chưa có nhiều kinh nghiệm nên có nhiều sai sót.
    Mong các bác " check " lỗi giúp em với ạ.

    Link Code+Simulation : RTC_LM_FIXED_N_5_9.rar

    P/S: Khi làm project này em có tham khảo code đồng hồ số của bác PTCOM ở topic http://www.dientuvietnam.net/forums/...19/index2.html
    Last edited by 69PhamLai69; 06-09-2012, 22:04.

  • #2
    bạn ơi có sơ đồ nguyên lý k bạn cho mình xin tham khảo nha.

    Comment


    • #3
      bạn 69PhamLai69 co thể post so đồ nguyên lý + mô phỏng lên cho moi người tham khao ko ? (mình xài proteus 7.8sp2 mà nó cứ chạy tùm lum lên ah)
      mình mới học điện tử nên gà lắm

      Comment


      • #4
        thanks ban

        Comment


        • #5
          giúp gấp cái các pro ơi

          Tại sao mình làm cái đồng hồ mà lúc đầu xung ở chân số 7 của con ds1307 mình gắn với led thì nó nháy bình thường ~ nhưng do sơ ý mình làm 2 chân âm dương ở con 7805 bị chập thì cái led báo xung 1hz đó nó chỉ sáng chứ ko nháy nữa ! mình đã thay con ds1307 khác vào vẫn thế ! (
          mong các pro giúp đỡ mình với !
          mình đã thử thay con IC 89 khác cũng ko đc

          Comment


          • #6
            có code C không bạn! nhìn thấy code ASM mà rối cả mắt!

            Comment

            Về tác giả

            Collapse

            69PhamLai69 Tìm hiểu thêm về 69PhamLai69

            Bài viết mới nhất

            Collapse

            • bqviet
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi bqviet
              Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
              06-12-2025, 17:17
            • nguyendinhvan
              Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
              bởi nguyendinhvan
              Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
              05-12-2025, 19:59
            • afrendly
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi afrendly
              Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
              04-12-2025, 01:27
            • nick22
              Trả lời cho Máy điện châm ?
              bởi nick22
              Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
              01-12-2025, 13:23
            Đang tải...
            X