Download as pdf or txt
Download as pdf or txt
You are on page 1of 24

Viết chương trình tạo xung vuông 1 Hz, chu kỳ nhiệm vụ 50% trên P1.

ORG 2000H

CONT:

CPL P1.0

ACALL DELAY05S

SJMP CONT

DELAY05S: MOV R7,#4

LOOP1: MOV R6,#250

LOOP2: MOV R5,#250

DJNZ R5, $

DJNZ R6, LOOP2

DJNZ R7, LOOP1

RET

END

Thời gian: ((2*250+3)*250+3)*4

Viết chương trình tạo hiệu ứng quay LED: các LED đơn trên BARLED1 sáng
lần lượt từ trái sang phải sau thời gian 1s và lặp lại. Sử dụng chương trình con
1s đã viết ở trên.

ORG 2000H

MOV A,#01111111B

CONT:

MOV P1,A ; P1 là BARLED1


RR A

ACALL DELAY1S

JMP CONT

DELAY1S: MOV R7,#8

LOOP1: MOV R6,#250

LOOP2: MOV R5,#250

DJNZ R5, $

DJNZ R6, LOOP2

DJNZ R7, LOOP1

RET

END

Viết chương trình hiển thị lên LED 7 đoạn số 0 các con số từ 0 đến 9 sau các
khoảng thời gian 1s

ORG 2000H

MAIN:

MOV R0,#00H

LOOP:

CALL LED0

CALL DELAY1S

INC R0

CJNE R0,#0AH,LOOP

JMP MAIN

LED0:
MOV A,R0

ORL A,#0E0H

MOV DPTR,#0000H

MOVX @DPTR,A

RET

DELAY1S:

MOV R7, #14H

DELAY:

MOV TMOD, #01H

MOV TH0, #HIGH(-50000)

MOV TL0, #LOW(-50000)

SETB TR0

JNB TF0,$

CLR TF0

CLR TR0

DJNZ R7,DELAY

RET

END

Viết chương trình hiển thị số 1 lên LED7 đoạn 0, sau đó 1s hiển thị số 2 lên LED 7
đoạn 1, sau đó 1s hiển thị số 3 lên LED 7 đoạn 2, sau đó 1s hiển thị số 4 lên LED 7
đoạn 3. Quá trình này lặp đi lặp lại. Việc hiển thị này sử dụng chương trình con
DisplayLED đã viết ở trên.

ORG 2000H
MAIN:

MOV R0,#00H

LOOP:

CALL LED0

CALL DELAY1S

INC R0

CALL LED1

CALL DELAY1S

INC R0

CALL LED2

CALL DELAY1S

INC R0

CALL LED3

CALL DELAY1S

CJNE R0,#04H,MAIN

LED0:

MOV A,R0

ORL A,#0E0H

MOV DPTR,#0000H

MOVX @DPTR,A

RET

LED1:

MOV A,R0
ORL A,#0D0H

MOV DPTR,#0000H

MOVX @DPTR,A

RET

LED2:

MOV A,R0

ORL A,#0B0H

MOV DPTR,#0000H

MOVX @DPTR,A

RET

LED3:

MOV A,R0

ORL A,#70H

MOV DPTR,#0000H

MOVX @DPTR,A

RET

DELAY1S:

MOV R7, #14H

DELAY:

MOV TMOD, #01H

MOV TH0, #HIGH(-50000)

MOV TL0, #LOW(-50000)

SETB TR0
JNB TF0,$

CLR TF0

CLR TR0

DJNZ R7,DELAY

RET

LCD full có xuống dòng


