NAME SAMPLE
; Khai báo chuong trinh con
PUBLIC TXTBIT
PROG SEGMENT CODE ; Khai bao vung nho ma lenh
CONST SEGMENT CODE ; Khai bao hang so trong vung ma lenh
VAR1 SEGMENT DATA ; Khai bao vung nho cho bien
BITVAR SEGMENT BIT ; Khai bao cac bien dang bit
----------------------
khai bao stack
--------------------
STACK SEGMENT IDATA ; Khai bao ngan xep (thuong dung cho ngat, chuong trinh con)
RSEG STACK ; Chon DATA segment(chon STACK)
DS 10H ; Ngan xep chua duoc 16 bytes
----------------------------------------------------
bang khoi dong va vecto ngat
----------------------------------------------------
CSEG AT 0
USING 0
JMP START ;chuyen lenh dieu khien toi START(Bit khoi dau trong mode2)
RSEG PROG ;chon CODE segment
START: MOV SP,#STACK-1 ;khoi tao bit bat dau start
--------------------------------------------
code chuong trinh chinh
-------------------------------------------
; Khoi tao timer cho UART
MOV TMOD,#20H ;C/T = 0, Mode = 2(do toc do truyen thap nen de 2 bit dung de du thoi gian cho vc nhan tin hieu)
MOV TH1,#0FDH ;Tao toc do baud cho timer 1(toc do truyen tin)
SETB TR1 ;TR1=1 khoi dong timer1
MOV SCON,#52H ;gan gia tri 52H cho thanh ghi dieu khien cong noi tiep SCON(8bit tin,2 bit dung)
; Khoi tao LCD
MOV A,#38H ;init. LCD 2 do`ng, ma tra^.n 5x7 (LCD dung mode 8bit)
ACALL LENH ;xuat lenh
MOV A,#0EH ;hien thi man hinh va con tro
ACALL LENH
MOV A,#01H ;clear LCD
ACALL LENH
MOV A,#06H ;con tro man hinh di.ch pha?i
ACALL LENH
MOV A,#80H ;chuye^?n con tro man hinh dde^'n line 1, pos. 6
ACALL LENH
; clear TXTBIT to read form CODE-Memory
CLR TXTBIT
MOV A,#255
MOV P2,A
LAP:
;----Quet ban phim
QUET_PHIM:
MOV A,#255
MOV P1,A
PHIM_1:
CLR P1.4
JB P1.3, PHIM_4
MOV A, #14
MOV PHIM_AN, A
SJMP HIEN
PHIM_4:
JB P1.2, PHIM_7
MOV A,#17
MOV PHIM_AN, A
SJMP HIEN
PHIM_7:
JB P1.1,PHIM_SAO
MOV A,#20
MOV PHIM_AN, A
SJMP HIEN
PHIM_SAO:
JB P1.0,PHIM_2
MOV A,#7
MOV PHIM_AN, A
SJMP HIEN
PHIM_2:
CLR P1.5
SETB P1.4
JB P1.3, PHIM_5
MOV A,#15
MOV PHIM_AN,A
SJMP HIEN
PHIM_5:
JB P1.2, PHIM_8
MOV A,#18
MOV PHIM_AN,A
SJMP HIEN
PHIM_8:
JB P1.1, PHIM_0
MOV A,#21
MOV PHIM_AN,A
SJMP HIEN
PHIM_0:
JB P1.0, PHIM_3
MOV A,#13
MOV PHIM_AN,A
SJMP HIEN
PHIM_3:
CLR P1.6
SETB P1.5
JB P1.3, PHIM_6
MOV A,#16
MOV PHIM_AN,A
SJMP HIEN
PHIM_6:
JB P1.2, PHIM_9
MOV A,#19
MOV PHIM_AN,A
SJMP HIEN
PHIM_9:
JB P1.1, PHIM_THANG
MOV A,#22
MOV PHIM_AN,A
SJMP HIEN
PHIM_THANG:
JB P1.0,XOA_NUT
MOV A,#0
MOV PHIM_AN, A
SJMP HIEN
XOA_NUT:
MOV A,#10
MOV PHIM_AN, A
;---------HIEN THI.
HIEN:
ACALL DELAY100ms
MOV A,PHIM_AN
ADD A,#35
CJNE A,#45, HIEN_THI
SJMP NHAN
HIEN_THI:
; Di chuyen ve dau hang 1
MOV A, #80H
ACALL LENH
MOV A,PHIM_AN
ADD A,#35
ACALL DULIEU
TRUYEN:
MOV A,PHIM_AN
ADD A,#35
ACALL SEND
NHAN:
MOV A, #0
ACALL RECV
MOV PHIM_NHAN, A
CJNE A, #0, HIEN_THI_NHAN
LJMP LAP
HIEN_THI_NHAN:
MOV A, #0C0h
ACALL LENH
MOV A,PHIM_NHAN
ACALL DULIEU
LJMP LAP
;------Chuong trinh con
LENH:
ACALL READY ;is LCD ready?
MOV P2,A ;xua^'t ma~ le^.nh
CLR P0.0 ;RS=0: le^.nh
CLR P0.1 ;R/W=0 -> ghi ra LCD
SETB P0.2 ;E=1 -> ta.o ca.nh xuo^'ng
CLR P0.2 ;E=0 ,cho^'t
RET
DULIEU:
ACALL READY ;is LCD ready?
MOV P2,A ;xua^'t du+~ lie^.u
SETB P0.0 ;RS=1 for data
CLR P0.1 ;R/W=0 to write to LCD
SETB P0.2 ;E=1 -> ta.o ca.nh xuo^'ng
CLR P0.2 ;E=0, cho^'t
RET
; kie^?m tra co+` BF
READY: SETB P2.7 ;P1.7: input
CLR P0.0 ;RS=0: thanh ghi le^.nh
SETB P0.1 ;R/W=1: ddo.c
BACK: CLR P0.2 ;E=0 -> ta.o ca.nh le^n
SETB P0.2 ;E=1
JB P2.7,BACK ;cho+` busy flag=0
RET
DELAY100ms: MOV R2,#150
DL5: MOV R1,#250
DL4: NOP
NOP
DJNZ R1,DL4
DJNZ R2,DL5
RET
SEND:
JNB TI,$
CLR TI
MOV SBUF,A
RET
RECV:
MOV A, #0
JNB RI, RETURN
MOV A,SBUF
CLR RI
RETURN: RET
RSEG CONST
TXT: DB 'TEST PROGRAM',00H
RSEG VAR1
PHIM_AN: DS 01H // Do dai 33 byte
SUM: DS 01H
PHIM_NHAN: DS 01H
BIEN_GHI: DS 01H
RSEG BITVAR
TXTBIT: DBIT 1
END
Các cao thủ cho e hỏi ý nghĩa của mấy cái chỗ e in đậm,có cần thiết phải có cái XÓA NÚT hay không,tại sao đã kiểm tra cờ bf mà vẫn phải có trễ?tại sao lại cộng 35,tại sao DS gán bằng 01H,DBIT 1 là gì,và ý nghĩa của TXTBIT.CẢm ơn các bạn:beauty::beauty::beauty:
; Khai báo chuong trinh con
PUBLIC TXTBIT
PROG SEGMENT CODE ; Khai bao vung nho ma lenh
CONST SEGMENT CODE ; Khai bao hang so trong vung ma lenh
VAR1 SEGMENT DATA ; Khai bao vung nho cho bien
BITVAR SEGMENT BIT ; Khai bao cac bien dang bit
----------------------
khai bao stack
--------------------
STACK SEGMENT IDATA ; Khai bao ngan xep (thuong dung cho ngat, chuong trinh con)
RSEG STACK ; Chon DATA segment(chon STACK)
DS 10H ; Ngan xep chua duoc 16 bytes
----------------------------------------------------
bang khoi dong va vecto ngat
----------------------------------------------------
CSEG AT 0
USING 0
JMP START ;chuyen lenh dieu khien toi START(Bit khoi dau trong mode2)
RSEG PROG ;chon CODE segment
START: MOV SP,#STACK-1 ;khoi tao bit bat dau start
--------------------------------------------
code chuong trinh chinh
-------------------------------------------
; Khoi tao timer cho UART
MOV TMOD,#20H ;C/T = 0, Mode = 2(do toc do truyen thap nen de 2 bit dung de du thoi gian cho vc nhan tin hieu)
MOV TH1,#0FDH ;Tao toc do baud cho timer 1(toc do truyen tin)
SETB TR1 ;TR1=1 khoi dong timer1
MOV SCON,#52H ;gan gia tri 52H cho thanh ghi dieu khien cong noi tiep SCON(8bit tin,2 bit dung)
; Khoi tao LCD
MOV A,#38H ;init. LCD 2 do`ng, ma tra^.n 5x7 (LCD dung mode 8bit)
ACALL LENH ;xuat lenh
MOV A,#0EH ;hien thi man hinh va con tro
ACALL LENH
MOV A,#01H ;clear LCD
ACALL LENH
MOV A,#06H ;con tro man hinh di.ch pha?i
ACALL LENH
MOV A,#80H ;chuye^?n con tro man hinh dde^'n line 1, pos. 6
ACALL LENH
; clear TXTBIT to read form CODE-Memory
CLR TXTBIT
MOV A,#255
MOV P2,A
LAP:
;----Quet ban phim
QUET_PHIM:
MOV A,#255
MOV P1,A
PHIM_1:
CLR P1.4
JB P1.3, PHIM_4
MOV A, #14
MOV PHIM_AN, A
SJMP HIEN
PHIM_4:
JB P1.2, PHIM_7
MOV A,#17
MOV PHIM_AN, A
SJMP HIEN
PHIM_7:
JB P1.1,PHIM_SAO
MOV A,#20
MOV PHIM_AN, A
SJMP HIEN
PHIM_SAO:
JB P1.0,PHIM_2
MOV A,#7
MOV PHIM_AN, A
SJMP HIEN
PHIM_2:
CLR P1.5
SETB P1.4
JB P1.3, PHIM_5
MOV A,#15
MOV PHIM_AN,A
SJMP HIEN
PHIM_5:
JB P1.2, PHIM_8
MOV A,#18
MOV PHIM_AN,A
SJMP HIEN
PHIM_8:
JB P1.1, PHIM_0
MOV A,#21
MOV PHIM_AN,A
SJMP HIEN
PHIM_0:
JB P1.0, PHIM_3
MOV A,#13
MOV PHIM_AN,A
SJMP HIEN
PHIM_3:
CLR P1.6
SETB P1.5
JB P1.3, PHIM_6
MOV A,#16
MOV PHIM_AN,A
SJMP HIEN
PHIM_6:
JB P1.2, PHIM_9
MOV A,#19
MOV PHIM_AN,A
SJMP HIEN
PHIM_9:
JB P1.1, PHIM_THANG
MOV A,#22
MOV PHIM_AN,A
SJMP HIEN
PHIM_THANG:
JB P1.0,XOA_NUT
MOV A,#0
MOV PHIM_AN, A
SJMP HIEN
XOA_NUT:
MOV A,#10
MOV PHIM_AN, A
;---------HIEN THI.
HIEN:
ACALL DELAY100ms
MOV A,PHIM_AN
ADD A,#35
CJNE A,#45, HIEN_THI
SJMP NHAN
HIEN_THI:
; Di chuyen ve dau hang 1
MOV A, #80H
ACALL LENH
MOV A,PHIM_AN
ADD A,#35
ACALL DULIEU
TRUYEN:
MOV A,PHIM_AN
ADD A,#35
ACALL SEND
NHAN:
MOV A, #0
ACALL RECV
MOV PHIM_NHAN, A
CJNE A, #0, HIEN_THI_NHAN
LJMP LAP
HIEN_THI_NHAN:
MOV A, #0C0h
ACALL LENH
MOV A,PHIM_NHAN
ACALL DULIEU
LJMP LAP
;------Chuong trinh con
LENH:
ACALL READY ;is LCD ready?
MOV P2,A ;xua^'t ma~ le^.nh
CLR P0.0 ;RS=0: le^.nh
CLR P0.1 ;R/W=0 -> ghi ra LCD
SETB P0.2 ;E=1 -> ta.o ca.nh xuo^'ng
CLR P0.2 ;E=0 ,cho^'t
RET
DULIEU:
ACALL READY ;is LCD ready?
MOV P2,A ;xua^'t du+~ lie^.u
SETB P0.0 ;RS=1 for data
CLR P0.1 ;R/W=0 to write to LCD
SETB P0.2 ;E=1 -> ta.o ca.nh xuo^'ng
CLR P0.2 ;E=0, cho^'t
RET
; kie^?m tra co+` BF
READY: SETB P2.7 ;P1.7: input
CLR P0.0 ;RS=0: thanh ghi le^.nh
SETB P0.1 ;R/W=1: ddo.c
BACK: CLR P0.2 ;E=0 -> ta.o ca.nh le^n
SETB P0.2 ;E=1
JB P2.7,BACK ;cho+` busy flag=0
RET
DELAY100ms: MOV R2,#150
DL5: MOV R1,#250
DL4: NOP
NOP
DJNZ R1,DL4
DJNZ R2,DL5
RET
SEND:
JNB TI,$
CLR TI
MOV SBUF,A
RET
RECV:
MOV A, #0
JNB RI, RETURN
MOV A,SBUF
CLR RI
RETURN: RET
RSEG CONST
TXT: DB 'TEST PROGRAM',00H
RSEG VAR1
PHIM_AN: DS 01H // Do dai 33 byte
SUM: DS 01H
PHIM_NHAN: DS 01H
BIEN_GHI: DS 01H
RSEG BITVAR
TXTBIT: DBIT 1
END
Các cao thủ cho e hỏi ý nghĩa của mấy cái chỗ e in đậm,có cần thiết phải có cái XÓA NÚT hay không,tại sao đã kiểm tra cờ bf mà vẫn phải có trễ?tại sao lại cộng 35,tại sao DS gán bằng 01H,DBIT 1 là gì,và ý nghĩa của TXTBIT.CẢm ơn các bạn:beauty::beauty::beauty:
