Bài tập lớn môn lập trình hợp ngữ ASM. Đề tài: Mô phỏng máy tính điện tử cơ bản sử dụng bàn phím 4x4 và màn hình LCD 2x16 trên Proteus
Trang 2MỤC LỤC
Trang
Lời nói đầu……….0
PHẦN I: Sơ đồ mạch và các linh kiện sử dụng……… 1
1.Sơ đồ mạch……… 1
2.Linh kiện……….2
a.Bàn phím 4x4……… 2
b.LCD 16x2……… 3
c.Vi điều khiển 8051……… 4
d.Linh kiện khác………5
PHẦN II: Chương trình và giải thích lệnh……….7
Trang 3LỜI NÓI ĐẦU
Hiện nay có rất nhiều các loại vi điều khiển của các hãng khác
nhau.Ví dụ như họ 89c51, AVR của hãng Atmel,PIC của hãng Microchip,…vv
Trong các loại vi điều khiển thì phổ biến nhất ở Việt Nam hiện nay là chip vi điều khiển thuộc họ 8051 Do Intel sản xuất là một trong những chip vi điều khiển xuất hiện sớm nhất nên nó là nền tảng cho sự phát triển của các họ vi điều khiển thế hệ sau.Vì thế nên nếu hiểu về 8051 thì sẽ dễ dàng hơn cho việc tìm hiểu các chip
vi điều khiển khác thuộc thế hệ sau Hơn nữa nó được sử dụng trong hầu hết các loại đồ điện tử dân dụng ở nước ta hiện nay cho nên lập trình cho vi điều khiển đã được đưa vào chương trình học cho sinh viên
Qua quá trình học tập trên lớp và tìm hiểu tài liệu về 8051 Nhóm chúng em đã thực hiện mô phỏng chiếc máy tính điện tử cơ bản sử dụng bàn phím 4x4 và màn hình LCD 2x16 trên Proteus
Cơ sở lập trình sử dụng ngôn ngữ Assembler Là một chiếc máy tính đơn giản có thể thực hiện được những phép tính như cộng, trừ, nhân, chia Chi tiết được trình bày ở phần sau bài báo cáo của nhóm
Do điều kiện có hạn nên nhóm em chưa thể làm được mạch thực tế Nhóm sử dụng phần mềm Proteus để mô phỏng hữu hiệu
về bài thiết kế Trong quá trình làm báo cáo còn nhiều hạn chế, nhóm em hi vọng được sự chỉ bảo của giáo viên bộ môn và mọi người
Chúng em xin chân thành cảm ơn!
Trang 4PHẦN I
SƠ ĐỒ MẠCH VÀ CÁC LINH KIỆN SỬ DỤNG
1 Sơ đồ mạch
Sơ đồ mạch được vẽ trên phần mềm Proteus Sử dụng bàn phím
(keypad) 4x4 và mành hình LCD 2x16 có trong thư viện linh kiện của phần mềm Kết hợp với một số linh kiện khác như điện trở, tụ điện…
2 Linh kiện
a Bàn phím ma trận 4x4
Trang 5* Cấu tạo:
Phím bấm được nối thành ma trận 4 hàng x 4 cột các hàng và cột được nối với các chân cổng vào ra của vi điều khiển Psoc Khi một phím được bấm,
nó sẽ nối một hàng và một cột tương ứng Như vậy ta sẽ có 16 nút nhấn mà chỉ mất có 8 chân vi điều khiển còn muốn tiếp kiệm hơn nữa là dùng con giải
mã 74138 hay dùng 74LS154 Khi nút 0 được nhấn thì nó nối giữa cột 1 hàng
1 Còn nút 1 được nhấn thì cột 2 và hàng 1 được nối hay nút 2 được nhấn thì nối giữa cột 3 và hàng 1 cứ như vậy đến nút thứ 15
*Nguyên lý quét:
Thuật toán quét phím được sử dụng là lần lượt tìm hàng và tìm cột (hoặc ngược lại) Khi tìm hàng, các hàng sẽ được đặt làm đầu vào,các cột được
đặt làm đầu ra mức thấp Sau đó kiểm tra các hàng xem có hàng nào ở mức
Trang 6thấp hay không (có phím nào bấm gây ra nối với cột hay không)? Sau khi xác
định được hàng sẽ đặt các cột làm đầu vào, hàng vừa tìm được làm đầu ra
mức thấp Việc kiểm tra được tiến hành với các cột Sau khi xác định được hàng và cột sẽ suy ra phím được bấm
Nói thế này cũng khó hiểu nhỉ nhưng mà chỉ cần hiểu sơ qua thuật toán quét LED như thế này:
+ Đầu tiên cho các hàng ở mức 1 và các cột ở mức 0
+ Kiểm tra xem nào hàng nào đựoc nhấn (khi nút được nhấn) tức là
đựoc nhận tín hiệu từ các cột
+ Nếu mà có 1 hàng bất kỳ đựoc nhấn sau đó ta lại chuyển giá trị 0 vào hàng đựoc nhấn và giá trị 1 vào các cột Khi đó cột lại nhận nhiệm vụ làm tín hiệu vào Nếu mà 1 trong các cột đựoc nhấn (Khi nút được nhấn) trong các trường hợp này thì cho ra các giá trị tương ứng
+ Việc kiểm tra các hàng khác là tương tự như trên!Ở đây không đề cập đến việc nhiễu phím nút nhấn nên bỏ qua
b Màn hình LCD 2x16
* Cấu tạo:
Trang 7* Nguyên lý họat động
-5v và đất tương ứng thì chân Vee được dùng để điều khiển độ tương phản của LCD
- Chân chọn thanh ghi Rs: Có ghi (R/W): Đầu vào đọc/ghi cho phép E
được sử dụng bởi LCD để chốt dữ liệu của nó Khi data được cấp đến chân
dữ liệu thì một xung mức cao xuống thấp phải được áp đến chân này và LCD chốt dữ liệu trên các chân dữ liệu Xung này phải rộng tối thiểu 450ns
- Chân D0-D7: Đây là 8 chân dữ liệu 8 bit, được dùng để gửi thông tin lên LCD hoặc đọc nội dung của các thanh ghi trong LCD Để hiển thị các chữ cái và các con số, chúng ta gửi các mã ASCII của các chữ cái từ A đến Z, a
đến f và các con số từ 0-9 các chân này khi RS =1
- Cũng có các mã lệnh mà có thể được gửi đến LCD để xóa màn hình hoặc đưa con trỏ về đầu dòng hoặc nhấp nháy con trỏ
- Sử dụng RS = 0 để kiểm tra bít cờ bận xem LCD có sẵn sàng nhận thông tin? Cờ bận là bít D7 và có thể được đọc khi R/W = 1 và RS = 0 như sau:
+ Nếu R/W = 1, RS = 0 khi D7 = 1 thì LCD bận bởi các hai thanh ghi trong LCD, chân RS được dùng để chọn thanh ghi như sau: Nếu RS = 0 thì thanh ghi mà lệnh được lựa chọn để cho phép người dùng gửi một lệnh chẳng hạn như xóa màn hình, đưa con trò về đầu dòng v v… Nếu RS = 1 thì thanh ghi dữ liệu được chọn cho phép người dùng gửi dữ liệu cần hiển thị trên LCD
- Chân đọc/ công việc bên trong và sẽ không nhận bất kỳ thông tin mới nào Khi D7 =0 thì LCD sẵn sàng nhận thông tin mới
c Vi điều khiển 8051
*Cấu tạo:
Trang 8Vi điều khiển 8051 được Intel sản xuất năm 1981 Đặc điểm chủ yếu:
d Một số linh kiện khác
74LS373, 6264, 74LS00, diode có chức năng cấp ổn định nguồn cho LCD, tạo bộ nhớ tạm thời và bộ đếm logic
Trang 9PHẦN II CHƯƠNG TRÌNH VÀ GIẢI THÍCH LỆNH
phim ban lan 1 = 0
ljmp main ;nhay den chuong trinh main
org 0bh ;su dung ngat bo timer 0
ljmp ngattimer0 ;nhay den chuong trinh ngat
org 40h ;viet tai vi tri 40h
main:
lcall khoitao ;nhay den nhan~ khoi tao
mainloop: ;nhay den chuong trinh chinh
lcall quetphim ;nhay den quet phim, de nhap vao so thu nhat
lcall quetphim2 ;nhay den quet phim de nhap vao so thu 2
sjmp mainloop ;lap lai o cho nay
khoitao: ;khoi tao ,su dung timer 0,
mov r1,#0
mov tmod,#01h
setb et0
setb ea
mov th0,#high(-10000)
mov tl0,#low(-10000)
setb tr0
ret
ngattimer0: ;chuong trinh ngat time
push psw
push acc
mov th0,#high(-10000)
mov tl0,#low(-10000)
lcall quetled
pop acc
pop psw
reti
quetled: ;chuong trinh quet led va hien thi
mov p0,r1
;mov r6,#4
;mov r5,#3
Trang 10MOV A,#38H ;thiet lap LCD
acall delay ;che
mov A,#0eh ;nhap nhay con tro
acall conlenh
acall delay
acall hienthi
mov A,#01h ;hien thi dau ' cach'
acall hienthi
acall delay
cong:
mov A,r6 ;di chuyen 6 vao thanh ghi R6,de lat nua dua vao thanh ghi a,hien thi
add a,#30h ;cong them vao 30h,de hien thi dang asscii
acall hienthi
acall delay
mov a,#'+' ;hien thi dau + thi khong can add a,#30h
acall hienthi
acall delay
mov a,r5
add A,#30h
acall hienthi
acall delay
mov a,#'=' ;hien thi dau =
acall hienthi
acall delay
;doan nay la di chuyen r5 vao a,sau do cong r6 voi a,cong 31h de hien thi dang ascii cua no
mov a,r5
Trang 11add a,r6
add a,#30h
acall hienthi
acall delay
mov r1,#0
mov r1,a
ret
;cac chuong trinh hien thi
conlenh: ;tao ra khoang chong 'cach' MOV P1, A
CLR P3.0
CLR P3.1
SETB P3.2
CLR P3.2
RET
hienthi: ;hien thi nhieu so,
MOV P1, A
SETB P3.0
CLR P3.1
SETB P3.2
CLR P3.2
RET
delay: ; chuong trinh che time
mov TMOD,#01h
mov R0,#1
againi:
mov TH0,#high(-500)
mov TL0,#low(-500)
setb TR0
here:
clr TF0
ret
;ret
delay1ms: ;che 1ms
mov r2,#100
Trang 12delay1msloop:
nop
nop ;dung de tre 1 khoang thoi gian
nop
nop
nop
nop
nop
nop
djnz r2,delay1msloop ;R2-1 nhay den dalay1msloop ret
delay10ms: ;tre 10ms
lcall delay1ms
lcall delay1ms
lcall delay1ms
lcall delay1ms
lcall delay1ms
lcall delay1ms
lcall delay1ms
lcall delay1ms
lcall delay1ms
ret
quetphim:
mov p2,#11110000b
jnb p2.4,quet ;jnb la nhay neu p2.4=0
jnb p2.5,quet
jnb p2.6,quet
jnb p2.7,quet
ret
quet:
lcall delay10ms
jnb p2.4,hang1
jnb p2.5,hang2
jnb p2.6,hang3
jnb p2.7,hang4
ret
hang1:
setb p2.0 ;cho bit p2.0=1
setb p2.1
setb p2.2
Trang 13setb p2.3
clr p2.4
nop
jnb p2.0,phim1 jnb p2.1,phim2 jnb p2.2,phim3 jnb p2.3,phim4 ret
hang2:
setb p2.0
setb p2.1
setb p2.2
setb p2.3
clr p2.5
nop
jnb p2.0,phim5 jnb p2.1,phim6 jnb p2.2,phim7 jnb p2.3,phim8 ret
hang3:
setb p2.0
setb p2.1
setb p2.2
setb p2.3
clr p2.6
nop
jnb p2.0,phim9 jnb p2.1,phim10 jnb p2.2,phim11 jnb p2.3,phim12 ret
hang4:
setb p2.0
setb p2.1
setb p2.2
setb p2.3
clr p2.7
nop
jnb p2.0,phim13 jnb p2.1,phim14 jnb p2.2,phim15 jnb p2.3,phim16
Trang 14ret
phim1:
jnb p2.0,$ mov r1,#7 mov r5,#7 ret
phim2:
jnb p2.1,$ mov r1,#4 mov r5,#4 ret
phim3:
jnb p2.2,$ mov r1,#1 mov r5,#'1' ret
phim4:
jnb p2.3,$ mov r1,#0 mov r5,#0 ret
phim5:
jnb p2.0,$ mov r1,#8 mov r5,#8 ret
phim6:
jnb p2.1,$ mov r1,#5 mov r5,#5 ret
phim7:
jnb p2.2,$ mov r1,#2 mov r5,#2 ret
phim8:
jnb p2.3,$ mov r1,#0 mov r5,#0 ret
phim9:
jnb p2.0,$
Trang 15mov r1,#9
mov r5,#9
ret
phim10:
jnb p2.1,$
mov r1,#6
mov r5,#6
ret
phim11:
jnb p2.2,$
mov r1,#3
mov r5,#3
ret
phim12:
jnb p2.3,$
mov r5,#'='
ret
phim13:
jnb p2.0,$
mov r5,#'\'
ret
phim14:
jnb p2.1,$
mov r5,#'x'
ret
phim15:
jnb p2.2,$
mov r5,#'-'
ret
phim16:
jnb p2.3,$
mov r5,#'+'
ret
;quet phim 2
quetphim2:
mov p2,#11110000b jnb p2.4,quet2 jnb p2.5,quet2
Trang 16jnb p2.6,quet2 jnb p2.7,quet2 ret
quet2:
lcall delay10ms jnb p2.4,hang12 jnb p2.5,hang22 jnb p2.6,hang32 jnb p2.7,hang42 ret
hang12:
setb p2.0
setb p2.1
setb p2.2
setb p2.3
clr p2.4
nop
jnb p2.0,phim123 jnb p2.1,phim22 jnb p2.2,phim32 jnb p2.3,phim42 ret
hang22:
setb p2.0
setb p2.1
setb p2.2
setb p2.3
clr p2.5
nop
jnb p2.0,phim52 jnb p2.1,phim62 jnb p2.2,phim72 jnb p2.3,phim82 ret
hang32:
setb p2.0
setb p2.1
setb p2.2
setb p2.3
clr p2.6
nop
jnb p2.0,phim92
Trang 17jnb p2.1,phim102 jnb p2.2,phim112 jnb p2.3,phim122 ret
hang42:
setb p2.0
setb p2.1
setb p2.2
setb p2.3
clr p2.7
nop
jnb p2.0,phim132 jnb p2.1,phim142 jnb p2.2,phim152 jnb p2.3,phim162 ret
phim123:
jnb p2.0,$
mov r1,#7
mov r6,#7
ret
phim22:
jnb p2.1,$
mov r1,#4
mov r6,#4
ret
phim32:
jnb p2.2,$
mov r1,#1
mov r6,#1
ret
phim42:
jnb p2.3,$
mov r1,#0
mov r6,#0
ret
phim52:
jnb p2.0,$
mov r1,#8
mov r6,#8
ret
phim62:
jnb p2.1,$
Trang 18mov r1,#5 mov r6,#5 ret
phim72:
jnb p2.2,$ mov r1,#2 mov r6,#2 ret
phim82:
jnb p2.3,$ mov r1,#0 mov r6,#0 ret
phim92:
jnb p2.0,$ mov r1,#9 mov r6,#9 ret
phim102:
jnb p2.1,$ mov r1,#6 mov r6,#6 ret
phim112:
jnb p2.2,$ mov r1,#3 mov r6,#3 ret
phim122:
jnb p2.3,$ mov r6,#'='
phim132:
jnb p2.0,$ mov r5,#'\' ret
phim142:
jnb p2.1,$ mov r6,#'x' ret
Trang 19phim152:
jnb p2.2,$ mov r6,#'-' ret
phim162:
jnb p2.3,$ mov r6,#'+' ret
end