ORG 2000H
RS BIT P3.5
EN BIT P3.4
MAIN:
LCALL KHOIDONGLCD
MOV A,#0
LAP: PUSH ACC
MOV DPTR,#TABLE ;xuất chuỗi họ tên
MOVC A,@A + DPTR
JZ EXIT
LCALL XUAT1KYTU
POP ACC
INC A
SJMP LAP
EXIT:
;----------------------------------------------------------------
; xuất chuỗi tổ hàng R0 cột R1
MOV R1,#02
MOV R0,#01 ; R0 = 0 : hàng 1; R0=1 : hàng 2
LCALL GOTOXY
LAP1: PUSH ACC
MOV DPTR,#TABLE1 ;xuất chuỗi tổ
MOVC A,@A + DPTR
JZ KETTHUC
LCALL XUAT1KYTU
POP ACC
INC A
SJMP LAP1
KETTHUC:
SJMP $
;-------------------------
NHAPLENH:
MOV DPTR,#8000H
CLR EN
SETB EN
CLR RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET
;-------------------------
XUAT1KYTU:
MOV DPTR,#8000H
CLR EN
SETB EN
SETB RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET
;----------------------------
DL5MS:
MOV TMOD,#10H
MOV TL1,#LOW(-5000)
MOV TH1,#HIGH(-5000)
SETB TR1
JNB TF1,$
CLR TF1
CLR TR1
RET
;----------------------------
KHOIDONGLCD:
MOV A,#01H
LCALL NHAPLENH
MOV A,#0EH
LCALL NHAPLENH
MOV A,#02H
LCALL NHAPLENH
MOV A,#06H
LCALL NHAPLENH
MOV A,#38H
LCALL NHAPLENH
RET
;----------------------------------
GOTOXY:
PUSH ACC
MOV A,R0
MOV DPTR,#TB
MOVC A,@A+DPTR
ORL A,R1
LCALL NHAPLENH
POP ACC
TB: DB 80H,0C0H
RET
TABLE: DB " DONG 1 ",0
TABLE1: DB "DONG 2",0
END
Viết chương trình tạo sóng vuông 1 Hhz trên chân P1.0 sử dụng timer 0 ở chế độ
1

ORG 2000H

MOV TMOD, #01H

MAIN1:

MOV A, #10

MAIN:

MOV TH0, #HIGH(-50000)

MOV TL0, #LOW(-50000)

SETB TR0

LOOP: JNB TF0,$

CLR TF0
CLR TR0

DEC A

CJNE A,#0,MAIN

CPL P1.0

SJMP MAIN1

END

Viết chương trình tạo sóng vuông 1 Hz trên chân P1.0 sử dụng timer 0 ở chế độ 2

ORG 2000H

MOV TMOD, #02H

MAIN:

MOV TH0, #-250

SETB TR0

MAIN1:

MOV DPTR, #0

LOOP: JNB TF0, $

CLR TF0

INC DPTR

MOV A,DPH

CJNE A, #07H, LOOP

MOV A,DHL

CJNE A, #0D0H, LOOP

CPL P1.0

SJMP MAIN1
END

Cần 2000 lần timer 250 để có 0.5s, 2000 = 7D0 H

Viết chương trình phát chuỗi ký tự “Hello, world” lên máy tính thông qua
HyperTerminal với tốc độ baud 19200 bps mỗi khi SW 310 (gắn vào P1.0) được
nhấn

ORG 2000H
MOV TMOD,#21H
MOV TH1,#-3
SETB TR1
MOV SCON,#52H
LAP:
MOV R7,#0
MOV DPTR,#TABLE
TTUC:
JB P1.0,$
ACALL DL100MS
JNB P1.0,$
MOV A,R7
INC R7
MOVC A,@A+DPTR
JZ LAP
ACALL XUAT
SJMP TTUC
;---------------------------------------------------------------
XUAT:
JNB TI,$
CLR TI
MOV SBUF,A
RET
;---------------------------------------------------------------
DL100MS:
MOV R4,#2
LAP1:
MOV TMOD,#01H
MOV TL0,#LOW(-50000)
MOV TH0,#HIGH(-50000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
DJNZ R4,LAP1
RET
;-------------------------------
TABLE: DB "HELLO,WORLD",0
END

Viết chương trình nhận các ký tự từ máy tính gửi đến EME-MC8 thông qua
HyperTerminal (bằng cách gõ các ký tự trên bàn phím khi đang ở trong chương
trình HyperTerminal) và hiển thị lên LCD như sau:

Nếu ký tự là chữ thì hiển thị lên LCD; Enter thì xuống hàng; ESC thì xóa màn hình
LCD; Backspace thì xóa ký tự bên trái dấu nháy.

ORG 2000H

RS BIT P3.5
EN BIT P3.4

MOV TMOD,#21H

