`

Trung tâm bảo hành tivi samsung

Trung tâm bảo hành tivi samsung
samsung

Sửa tivi samsung mất nguồn tại nhà

Sửa tivi samsung mất nguồn tại nhà
samsung

Sửa chữa điều hòa tại hưng yên

Sửa chữa điều hòa tại hưng yên
home

Trung tâm bảo hành tivi lg

Trung tâm bảo hành tivi lg
Trung tâm bảo hành tivi lg

Trung tâm bảo hành tivi Sony

Trung tâm bảo hành tivi Sony
sony

Sửa tivi samsung tại nhà

Sửa tivi samsung tại nhà
samsung

Sửa điều hòa Toshiba tại Hưng Yên

Sửa điều hòa Toshiba tại Hưng Yên
home

Tự đoán bệnh tivi sony qua đèn báo nguồn

Tự đoán bệnh tivi sony qua đèn báo nguồn
sony

Sửa tivi sony tại nhà

Sửa tivi sony tại nhà
sony

Tivi sony bị loang màu nhòe màu

Tivi sony bị loang màu nhòe màu
sony

Sửa chữa, bảo dưỡng điều hòa tại Mỹ Hào, Hưng Yên

Sửa chữa, bảo dưỡng điều hòa tại Mỹ Hào, Hưng Yên
home

Sửa tivi lg tại nhà hà nội

Sửa tivi lg tại nhà hà nội
lg

Tivi lg bị mất nguồn và cách kiểm tra sửa chữa

Tivi lg bị mất nguồn và cách kiểm tra sửa chữa
lg

Sửa tivi LG Lcd, Led, Plasma tại nhà

Sửa tivi LG Lcd, Led, Plasma tại nhà
lg

12 lỗi thường gặp ở tivi LG Nguyên nhân và xử lý

12 lỗi thường gặp ở tivi LG Nguyên nhân và xử lý
lg

Trung tâm bảo hành tivi toshiba

Trung tâm bảo hành tivi toshiba
toshiba

Sửa tivi toshiba tại nhà

Sửa tivi toshiba tại nhà
toshiba

Sửa nguồn tivi toshiba tại nhà

Sửa nguồn tivi toshiba tại nhà
toshiba

Các lỗi TV Toshiba hay gặp và cách khắc phục

Các lỗi TV Toshiba hay gặp và cách khắc phục
toshiba

Sửa chữa điều hòa DAIKIN tại Hưng Yên

Sửa chữa điều hòa DAIKIN tại Hưng Yên
home

Sửa nguồn tivi toshiba tại nhà

Sửa nguồn tivi toshiba tại nhà
toshiba

Sửa tivi samsung bị nhòe màu loang ảnh

Sửa tivi samsung bị nhòe màu loang ảnh
samsung

Trung tâm bảo hành sửa chữa tivi hưng yên

Trung tâm bảo hành sửa chữa tivi hưng yên
hungyen

Sửa tivi tại nhà tại hưng yên

Sửa tivi tại nhà tại hưng yên
hungyen

Sửa tivi không lên hình

Sửa tivi không lên hình
hungyen

tivi không lên nguồn,tivi đang xem bị tắt nguồn

tivi không lên nguồn,tivi đang xem bị tắt nguồn
hungyen

tivi không lên nguồn,tivi đang xem bị tắt nguồn

tivi không lên nguồn,tivi đang xem bị tắt nguồn
hungyen

Tủ lạnh không đông đá nguyên nhân và cách sửa chữa

Tủ lạnh không đông đá nguyên nhân và cách sửa chữa
tulanh

Nguyên nhân tủ lạnh chạy không ngắt và cách sửa chữa

Nguyên nhân tủ lạnh chạy không ngắt và cách sửa chữa
tulanh

4 cách khắc phục tủ lạnh kêu to tại nhà cực kỳ đơn giản

4 cách khắc phục tủ lạnh kêu to tại nhà cực kỳ đơn giản
tulanh

Sửa chữa tủ lạnh tại văn lâm-hưng yên

Sửa chữa tủ lạnh tại văn lâm-hưng yên
tulanh

Bài 4: Các thí dụ cho thấy cách dùng bàn phím trong điều khiển 89C51

1. Cách dùng phím kiểu đơn lập

Một thí dụ về cách dùng các phím nhấn đơn lập.
Phân tích mạch:

Sơ đồ cho thấy, chúng ta cấp điện cho ic lập trình AT89C51 với chân 20 cho nối masse và chân 40 cho nối vào đường nguồn 5V. Trên chân 9 gắn tụ C1 (10uF) và điện trở R1 (10K) dùng tạo tính năng reset mỗi khi mạch được cấp nguồn. Trên chân 18, 19 gắn thạch anh định tần, chúng ta dùng thạch anh 12MHz. Để mạch chỉ làm việc với bộ nhớ trong chúng ta cho chân 31 nối vào đường nguồn 5V.

Đề làm thực hành với các phím nhấn đơn lập, chúng ta dùng 4 phím nhấn, gắn trên các chân p1.2, p1.3, p1.4, p1.5 của cảng p1 và gắn 8 Led trên cảng p3 để hiển thị tác dụng của các phím nhấn.

Ở đây chúng ta sẽ tạo tính năng cho 4 phím nhấn như sau: phím S1 cho mở phím, phím S4 cho tắt phím, phím S2 cho 8 Led trên p3 tuần tự dời qua phải và phím S3 cho 8 Led trên p3 dời qua trái.


Tóm lại công dụng của các phím như sau: 

* Nhấn nút S1 vào mode khởi động, cho mở phím.

* Nhấn nút S2, 8 Led trên cảng p3 dời bit qua phải

* Nhất nút S3, 8 Led trên cảng p3 dời bit qua trái

* Nhấn nút S4 vào mode tắt phím 


Chương trình nguồn:



UpDown EQU 00H ; đặt tên bit 00h là updown
StartEnd EQU 01H ; đặt tên bit 01h là startend
LAMPCODE EQU 21H ; đặt tên thanh ghi 21h là lampcode
ORG 0000H  ; địa chỉ thanh ghi khởi đầu
JMP MAIN  ; nhẩy đến tên nhãn
ORG 30H  ; vùng địa chỉ bên ngoài chức năng ngắt

MAIN:  ; đặt tên nhãn dùng cho lệnh nhẩy
MOV SP,#5FH  ; chọn địa chỉ làm ngăn xếp
MOV P3,#0FFH ; đặt trị 11111111b vào cảng p3 để tắt 8 led
; điều kiện khởi đầu
CLR UpDown ; đặt bit 0 vào bit updown
CLR StartEnd ; đặt bit 0 vào bit startend
MOV LAMPCODE,#0FEH ; chuyển trị 11111110b vào lampcode

LOOP:  ; đặt tên nhãn dùng cho lệnh nhẩy
CALL KEY ; gọi chương trình dò phím, tên nhãn key
JNB F0,LNEXT ; cho nhẩy theo bit f0
CALL KEYPROC ; gọi chương trình xử lý phím

LNEXT:  ; đặt tên nhãn dùng cho lệnh nhẩy
CALL LAMP ; gọi chương trình điều khiển 8 Led trên cảng p3
JMP LOOP ; quay lại tên nhãn loop

DELAY: ; chương trình tạo trể
MOV R7,#100  ; đặt trị 100 vào thanh ghi r7

D1:      ; đặt tên nhãn dùng cho lệnh nhẩy
MOV R6,#100 ; đặt trị 100 vào thanh ghi r6
DJNZ R6,$   ; nhẩy tại chổ, chờ trị trong r6 bằng 0
DJNZ R7,D1  ; giảm trị trong r7 theo bước -1, r7=0?, định hướng nhẩy
RET  ; qua lại sau lệnh call delay

;----------------------------------------
KEYPROC:   ; chương trình xử lý phím
MOV A,B ;   chuyển trị trong b vào thanh ghi a
JB ACC.2,KeyStart ; xét bit acc.2 để định hướng nhẩy 
JB ACC.3,KeyOver  ; xét bit acc.3 để định hướng nhẩy
JB ACC.4,KeyUp  ; xét bit acc.4 để định hướng nhẩy
JB ACC.5,KeyDown ; xét bit acc.5 để định hướng nhẩy
JMP KEY_RET  ; nhẩy về tên nhãn key_ret

KeyStart:   ; trình vào mode khởi động
SETB StartEnd ; đặt bit startend lên 1, cho khởi động
JMP KEY_RET  ; nhẩy đến tên nhãn key_ret

KeyOver:  ; trình cho tắt, kết thúc
CLR StartEnd ;  đặt bit startend xuống 0, kết thúc
JMP KEY_RET  ; nhẩy đến tên nhãn key_ret

KeyUp:  ; trình cho 8 Led dời qua phải
SETB UpDown ; đặt bit updown lên 1, dời qua phải
JMP KEY_RET ; nhẩy đến tên nhãn key_ret

KeyDown:  ; trình cho 8 Led dời qua trái
CLR UpDown ; đặt bit updown xuống 0, dời qua trái

KEY_RET:  ; đặt tên nhãn dùng cho lệnh nhẩy
RET  ; quay lại sau lệnh call keyproc

KEY:   ; đặt tên nhãn dùng cho lệnh nhẩy, trình dùng dò phím
CLR F0 ;  xóa bit f0
ORL P1,#00111100B ; lấy logic OR trị 00111100b và cảng p1
MOV A,P1 ;  chuyển trị hiện có của p1 vào thanh ghi a
ORL A,#11000011B ; lấy logic OR a và 11000011b, xét trạng thái 4 phím
CPL A ;  lấy bù a, đảo 8 bit trong thanh ghi a
JZ K_RET ; xét trị trong thanh a, có bằng 0 không? để nhẩy
CALL DELAY ; cho gọi chương trình trể
OR P1,#00111100B  ; lại lấy logia OR trị 00111100b cho cảng p1
MOV A,P1 ; lại chuyển trị hiện có của cảng p1 vào thanh ghi a
ORL A,#11000011B ; cho lấy logic OR trị trong a và trị 11000011b
CPL A   ; lại cho bù a, đảo 8 bit trong thanh ghi a
JZ K_RET  ; lại xét trị trong thanh a, có bằng 0? để nhẩy
MOV B,A ; chuyển trị trong a vào thanh b
SETB F0 ; đặt bit kiểm tra f0 lên 1, báo đã có phím nhấn

K_RET:  ; đặt tên nhãn dùng cho lệnh nhẩy
ORL P1,#00111100B ; Lấy logic OR trị hiện có trong p1 và 00111100b
MOV A,P1   ; chuyển trị hiện có trên cảng p1 vào thanh ghi a
ORL A,#11000011B  ; lấy logic OR trị trong a và 11000011b
CPL A  ; lấy bù a, đảo 8 bit trong thanh ghi a
JZ K_RET1 ; xét trị trong a có bằng 0 không? để nhẩy
JMP K_RET  ; nhẩy đến tên nhãn k_ret

K_RET1: ; đặt tên nhãn dùng cho lệnh nhẩy
RET   ; quay lại sau lệnh call key

D500MS: ; chương trình làm trể
PUSH PSW  ; tạm cho cất trị trong thanh ghi psw vào ngăn xếp
SETB RS0  ; đặt trị rs0 trong thanh ghi trạng thái psw lên 1
MOV R7,#200  ; chuyển trị 200 vào thanh ghi r7

D51:  ; đặt tên nhãn dùng cho lệnh nhẩy
MOV R6,#250  ; đặt trị 250 vào thanh ghi r6

D52:  ; đặt tên nhãn dùng cho lệnh nhẩy
NOP ; dòng không tác vụ
NOP ; dòng không tác vụ
NOP ; dòng không tác vụ
NOP ; dòng không tác vụ
DJNZ R6,D52  ; giảm trị trong r6 theo bước -1, r6=0?, chọn hướng nhẩy
DJNZ R7,D51  ; giảm trị trong r7 theo bước -1, r7=0?, chọn hướng nhẩy
POP PSW  ; lấy lại trị trước đó cho thanh ghi psw
RET  ; quay lại sau lệnh gọi call d500ms

LAMP:  ; chương trình điều khiển 8 Led trên cảng p3
JB StartEnd,LampStart ; chọn hướng nhẩy theo bit startend
MOV P3,#0FFH  ; đặt trị 11111111b vào cảng p3, tắt hết 8 Led
JMP LAMPRET ;  nhẩy về tên nhãn lampret

LampStart:  ; đặt tên nhãn cho lệnh nhẩy, trình dời 8 bit trong a qua trái
JB UpDown,LAMPUP ; nhẩy theo bit updown
MOV A,LAMPCODE ; chuyển trị trong lampcode cho thanh ghi
RL A ;  cho quay vòng 8 bit trong thanh ghi aqua hướng trái
MOV LAMPCODE,A ; chuyển trị trong a vào lampcode
MOV P3,A   ; cho xuất trị trong a ra cảng p3
CALL D500MS  ; gọi chương trình làm chậm d500ms
JMP LAMPRET  ; nhẩy về tên nhãn lampret

LAMPUP:  ; đặt tên nhãn cho lệnh nhẩy, trình cho dời 8 bit qua phải
MOV A,LAMPCODE  ; chuyển trị trong lampcode vào thanh ghi a
RR A ;  cho quay vòng 8 bit trong a qua hướng phải
MOV LAMPCODE,A  ; chuyển trị trong a vào lampcode
MOV P3,A  ; xuất trị trong a ra cảng p3
CALL D500MS  ; cho gọi chương trình trể d500ms

LAMPRET:  ; đặt tên nhãn cho lệnh nhẩy
RET  ; quay lại sau lệnh call
END  ; dừng biên dịch tại dòng này

 Tìm hiểu thêm một cách viết khác. Bạn xem thí dụ sau: 

Trong thí dụ này, chúng ta gắn 4 phím trên cảng p3 và dùng các phím này điều khiển trạng thái nhấp nháy của 8 Led đặt trên cảng p1.

Chương trình nguồn viết như sau:


ORG 0000H   ; Khởi đầu từ thanh ghi 0000h    LJMP START  ; nhẩy đến tên nhãn start
; các thanh ghi chuyên dùng cho chức năng ngắtORG 0003H  ; vị trí chạy ngắt INT0    RETI
ORG 000BH  ; vị trí chạy ngắt TF0    RETI
ORG 0013H  ; vị trí chạy ngắt INT1    RETI
ORG 001BH  ; vị trí chạy ngắt TF1    RETI
ORG 0023H  ; vị trí chạy ngắt RI var TI    RETI
;
CLEAR:  ; đặt tên nhãn cho lệnh nhẩy    RET
;
START:   ; đặn tên nhãn cho khời đầu   CALL CLEAR  
; gọi chương trình clear
; trình dò phímSTAR1:  ; đặt tên nhãn dùng cho lệnh nhẩy    MOV P3,#0FFH  ; đặt trị 11111111b vào p3, định trạng thái đầu    JNB P3.4,FUN0  ; dò bit 0 trên chân p3.4, để nhẩy    JNB P3.5,FUN1  ; dò bit 0 trên chân p3.5 để nhẩy    JNB P3.2,FUN2  ; dò bit 0 trên chân p3.2 để nhẩy    JNB P3.3,FUN3  ; dò bit 0 trên chân p3.3 để nhẩy    JNB F0,STAR1   ; nhẩy theo bit f0, f0=1, có nhấn phím    RET  ; quay lại sau lệnh call start;
FUN0:  ; tên nhãn dùng cho phím p3.4    CALL DL10MS ; gọi chương trình trể 10ms, tránh rung phím    JB P3.4,STAR1  ; kiểm tra lại phím nhấn trên p3.4WAITL0:   ; trình chờ bỏ phím     JNB P3.4,WAITL0 ; chờ bỏ phím    SETB F0  ; đặt bit kiểm tra f0 lên 1FUN01:  ; đặt tên nhãn dùng cho lệnh nhẩy    CALL FUN00  ; cho gọi chương trình fun00    CALL STAR1  ; quay lại tên nhãn star1    JMP FUN01   ; nhẩy về tên nhãn fun01; Viết tương dạng như trênFUN1:
    CALL DL10MS ;
    JB P3.5,STAR1
WAITL1:
    JNB P3.5,WAITL1 ;
    SETB F0
FUN10:
    CALL FUN11
    CALL STAR1
   JMP FUN10
; Viết tương dạng như trênFUN2:
   CALL DL10MS ;
   JB P3.2,STAR1
WAITL2:
   JNB P3.2,WAITL2 ;
   SETB F0
FUN20:
   CALL FUN22
   CALL STAR1
   JMP FUN20
; viết tương dạng như trênFUN3:
   CALL DL10MS ; gọi trể 10ms tránh ảnh hưởng của rung phím   JB P3.3,STAR1 ; kiểm tra lần nữa phím trên p3.3WAITL3:   ; tên nhãn   JNB P3.3,WAITL3 ; chờ bỏ phím ra   CLR F0   ; xóa bit f0, về trạng thái chờ nhấn phím   MOV P1,#0FFH ; đặt trị 11111111b để tắt 8 Led trên p1   JMP STAR1  ; quay lại tên nhãn star1

;  trình cho Led sáng lan lênFUN00:  
   MOV A,#0FEH
FUN000:
   MOV P1,A
   CALL DL05S
   JNB ACC.7,OUT
   RL A
   JMP FUN000
OUT: RET

;  trình cho các Led sáng nhẩyFUN11:
   MOV A,#0FEH
FUN111:
   MOV P1,A
   CALL DL05S
   JZ OUT
   RL A
   ANL A,P1
   JMP FUN111

; trình cho các 4 Led nhấp nháy xen kẻ FUN22:
   MOV A,#0AAH
   MOV P1,A
   CALL DL30S
   CPL A
   MOV P1,A
   CALL DL30S
   RET

; chương trình làm trể
DL512:
   MOV R2,#0FFH
LOOP1: 
   DJNZ R2,LOOP1
   RET
DL10MS:
   MOV R3,#14H
LOOP2: 
   CALL DL512
   DJNZ R3,LOOP2
   RET
DL05S:
   MOV R4,#0AH
LOOP3: 
   CALL DL10MS
   DJNZ R4,LOOP3
   RET
DL30S:
   MOV R5,#03H
LOOP4:
   CALL DL05S
   DJNZ R5,LOOP4
   RET
end 

Bài viết liên quan