Vi Điều Khiển 8051

1.Lập trình Với Nút Nhấn qua ví dụ :

1.1 . kỹ thuật 1 kiểm tra nút nhấn bằng cách đợi !

vấn đề đặt ra ở đây là làm sao biết được nút nhấn tác động ( nhấn Hay nhả ). đây là 1 câu hỏi rất thú vị bởi nó phụ thuộc hoàn toàn vào phần cứng mà bạn kết nối với vi điều khiển theo cách nào. nhìn vào hình 1 các bạn sẽ có câu trả lời đối với cách kết nối phía bên tay trái thì bình thường tín hiệu sẽ là mức cao , khi tác động tín hiệu sẽ là mức thấp. còn nút nhấn phía bên phải sẽ ngược lại.

trong ví dụ này mình sẽ trình bày cho các bạn làm thế nào để khi nhấn 1 nút nhấn led Sáng nhấn 1 lần nữa Led tắt . bạn thấy đơn giản quá không!!? chưa chắc!

hình 1: các cách kết nối khác nhau của nút nhấn.

code

Butt bit P0.0 ; nút nhấn được gắn vào chân P0.0 ; tác động mức thấp

Led bit P1.0 ; Led chân P1.0

Org 000h

Main:

Jb Butt,Congviectieptheo ; nếu nút nhấn không tác động làm việc khác

Cpl Led ; đảo Led

Jnb Butt,$ ; chờ nhả

Congviectieptheo :

Jmp Main

End

download ví dụ:

giải thích : 2 dòng đầu tiên ta sẽ định nghĩa nút nhấn và led cho các chân tương ứng P0.0 và p1.1

như vậy khi ta kiểm tra "Butt" hay tác động "Led " tức là ta đang kiểm tra chân P0.0 và P1.1

lệnh JB Butt,congviectieptheo (JB nhảy nếu bằng 1 jump if bit) tức là nhảy nếu bằng 1 hay nút nhấn không tác động thì nhảy đến nhãn "congviectieptheo" làm việc tiếp theo.

nếu Butt = 0 thì điều kiện sai thì làm lệnh kế tiếp tức là Đảo giá trị của led

sau đó thì chờ nhả bằng lệnh Jnb Butt,$ <=>Here: Jnb Butt,Here tức là nhảy tại chỗ nếu butt=0(nút nhấn còn nhấn),nếu Butt = 1(nhả) thì điều kiện sai vi điều khiển làm việc tiếp theo.

lệnh Jmp là lệnh nhảy không điều kiện nhảy đến nhãn "Main" chay lại từ đầu. trong ví dụ này ta sẽ thấy khi bạn nhấn thì trạng thái của led nó sẽ đổi trạng thái ngay lập tức, nhưng nếu muốn Led đảo trạng thái khi nhả nút nhấn thì sao ? câu trả lời rất đơn giản là mình chờ nút nhấn nhả rồi mới đảo led. vậy thì code phải thay đổi như thế nào: rất đơn giản bạn chỉ cần đưa lệnh Jnb Butt,$ ra trước lệnh Cpl Led rồi biên dịch lại là được.

Bài tập dành cho bạn hãy điều khiển 2 led bằng 2 nút nhấn.

đáp án :

code

Butt1 bit P0.0 ; nút nhấn được gắn vào chân P0.0 ; tác động mức thấp

butt2 bit P0.1

Led1 bit P1.0 ; Led chân P1.0

Led2 bit P1.1

Org 000h

Main:

Jb Butt1,Kiemtra_Nut2 ; nếu nút nhấn không tác động làm việc khác

Cpl Led1 ; đảo Led

Jnb Butt1,$ ; chờ nhả

Kiemtra_Nut2 :

Jb Butt2,Congviectieptheo ; nếu nút nhấn không tác động làm việc khác

Cpl Led2 ; đảo Led

Jnb Butt2,$ ; chờ nhả

Congviectieptheo :

Jmp Main

End

download

đến đây bạn có thể làm với nhiều nút nhấn và nhiều led Hơn rồi chứ!

nhưng mà cần phân tích 1 xíu : nếu khi bạn nhấn và giữ luôn nút 1 hoặc nút 2 thì điều gì sẽ xảy ra! đó là nhấn nút còn lại sẽ bị vô tác dụng

tại sao lại như vậy?

lý do ở đây là sau khi đảo led thì bạn sẽ chờ nút đó nhả mới đi làm việc khác cho nên chương trình sẽ không phát hiện được nút nhấn kia tác động vậy chúng ta sẽ xử lý ra sao với việc này! cách giải quyết ở đây là gì và có bao nhiêu cách

chắc là có 2 cách :

  • thứ nhất là xài ngắt ngoài ( đề cập sau)
  • thứ 2 là bằng cách nào đó không cho chương trình chờ nút nhấn đó nhả nhưng vẫn phải biết lúc nào nó nhả ??? bạn tin vào điều đó không!

câu trả lời là làm được và chắc chắn làm được :

ta xem lưu đồ sau: