2.4.Các cấu trúc lập trình với hợp
ngữ
2.4.1. Các lệnh liên quan
2.4.2. Cấu trúc điều kiện
2.4.3. Cấu trúc lặp
1
Các lệnh điều kiện
• Lệnh nhảy có điều kiện: JZ, JNZ, DJNZ, JC, JNC, JB, JNB
• Lệnh nhảy không điều kiện: SJMP (nhảy ngắn), LJMP (nhảy dài)
• Ví dụ:
MOV
JNZ
MOV
NEXT:
…
2
A,R5
NEXT
R5,#55h
;A=R5
;Nhảy tới NEXT nếu A khác 0
Lệnh lặp
• Lệnh DJNZ
• Cú pháp
DJNZ
thanh_ghi, nhãn
+ Sau mỗi lần nhảy, giá trị thanh ghi bị giảm đi 1
+ Nếu giá trị thanh ghi vẫn khác 0 thì nhảy tới nhãn
• Ví dụ: Xóa thanh ghi A, cộng 3 vào thanh ghi A 10 lần
MOV A,#0
MOV R2,#10
BACK:
ADD A,#3
DJNZ R2,BACK
;Lặp 10 lần
MOV R5,A
;Cất A vào R5
3
Các lệnh logic, lệnh quay
• Lệnh ANL
ANL đích, nguồn ; đích=đích AND nguồn
Mục đích: che, xóa bit
VD: - Xóa 4 bit thấp của thanh ghi A
ANL A,#0F0h
• Lệnh ORL
ORL đích, nguồn ; đích=đích OR nguồn
Mục đích: thiết lập bit
VD: - Thiết lập 4 bit cao của thanh ghi A
ORL
A,#0F0h
4
Các lệnh logic, lệnh quay
• Lệnh XRL
XRL
đích, nguồn ; đích=đích XOR nguồn
Mục đích: - Xóa thanh ghi (XOR với chính nó)
- Đảo bit (XOR với 1)
VD: Xóa thanh ghi A
XRL A,A
Đảo các bit của thanh ghi A
XRL A,#0FFh
5
Các• lệnh logic, lệnh quay
Lệnh quay
• Lệnh quay phải: RR
• Lệnh quay trái: RL
6
A
A
Các• lệnh logic, lệnh quay
Lệnh quay
• Lệnh quay phải qua cờ nhớ: RRC
• Lệnh quay trái qua cờ nhớ: RLC A
7
A
Cổng vào/ra và lập trình
• 8051 có 4 cổng vào ra (mỗi cổng 8 bit): P0, P1, P2, P3
• Sau khi reset, các cổng ở chế độ mặc định là cổng ra
• Để các cổng/chân làm việc ở chế độ cổng/chân vào phải tiến hành ghi
các bit 1 ra các cổng/chân tương ứng
• Ví dụ: MOV
P1,#0FF
; Cổng 1 thành cổng vào
SETB P1.0 ; Chân P1.0 làm chân vào
MOV P1,#03
; Chân P1.0 và P1.1 làm chân vào
; các chân còn lại làm chân ra
8
Nguyên lý bit cổng
Sơ đồ nguyên lý của một bit cổng
9
Nguyên lý bit cổng
• Đọc dữ liệu:
• Đọc tín hiệu từ chân IO:
Read Pin =0: Đệm 3 trạng
thái thông, tín hiệu từ IO pin
được truyền tới Data bus
10
Nguyên lý bit cổng
• Ghi dữ liệu: ? Write=1:Q=Data(i).
• Data(i)=0:
/Q=1
Gate=1
Rds nhỏ, IO pin =0
• Data(i)=1:
/Q=0
Gate=0
Rds >>, IO pin =1
11
Lập trình xuất dữ liệu ra cổng/chân
• Xuất dữ liệu ra cổng ra
MOV
tên_cổng, giá trị
• Ví dụ:
• MOV P1, #55h
• Xuất dữ liệu ra từng chân
• Đưa chân lên mức cao:
SETB
bit
Ví dụ: SETB
P1.0
• Đưa chân xuống mức thấp:
CLR
Ví dụ: CLR
12
bit
P1.0
Ví dụ
MOV
13
P0,#30h
Lập trình đọc dữ liệu từ cổng vào
• Bước 1: Thiết lập cổng làm việc ở chế độ cổng vào
• Bước 2: Đọc dữ liệu trên cổng
Ví dụ:
MOV
P1, #0FFh
MOV
A, P1 ; Đọc giá trị tại
; cổng P1, lưu vào A
MOV
P2, A ; Xuất ra cổng P2
14
Ví dụ
MOV
MOV
MOV
MOV
15
P3,#0FFh
A,P3
P0,A
P2,A
Lập trình C cho VĐK 8051
• Lập trình cổng vào,ra
• Lập trình hiển thị led 7 thanh
• Lập trình xử lý ngắt
• Lập trình bộ đếm và định thời (Timer/Counter)
• Lập trình ghép nối bàn phím
• Lập trình điều khiển LCD
• Lập trình bảng quang báo
16
Lập trình C cho 8051
• Tuân thủ các cú pháp của ngôn ngữ lập trình C chuẩn ANSI C
• Hỗ trợ thêm một số kiểu dữ liệu/từ khóa mới
• sfr: định nghĩa một thanh ghi đặc biệt (Special Function Register)
• VD: sfr P1=0x90; //Từ đây có thể truy xuất cổng P1
//ở địa chỉ 0x90 thông qua biến P1
• sbit: định nghĩa từng bit trong thanh ghi đặc biệt
• VD: sbit Led_pin=P1^1; //Từ đây có thể truy xuất chân 1 của
//cổng P1 thông qua biến Led_pin
• bit: kiểu dữ liệu mang hai giá trị 0 hoặc 1
Ví dụ: xem file AT89X51.h
Tham khảo: />17
Chương trình Hello World
(Nhấp nháy led chân P1_0)
#include <at89x51.h>
void delay(int interval){
int i,j;
for(i=0;i<255;i++){
for(j=0;j
}
}
void main(){
while(1){
P1_0=1;
delay(100);
//Tre mot khoang thoi gian
P1_0=0;
delay(100);
//Tre mot khoang thoi gian
}
}
18
Lập trình cổng vào,ra
• Lập trình xuất dữ liệu ra cổng hoặc chân ra
• Ghi dữ liệu ra cổng: Tên cổng=dữ liệu
• VD: P1=0xff;
• Ghi dữ liệu ra chân: Tên chân ra=bit (0/1)
• VD: P1_0=1;
• Lập trình đọc dữ liệu từ cổng hoặc chân vào
• Thiết lập chân hoặc cổng vào(ghi ra các bit 1)
• Đọc dữ liệu từ cổng: Tên biến=Tên cổng
• VD: unsigned char value;
P1=0xff; //Chuyển cổng sang chế độ cổng vào
value=P1; //Đọc dữ liệu từ cổng P1
• Đọc dữ liệu từ chân: Tên biến=Tên chân
• VD: bit value;
P1_0=1; //Chuyển chân P1_0 thành chân vào
value=P1_0; //Đọc dữ liệu từ chân P1_0
19
Ví dụ
• Ví dụ 1: Xuất dữ liệu ra cổng ra
• Xuất dữ liệu điều khiển 8 led trên cổng P0 nhấp nháy so le.
• Ví dụ 2: Đọc dữ liệu từ chân vào
• Thêm một nút bấm vào chân P1_0, nếu nút bấm ở trạng thái mở, 8 led trên
cổng P0 sáng nhấp nháy so le, nếu nút bấm được nhấn thì 8 led dữ nguyên
trạng thái.
20
Ví dụ 1: xuất dữ liệu ra cổng
21
xuất dữ liệu ra cổng
#include <at89x51.h>
void delay(int interval){
int i,j;
for(i=0;i<255;i++){
for(j=0;j
}
}
void main(){
while(1){
P0=0x55;
delay(100);
P0=0xAA;
delay(100);
}
}
22
Ví dụ 2: đọc dữ liệu từ chân vào
23
đọc dữ liệu từ chân vào
#include <at89x51.h>
void delay(int interval){
int i,j;
for(i=0;i<255;i++){
for(j=0;j
}
}
void main(){
while(1){
//Kiem tra trang thai chan P1_0 (dau voi cong tac)
if(P1_0 == 1){
P0=0x55;
delay(100);
P0=0xAA;
delay(100);
}
}
}
24
Hiện tượng nảy phím (key bounce)
• Khi sử dụng các phím bấm cơ khí sẽ có hiện tượng này
phím, đó là hiện tượng tín hiệu thay đổi mức liên tục
trong một khoảng thời gian ngắn trước khi chuyển sang
trạng thái ổn định.
Lý tưởng
Thực tế
25