MOV TH1,#-3

MOV SCON,#52H

CLR F0

LCALL KHOIDONGLCD

MAIN:

LCALL INCHAR

LCALL KTRACHAR

LCALL KTRAENTER

LCALL KTRAESC

LCALL KTRABACK

SJMP MAIN

;-----------------------------------------------------------------------------------------------

KTRABACK:

CJNE A,#08H,OUT1

LCALL XOAKYTU

OUT1:

RET

;--------------------------------------------------
XOAKYTU:

DEC R1

JB F0,H1

MOV R0,#00H

SJMP GOTO

H1: MOV R0,#01H

GOTO:

LCALL GOTOXY

MOV A,#0FEH

LCALL XUAT1KYTU

DEC R1

LCALL GOTOXY

RET

;-----------------------------------------------------------------------------------------------

KTRAENTER:

CJNE A,#13H,OUT2 ; Enter : 13H

LCALL CHUYENHANG

OUT2:

RET

;---------------------------------------------------------------------------

CHUYENHANG:
CPL F0

JB F0,HANG1

LCALL KHOIDONGLCD

MOV R1,#0

SJMP OUT4

HANG1:

MOV R0,#01

MOV R1,#00

LCALL GOTOXY

OUT4:

RET

;-----------------------------------------------------------------------------------------------

KTRAESC:

CJNE A,#27H,OUT3 ; ESC : 27H

LCALL CLRLCD

OUT3:

RET

;------------------------------------------------

CLRLCD:

MOV A,#01H

LCALL NHAPLENH
MOV R1,#0

RET

;-----------------------------------------------------------------------------------------------

KTRACHAR:

CJNE A,#29H,$+3 ; chỉ nhận ký tự mã ASCII trong khoảng hiển thị được
(30H là số 0)

JC THOAT

CJNE A,#7FH,$+3 ; chỉ nhận ký tự mã ASCII trong khoảng hiển thị được

JNC THOAT

CLR C

LCALL XUAT1KYTU

THOAT:

RET

;-----------------------------------------------------------------------------------

INCHAR: ; nhận ký tự từ cổng nối tiếp

JNB RI,$

CLR RI

MOV A,SBUF

RET

;-------------------------------------------------------------------------------

NHAPLENH:
MOV DPTR,#8000H

CLR EN

SETB EN

CLR RS

MOVX @DPTR,A

CLR EN

LCALL DL5MS

RET

;-------------------------

XUAT1KYTU:

MOV DPTR,#8000H

CLR EN

SETB EN

SETB RS

MOVX @DPTR,A

CLR EN

LCALL DL5MS

INC R1

RET

;----------------------------

DL5MS:
MOV TL1,#LOW(-5000)

MOV TH1,#HIGH(-5000)

SETB TR1

JNB TF1,$

CLR TF1

CLR TR1

RET

;----------------------------

KHOIDONGLCD:

MOV A,#01H

LCALL NHAPLENH

MOV A,#0EH

LCALL NHAPLENH

MOV A,#02H

LCALL NHAPLENH

MOV A,#06H

LCALL NHAPLENH

MOV A,#38H

LCALL NHAPLENH

RET

;-------------------------------------
GOTOXY:

PUSH ACC

MOV A,R0

MOV DPTR,#TABLE

MOVC A,@A+DPTR

ORL A,R1

LCALL NHAPLENH

POP ACC

TABLE: DB 80H,0C0H

RET

END

Viết chương trình làm song song 2 công việc sau:


Nhận 1 byte từ máy tính và xuất ngược lại (echo) lên màn hình terminal
Bật LED gắn vào P1.1 khi SW 317 (gắn vào P1.0) được nhấn, và tắt
LED khi phím được nhả.
ORG 2000H
LJMP MAIN ;nhảy đến chương trình chính MAIN
ORG 2023H ;địa chỉ cho ngắt serial port cả 2 cổng TI và RI
LJMP SERIAL ;nhảy đến chương trình phục vụ ngắt nếu timer
tràn
MAIN:
MOV P1,#02H ;tắt led ở P1.1
MOV TMOD,#20H ;tạo timer 1 chế độ 2
MOV TH1,#-3 ;gán trị cho timer tao toc do baud
MOV SCON,#52H
MOV PCON,#80H ;tăng gấp đôi giá trị baud
MOV IE,#90H ;cho phép ngắt toàn cục và ngắt nối tiếp
SETB TR1 ;timer hoạt động
;---------------------------------------------------------------
;chương trình bật tắt P1.1
LAP:
MOV C,P1.0
MOV P1.1,C
SJMP LAP
;---------------------------------------------------------------------------
;chương trình phục vụ ngắt
SERIAL:
JNB RI,TRANFER ;nếu RI báo ngắt thì chuyển dl vào A rồi xuất dl, nếu TI
báo ngắt thì xóa TI và quay lại chương trình chính sẵn sàng nhận byte kế
MOV A,SBUF ;chuyển dữ liệu vào A
MOV SBUF,A ;xuất dữ liệu
CLR RI ;xóa RI để sẵn sáng nhận byte kế
SJMP EXIT
TRANFER:
CLR TI ;xóa cờ TI sẵn sàng suất byte kế tiếp
EXIT:
RETI ;trở về từ ISR
END
Viết chương trình đếm số lần nhấn phím SW317, hiển thị lên 4 LED 7 đoạn
ORG 2000H
LJMP MAIN0 ;nhảy đến chương trình MAIN0 để cài đặt timer
ORG 200BH ;vecto ngắt timer0
LJMP IRS_T0 ;nhảy đến chương trình phục vụ ngắt T0
MAIN0:
MOV 20H,#70H ;trị khởi động led 3
MOV 21H,#0B0H ;trị khởi động led 2
MOV 22H,#0D0H ;trị khởi động led 1
MOV 23H,#0E0H ;trị khởi động led 0
MOV TMOD,#01H ;khởi động timer 0 chế độ 1
MOV IE,#82H ;cho phép ngắt toàn cục và timer 0
SETB TF0 ;ép ngắt timer0
;-----------------------------------------------------------------
;chương trình chính
MAIN1:
MOV R1,#20H
LCALL HLED ;hiện led
SJMP MAIN1
;---------------------------------------------------------------
; chuong trình phục vụ ngắt timer0
IRS_T0:
CLR TR0 ;ngừng timer
JNB P1.0,DEM0 ;nhấn phím thì nhảy đến DEM0
KTHUC:
MOV TH0,#HIGH(-50000) ;gán lại trị timer và khởi động lại timer
MOV TL0,#LOW(-50000)
SETB TR0
RETI
;---------------------------------------------------------------------------
;chương trình cập nhật các led
DEM0:
LCALL DELAY ;gọi hàm tạo trễ để chống rung phím
INC 23H ;tăng trị hiện trên led 0 lên 1
MOV A,23H ;gán vào A
CJNE A,#0EAH,DEM1 ;tăng đến khi trị đó bằng 10
MOV 23H,#0E0H ;thì quay về 0
INC 22H ;và tăng hàng chục lên 1 đơn vị
MOV A,22H ;tương tự với các led còn lại, led 2 hàng trăm led 3 hàng
nghìn
CJNE A,#0DAH,DEM1
MOV 22H,#0D0H

INC 21H
MOV A,21H
CJNE A,#0BAH,DEM1
MOV 21H,#0B0H

INC 20H
MOV A,20H
CJNE A,#7AH,DEM1
; tràn thì trả về trị ban đầu 0000
MOV 20H,#70H
MOV 21H,#0B0H
MOV 22H,#0D0H
MOV 23H,#0E0H

DEM1:
NOP
LJMP KTHUC ;nhảy về nhản KTHUC để thực hiện tiếp chương trình
;------------------------------------------------------------------------------------
; chương trình quét led
HLED:
LL:
MOV A,@R1
ADD A,R0
MOV DPTR, #0000H
MOVX @DPTR, A
MOV R4,#1
NHAY: MOV R3,#1
DJNZ R3,$
DJNZ R4,NHAY
INC R1
CJNE R1,#24H,LL
RET
;------------------------------------------------------------------------
DELAY:
MOV R6,#200
TTRE:
MOV R7,#250
DJNZ R7,$
DJNZ R6,TTRE
RET
END

You might also like