Các anh ơi cho em hỏi , làm sao đề tếp ban phím PS2 với LCD 16*2 .
Thông báo
Collapse
No announcement yet.
keyboard ps2 -lcd
Collapse
X
-
chao bac.
giao tiep voi keyboard voi lcd rat de,nhung ban phai nam duoc cach giao tiep no nhu the nao?
keyboard thi co 4 day ra:2 day nguon va dat
1:xung clock
1:data
ban se noi voi 2 chan bat ky voi 8951(tot nhat dung noi den cac chan dac biet):1 xung clock va 1 cua data.
va ban se xem tai lieu cua lcd khi nao no doc data(timer diagram)
dong thoi ban nam duoc ma code cua keyboard
ban viet chuong trinh doc va so sanh tu ky tu
-----------
chu ban thanh cong
-
Cái này hay đó,nếu bọn mình tận dụng được bàn phím máy tính để thay thế các loại bàn phím tự chế thì sẽ tiết kiệm được rất nhiều công sức và tiền bạc.Hồi trước mình có làm đèn Matrận Led chạy chữ,làm cái bàn phím để nhập khí tự vào rất là cực và tốn tiến.Bạn nào có kinh nghiệm xin hảy Post lên thuật toán giải mã Keyboard để mọi người cùng học hỏi.Thank
email:
Giá mà mạch điện tử không có nhiễu (noise) thì mình bây giờ đã là ... đại gia
Comment
-
Nếu bác chơi được AVR thì vào Atmel.com load cái ApNote về KeyBoard về mà đọc. Hướng dẫn chi tiết luôn. Nếu không tải được thì liên hệ với em: Thangktvta@Gmail.comNỏ biết chữ mần răng ký được??!! Thôi nhé.
Comment
-
Tôi là thành viên mới của diễn đàn. Mình đã thực hiện giao tiếp với bàn phím máy tính thực hiện việc đếm sản phẩm, hiện thị trên LCD, nhưng mình viết bằng ngôn ngữ VHDL vì vậy có lẽ không trùng với tìm kiếm của bạn. Tuy vậy mình vẫn Post lên đây phần thuật toán nói chung và bảng mã tuyến tính của bàn phím IBM để các bạn tham khảo.
· Phân tích và hướng thiết kế:- Đầu tiên là bảng mã hoá bàn phím PS2 do IBM cung cấp được đưa vào Rom nhằm mục đích giải mã 7 bít sang mã ASCII, bít địa chỉ thứ 7 dành cho phím Caplock, bits thứ 8 dành cho phím Shift. Dưới đây là bảng mã hoá bàn phím PS2 do IBM cung cấp.
x"00327761737a000000317100000000000060090000000000 0000000000000000", -- 1F - 00
x"003837756a6d00000036796768626e000035727466762000 0033346564786300", -- 3F - 20
x"00005c005d0d000000003d5b00270000002d703b6c2f2e00 0039306f696b2c00", -- 5F - 40
x"0000000000000000001b000000007f000000000000000000 0008000000000000", -- 7F - 60
x"00325741535a00000031510000000000007e090000000000 0000000000000000", -- 9F - 80
x"003837554a4d00000036594748424e000035525446562000 0033344544584300", -- BF - A0
x"00005c005d0d000000003d5b00270000002d503b4c2f2e00 0039304f494b2c00", -- DF - C0
x"0000000000000000001b000000007f000000000000000000 0008000000000000", -- FF - E0
x"00405741535a00000021510000000000007e090000000000 0000000000000000", -- 1F - 00
x"002a26554a4d0000005e594748424e000025525446562000 0023244544584300", -- 3F - 20
x"00007c007d0d000000002b7b00220000005f503a4c3f3e00 0028294f494b3c00", -- 5F - 40
x"0000000000000000001b000000007f000000000000000000 0008000000000000", -- 7F - 60
x"00407761737a000000217100000000000060090000000000 0000000000000000", -- 9F - 80
x"002a26756a6d0000005e796768626e000025727466762000 0023246564786300", -- BF - A0
x"00007c007d0d000000002b7b00220000005f703a6c3f3e00 0028296f696b3c00", -- DF - C0
x"0000000000000000001b000000007f000000000000000000 0008000000000000" -- FF - E0
Chúng ta không nhất thiết phải hiểu quá rõ vì sao họ lại mã hoá như vậy vì thực ra ta không có mục đích sẽ chế tạo ra bàn phím kiểu này. Ở đây nhiệm vụ chính của chúng ta là sử dụng nó để giải quyết bài toán mà chúng ta đặt ra. Các kí hiệu giải thích ở bên phải cùng là các mã hex tương ứng với các kí tự ASCII.
Các dữ liệu được truyền từ bàn phím theo phương pháp truyền nối tiếp vì vậy cũng giống như bất cứ cách thức thực hiện truyền tin nối tiếp nào, dữ liệu truyền đi đều phải đưa qua bộ đệm truyền, cũng tương tự như vậy, dữ liệu nhận từ bàn phím cũng phải thực hiện đọc lần lượt từ bộ đệm tương ứng.Chính vì vậy cần phải sử dụng một mô hình máy trạng thái để điều khiển thao tác chuyển đổi nối tiếp sang song song và từ song song sang nối tiếp. Quá trình chuyển đổi từ nối tiếp sang song song để đưa ra đệm truyền ở thao tác quét phím và quá trình ngược lại cho thao tác khôi phục mã ASCII.
Để tương xứng với bảng mã của IBM ở đây chúng ta có khai báo bít Parity để nhận dạng cạnh xung điều khiển và các lệnh khác nhau từ bàn phím, tuy nhiên do mục đích của chúng ta không cần quá chú trọng điều đó vì vậy ta đã không xử lý với bít này. Thay vào đó ta dùng hai bít "Extended" (0xE0) và "Released" (0xF0) để làm công việc đó.
Cũng giống như quá trình truyền thông tin nối tiếp khác, ở đây chúng ta cần phải xử dụng các cờ báo hiệu, loạt cờ chức năng bao gồm xác nhận phím ấn, cờ báo cho phép chuyển đổi song song, nối tiếp, cờ báo lỗi trạng thái bàn phím do có quá nhiều phím bị nhấn, cờ báo nhận….đều phải được khai báo để sử dụng.
Ở đây, cũng cần phải lưu ý rằng để tránh tình trạng các phím được ấn đồng loạt, ta xử lý đồng thời hai tín hiệu Ps2_clk và Ps2_data_line thỉnh thoảng được kéo xuống thấp và tương đương với các hàng điện trở đặt ở trạng thái trở kháng cao, đồng nghĩa với việc xác nhận không có dòng dữ liệu nào được phép truyền đi cả. Hơn nữa trong chương trình cũng đặt ra việc xử lý chống rung cho bàn phím bằng cách đưa ra khoảng thời gian hãm “debounce timer”.
Điều cần quan tấm cuối cùng là việc đồng bộ tốc độ quét là xung clock 60us được tạo ra bằng cách chia tần số. Cũng nhấn mạnh thêm rằng tần số chia ở đây sử dụng tần số 12.5Mhz. Chính vì vậy trong việc chia tần số tạo ra 60us chính là sử dụng tần số 12.5Mhz để chia chứ không phải dùng xung clock 50Mhz từ hệ thống( do vậy trong chương trình có hằng số 750, là hệ số tần số phải chia, vì 750/60us=12,5Mhz-đây là điều hết sức lưu ý khi các bạn đọc chương trình. Sở dĩ chúng ta làm công việc vòng vo này vì tần số chia 12.5 ở đây chúng ta sẽ phải sử dụng ở rất nhiều bài toán như bài toán truyền tin nối tiếp, bài toán giao tiếp với màn hình… Một tham số thứ hai nữa là xung clock 5us được sử dụng cho mục đích chống rung do hiện tượng nẩy phím.
Comment
-
Minh thay cái này bên diendandientu co noi qua roi: ban qua day coi thu nhe:
http://www.diendandientu.com/diendan...ad?thread=8116
:-B
Comment
-
quên nữa: Trang nay có sơ đồ chân của cổng PS/2 ne:
http://www.fiacopetti.it/mcu-rs232-ps2_en.htm:-B
Comment
-
thientran ơi mình chưa hiểu lắm, bạn có thể giải thích lại không, chính xác là nó cần bao nhiêu chân giao tiếp. Nếu được bạn gửi cho mình code VHDL nha, mình cũng đang học cái này. milano1660@yahoo.com. Thx nhìu
Comment
-
cái này tôi đã làm rồi đây là đề tài môn vi điều khiển của tôi
"giao tiếp bàn phím qua cổng PS/2 hiển thị ra LCD 2x16"
có thể nhận được phím shift-? nói chung là tất cả những gì có trên bàn phím tôi đều có thể nhận được.
nhưng hiện tại tôi ở quê ko có tài liệu nếu 10 ngày nữa mà bạn còn cần thì tôi sẽ gửi cho bạn
Comment
-
Nguyên văn bởi anh_tran Xem bài viếtcái này tôi đã làm rồi đây là đề tài môn vi điều khiển của tôi
"giao tiếp bàn phím qua cổng PS/2 hiển thị ra LCD 2x16"
có thể nhận được phím shift-? nói chung là tất cả những gì có trên bàn phím tôi đều có thể nhận được.
nhưng hiện tại tôi ở quê ko có tài liệu nếu 10 ngày nữa mà bạn còn cần thì tôi sẽ gửi cho bạnVà con tim đã vui trở lại ....
Comment
-
Bạn nào cần có thể vào đây để tham khảo :
http://www.8051projects.net/forum-t6557.html
Hoặc vào đây để kiểm chứng
http://www.keelog.com/diy.html
;---------------------------
; AT Keyboard Routines
;***************************
;----------------
; RAM Usage:
;----------------
; Keyboard vars
.equ KB_OK, 0x45
.equ KB_DATA, 0x46
.equ KB_STATS, 0x47
.equ KB_SCAN, 0x48
.equ KB_TEMP, 0x49 ; For the da*n pause key
;------------------
; Defines
;------------------
;XXXXXX KeyBoard XXXXXXXXXX
.flag KEYB_DATA, P1.5 ; AT Keyboard data (change this for your hardware)
.flag KEYB_CLOCK, P3.2 ; AT Keyboard Clock (change this for your hardware)
; This 2 pins should be connected to the keyboard crresponded pins with an 4K7 Pullup.
; The keyboard also needs GND and +5V.
.equ KB_LSHIFT, 0x12
.equ KB_RSHIFT, 0x59
.equ KB_CTRL, 0x14
.equ KB_ALT, 0x11
.equ KB_CAPS, 0x58
.equ KB_SCROLL, 0x7E
.equ KB_NUML, 0x77
.equ KB_TAB, 0x0D
.equ KB_REL, 0xF0
.equ KB_EXT, 0xE0
.equ KB_PAUSE, 0xE1
; For the stauts flags (KB_STATS)
.equ CAPS, 0x01
.equ NUML, 0x02
.equ SCROLL, 0x04
.equ SHIFT, 0x08
.equ ACK, 0x10
.equ CTRL, 0x20
.equ ALT, 0x40
.equ RELEASE, 0x80
; For the stauts flags 2 (KB_OK)
.equ PAUSED, 0x40
.equ EXTENDED, 0x80
;XXXXXXXXXXXXXXXXXXXXXXXXXXXX
;---------------------
; Keyboard Routines:
;---------------------
;*************************************
; WaitKB: Wait for keypress
;*************************************
WaitKB:
acall Check_Keyb
jnc WaitKB
ret
;*************************************
; InitKeyb: c=1 if ACK OK
;*************************************
CheckACK:
mov a, KB_STATS
mov c, acc.4
clr acc.4
mov KB_STATS, a
ret
;*************************************
; InitKeyb:
;*************************************
InitKeyb:
mov KB_TEMP, #0
mov KB_OK, #0
mov r1, #0xFF
acall Write_Keyb
acall Check_Keyb
acall CheckACK
jnc InitKeyb
mov r1, #0xF4 ; Enable
acall Write_Keyb
acall Check_Keyb
acall CheckACK
jnc KeybErr
mov r1, #0xF3 ; Set Typematic
acall Write_Keyb
acall Check_Keyb
acall CheckACK
jnc KeybErr
mov r1, #0x00 ; Typematic = 250 ms / 30 cps
acall Write_Keyb
acall Check_Keyb
acall CheckACK
jnc KeybErr
mov KB_OK, #1
mov KB_STATS, #2 ; Num Lock ON
;*************************************
; Keyb_Leds: Set KB_STATS as leds
;*************************************
Keyb_Leds:
mov r1, #0xED ; Set Leds
acall Write_Keyb
acall Check_Keyb
acall CheckACK
jnc KeybErr
mov r1, KB_STATS
acall Write_Keyb
acall Check_Keyb
acall CheckACK
KeybErr:
ret
;*************************************
; Zero2One: Wait for 0 to 1 on kb
; clock line, read the kb data line
; and shift right the bit to acc.7
;*************************************
Zero2One:
jnb KEYB_CLOCK, *
jb KEYB_CLOCK, *
mov c, KEYB_DATA
rrc a
ret
;*************************************
; Check_Keyb: Check to see if any key
; are pressed or release, returns
; ASCII codes on KB_DATA, or 1 for
; special keys, 2 for same special
; with shift. Return also the scan
; code on KB_SCAN.
; Special Keys are basicaly all non
; printable keys. See the table below
; all 1 and 2 returned are special keys
;*************************************
Check_Keyb:
setb KEYB_DATA
setb KEYB_CLOCK ; CLOCK & DATA high = Idle Pos
mov r0, #50
CheckAgain:
jnb KEYB_CLOCK, KeyHit
djnz r0, CheckAgain ; check r0 times
sjmp KeyEnd
KeyHit:
jnb KEYB_DATA, KeyHit2 ; Start bit must be 0
KeyEnd:
clr KEYB_CLOCK ; disable keyb
clr c ; c=0 = no keypress
ret
KeyHit2:
mov r0, #8 ; 8 bits
clr a
KeyHit3:
acall Zero2One
djnz r0, KeyHit3
mov r1, a
clr a
acall Zero2One ; Parity bit
acall Zero2One ; Stop bit
; acc.7 = stop, acc.6 = parity
clr KEYB_CLOCK
mov a, KB_TEMP
jz NoIgnore
dec KB_TEMP ; Igonre pause scans
sjmp ChkKbEndNC
NoIgnore:
mov KB_SCAN, r1
cjne r1, #0xFA, NoKbACK
orl KB_STATS, #ACK
sjmp ChkKbEndNC
NoKbACK:
cjne r1, #KB_PAUSE, NoKbPause
mov KB_TEMP, #7 ; Ignore next 7 scans
mov a, KB_OK
cpl acc.6
mov KB_OK, a
sjmp ChkKbEndNC
NoKbPause:
cjne r1, #KB_EXT, NoKbExt
orl KB_OK, #EXTENDED
sjmp ChkKbEndNC
NoKbExt:
cjne r1, #KB_REL, NoRelease
orl KB_STATS, #RELEASE
sjmp ChkKbEndNC
NoRelease:
; Test Num lock, if pressed toggle led
cjne r1, #KB_NUML, NoNumLock
mov a, KB_STATS
jnb acc.7, ChkKbEndNC
cpl acc.1
clr acc.7
mov KB_STATS, a
acall Keyb_Leds
sjmp ChkKbEndNC
NoNumLock:
; Test Caps lock, if pressed toggle led
cjne r1, #KB_CAPS, NoCapsLock
mov a, KB_STATS
jnb acc.7, ChkKbEndNC
cpl acc.2
clr acc.7
mov KB_STATS, a
acall Keyb_Leds
sjmp ChkKbEndNC
NoCapsLock:
; Test Scroll lock, if pressed toggle led
cjne r1, #KB_SCROLL, NoScrollLock
mov a, KB_STATS
jnb acc.7, ChkKbEndNC
cpl acc.0
clr acc.7
mov KB_STATS, a
acall Keyb_Leds
ChkKbEndNC:
clr c
ret
NoScrollLock:
; Test L & R shifts, set bit if pressed, clear on release
cjne r1, #KB_LSHIFT, NoShift1
ShiftOK:
mov a, KB_STATS
jbc acc.7, ShiftRel
setb acc.3 ; not releasing, so Set SHIFT bit
sjmp ShiftEnd
ShiftRel:
clr acc.3 ; releasing, so Clear SHIFT bit
ShiftEnd:
mov KB_STATS, a
sjmp ChkKbEndNC
NoShift1:
cjne r1, #KB_RSHIFT, NoShift
sjmp ShiftOK
NoShift:
cjne r1, #KB_CTRL, NoCtrl
mov a, KB_STATS
jbc acc.7, CtrlRel
setb acc.5 ; not releasing, so Set CTRL bit
sjmp CtrlEnd
CtrlRel:
clr acc.5 ; releasing, so Clear SHIFT bit
CtrlEnd:
mov KB_STATS, a
sjmp ChkKbEndNC
NoCtrl:
cjne r1, #KB_ALT, NoAlt
mov a, KB_STATS
jbc acc.7, AltRel
setb acc.6 ; not releasing, so Set ALT bit
sjmp AltEnd
AltRel:
clr acc.6 ; releasing, so Clear ALT bit
AltEnd:
mov KB_STATS, a
sjmp ChkKbEndNC
NoAlt:
mov a, KB_STATS ; Releasing key test
jnb acc.7, NoRel2
clr acc.7 ; if releasing > clear
mov KB_STATS, a ; rel bit on KB_STATS
clr c ; and do nothing
ret
NoRel2:
mov a, KB_OK ; Extended key test
jnb acc.7, KbChars
clr acc.7 ; if Extended > clear
mov KB_OK, a ; EXT bit on KB_OK
clr c ; and do nothing
ret
KbChars:
mov dptr, #KbScanCodes
mov a, KB_STATS
jnb acc.2, TestShift
jb acc.3, KbChkOK
mov a, r1
movc a, @a+dptr
mov r0, a
subb a, #97
jc KbChkOK
mov a, r0
subb a, #123
jnc KbChkOK
mov dptr, #KbScanCodes2 ; if (a to z) & Caps > table 2
sjmp KbChkOK
TestShift:
jnb acc.3, KbChkOK
mov dptr, #KbScanCodes2 ; with shift table 2
KbChkOK:
mov a, r1
movc a, @a+dptr
mov KB_DATA, a
setb c
ret
;*************************************
; Zero2One2: Wait for high to low in
; kb clock line
;*************************************
Zero2One2:
jnb KEYB_CLOCK, *
jb KEYB_CLOCK, *
ret
;*************************************
; Write_Keyb: Send r1 to the kb
;*************************************
Write_Keyb:
mov r0, #8 ; 8 bits to receive
clr KEYB_CLOCK ; break the Keyboard
mov r7, #0x00 ; some delay (safety reasons)
_WKwait:djnz r7, _WKwait
clr KEYB_DATA ; request to send
setb KEYB_CLOCK ; enable the Keyboard
acall Zero2One2 ; Start Bit
mov a, r1 ; Data Bits
TxData:
rrc a
mov KEYB_DATA, c
acall Zero2One2
djnz r0, TxData
mov a, r1 ; calculate parity bit
mov c, psw.0 ; this is Even parity
cpl c ; and Keyboard needs Odd parity
mov KEYB_DATA, c ; send parity bit
acall Zero2One2
setb KEYB_DATA ; send stop bit
acall Zero2One2
acall Zero2One2
mov c, KEYB_DATA ; get ACK bit
clr KEYB_CLOCK ; stop the keyboard
ret
;*****************************
; Main Routine: Example of kb usage
;*****************************
Start:
acall InitKeyb
mov a, KB_OK
jz KBNotOK
Loop:
acall Check_Keyb
jnc Loop
mov a, KB_SCAN
cjne a, #0x71, NoCtrlAltDel ; Check for extended Del
mov a, KB_STATS
jnb acc.5, NoCtrlAltDel ; Check for Ctrl
jnb acc.6, NoCtrlAltDel ; Check for Alt
ljmp Start ; If Ctrl+Alt+Del Reset
NoCtrlAltDel:
mov a, KB_DATA
cjne a, #1, ChkEsp2
; Here handle Especial Keys
mov a, KB_SCAN
cjne a, #5, NoF1Key
; Do something here for F1
NoF1Key:
cjne a, #6, NoF2Key
; Do something here for F2
NoF2Key:
cjne a, #4, NoF3Key
; Do something here for F1
NoF3Key:
sjmp Loop
ChkEsp2:
cjne a, #2, NoEsp
; Here handle Shift + Especial Keys
mov a, KB_SCAN
cjne a, #5, NoShfF1Key
; Do something here for Shift + F1
NoShfF1Key:
sjmp Loop
NoEsp:
; Rest of prgram
sjmp Loop
; last 262 addr of code mem with scan codes tables
.org 0x1EF8
KbScanCodes:
; Keyboard Scancodes
; ?, F9, ?, F5, F4, F1, F2, F12, ?, F10, F8, F6, F4, TAB, ~
.db 0, 1 , 0, 1 , 1 , 1 , 1 , 1 , 0, 1 , 1 , 1 , 1 , 1 , '~'
; ?, ?,Lalt,Lshf, ?,Lctr, Q , ! , ?, ?, ?, Z , S , A , W , @
.db 0, 0, 0 , 0 , 0, 0 , 'q', '1', 0, 0, 0, 'z', 's', 'a', 'w', '2'
; ?, ?, C , X , D , E , $ , # , ?, ?, " ", V , F , T , R
.db 0, 0, 'c', 'x', 'd', 'e', '4', '3', 0, 0, ' ', 'v', 'f', 't', 'r'
; % , ?, ?, N , B , H , G , Y , ^ , ?, ?, ?, M , J , U , &
.db '5', 0, 0, 'n', 'b', 'h', 'g', 'y', '6', 0, 0, 0, 'm', 'j', 'u', '7'
; * , ?, ?, < , K , I , O , ) , ( , ?, ?, > , ? , L , : , P
.db '8', 0, 0, ',', 'k', 'i', 'o', '0', '9', 0, 0, '.', '/', 'l', ';', 'p'
; _ , ?, ?, ?, " , ?, { , + , ?, ?,Caps,Rshf,Entr, } , ?, |
.db '-', 0, 0, 0, ''', 0, '[', '=', 0, 0, 0 , 0 , 1 , ']', 0, 92
; ?, ?, ?, ?, ?, ?, ?, ?,BkSp, ?, ?, 1 , ?, 4 , 7 , ?, ?, ?, 0
.db 0, 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, '1', 0, '4', '7', 0, 0, 0, '0'
; . , 2 , 5 , 6 , 8 , ESC,Numl, F11, + , 3 , - , * , 9 ,Scrl
.db '.', '2', '5', '6', '8', 1 , 0 , 1 , '+', '3', '-', '*', '9', 0
; ?, ?, ?, ?, F7
.db 0, 0, 0, 0, 1
KbScanCodes2:
; Keyboard Scancodes with shift
; ?, F9, ?, F5, F4, F1, F2, F12, ?, F10, F8, F6, F4, TAB, ~
.db 0, 2 , 0, 2 , 2 , 2 , 2 , 2 , 0, 2 , 2 , 2 , 2 , 2 , '`'
; ?, ?,Lalt,Lshf, ?,Lctr, Q , ! , ?, ?, ?, Z , S , A , W , @
.db 0, 0, 0 , 0 , 0, 0 , 'Q', '!', 0, 0, 0, 'Z', 'S', 'A', 'W', '@'
; ?, ?, C , X , D , E , $ , # , ?, ?, " ", V , F , T , R
.db 0, 0, 'C', 'X', 'D', 'E', '$', '#', 0, 0, ' ', 'V', 'F', 'T', 'R'
; % , ?, ?, N , B , H , G , Y , ^ , ?, ?, ?, M , J , U , &
.db '%', 0, 0, 'N', 'B', 'H', 'G', 'Y', '^', 0, 0, 0, 'M', 'J', 'U', '&'
; * , ?, ?, < , K , I , O , ) , ( , ?, ?, > , ? , L , : , P
.db '*', 0, 0, '<', 'K', 'I', 'O', ')', '(', 0, 0, '>', '?', 'L', ':', 'P'
; _ , ?, ?, ?, " , ?, { , + , ?, ?,Caps,Rshf,Entr, } , ?, |
.db '_', 0, 0, 0, '"', 0, '{', '+', 0, 0, 0 , 0 , 2 , '}', 0, '|'
; ?, ?, ?, ?, ?, ?, ?, ?,BkSp, ?, ?, 1 , ?, 4 , 7 , ?, ?, ?, 0
.db 0, 0, 0, 0, 0, 0, 0, 0, 2 , 0, 0, '1', 0, '4', '7', 0, 0, 0, '0'
; . , 2 , 5 , 6 , 8 , ESC,Numl, F11, + , 3 , - , * , 9 ,Scrl
.db '.', '2', '5', '6', '8', 2 , 0 , 2 , '+', '3', '-', '*', '9', 0
; ?, ?, ?, ?, F7
.db 0, 0, 0, 0, 2
Comment
-
Hoa mắt luôn. Nói chung là em không hình dung được giao tiếp là sao thôi (mới tiếp xúc lần đầu >_< ). Em có đọc phần lý thuyết về giao tiếp PS2, nhưng chủ yếu chỉ nói sơ về truyền 11 bits, scan code, break code thoy. Đọc cái lý thuyết thì chẳng có gì khó hiểu lắm, nhưng cái code VHDL mà em có trong tay thì khác 1 trời 1 vực . Có lẽ do lý thuyết chỉ nói sơ nên em không hiểu. Ai có thể giải thích chi tiết, hoặc có giải thuật thì send dùm em, cụ thể trong khối giao tiếp cần làm những gì nha. Thx pà kon
Comment
-
;*******************************************
;* Chương trình nhập dữ liệu bằng keyboard PS2 *
;* và hiển thị bằng LED 7 đoạn (mã thập phân) ;*
;*******************************************
;_______________________________________
; Khai báo biến
KB_CLK BIT P3.2
KB_DATA BIT P3.0
;_______________________________________
ORG 0000H
SJMP MAIN
ORG 0003H
SJMP READ_KEY
;_______________________________________
; Chương trình con Xóa Ram nội
MAIN: MOV R0,#10H
CLEAR: MOV A,#0
MOV @R0,A
INC R0
CJNE R0,#80H,CLEAR ; Clear internal RAM
MOV IE,#81H
MOV SP,#4Fh
RE:
LCALL OUTLED
SJMP RE
;_______________________________________
;Chương trình con ngắt ngoài 0
READ_KEY:
PUSH ACC
CLR EA ; Cấm ngắt ngoài 0
; CLR C ; Xóa cờ C
;_______________________________________
;Chương trình con nhận đủ 8 bit data
;Và loại bỏ bit Parity, bit Stop
RECEIVER_8BIT:
MOV R3,#8 ; 8 Bits Data
RE_READ:
JNB KB_CLK,$ ; Chờ cạnh lên
JB KB_CLK,$ ; Chờ cạnh xuống --> Bỏ qua bit Start
MOV C,KB_DATA ; Nhận data
RRC A ; Xếp vào A
DJNZ R3,RE_READ ; Chờ lấy đủ 8 bit Data
CJNE A,#240,ACEPT_CODE
JNB KB_CLK,$ ; Chờ cạnh lên
JB KB_CLK,$ ; Chờ cạnh xuống --> Bỏ qua bit Parity
JNB KB_CLK,$ ; Chờ cạnh lên
JB KB_CLK,$ ; Chờ cạnh xuống --> Bỏ qua bit Stop
JNB KB_CLK,$ ; Chờ cạnh lên
JB KB_CLK,$ ; Chờ cạnh xuống --> Bỏ qua 1 xung
SJMP EXIT
;_______________________________________
; Chương trình con chuyển đổi mã nhị phân sang thập phân
ACEPT_CODE:
MOV B,#10
DIV AB
MOV 10H,B ; 10H chứa hàng đơn vị
MOV B,#10
DIV AB
MOV 11H,B ; 11H chứa hàng chục
MOV 12H,A ; 11H chứa hàng trăm
ACALL OUTLED
;_______________________________________
EXIT:
POP ACC
SETB EA ; Cho phép ngắt trở lại
RETI
;_______________________________________
; Chương trình con xuất ra Led
OUTLED:
MOV DPTR,#MALED
MOV A,12H
CJNE A,#0,L2
MOV A,11H
CJNE A,#0,L1
MOV A,10H
CJNE A,#0,L0
L2: MOV A,12H
MOVC A,@A+DPTR
MOV P2,A
CLR P0.2
LCALL DELAY250uS
SETB P0.2
L1: MOV A,11H
MOVC A,@A+DPTR
MOV P2,A
CLR P0.1
LCALL DELAY250uS
SETB P0.1
L0: MOV A,10H
MOVC A,@A+DPTR
MOV P2,A
CLR P0.0
LCALL DELAY250uS
SETB P0.0
RET
;_______________________________________
DELAY250uS:
MOV R7,#125
DJNZ R7,$
RET
;_______________________________________
MALED: DB 03h
DB 9Fh
DB 25h
DB 0Dh
DB 99h
DB 49h
DB 41h
DB 1Bh
DB 01h
DB 09h
END
VẠN SỰ KHỞI ĐẦU NAN
GIAN NAN BẮT ĐẦU NÃN
CÒN YOU NGHĨ SAO ???Last edited by ngoctri73; 04-07-2008, 00:41.
Comment
-
như đã hứa
đề tài mình chưa hoàn chỉnh lắm do thời gian làm đề tài quá gấp bạn hoàn chỉnh lại rồi có gì share lại cho mình nha.
có gì thắc mắc thì cứ hỏiAttached Files
Comment
Bài viết mới nhất
Collapse
-
bởi TherulCảm ơn bạn đã chia sẻ câu chuyện và quá trình phát triển sản phẩm của mình. Trước tiên, thật may mắn khi bạn vượt qua tai nạn và vẫn giữ được niềm đam mê cũng như khả năng sáng tạo trong lĩnh vực kỹ thuật. Việc bạn tiếp tục...
-
Channel: từ PIC tới dsPIC
hôm nay, 07:20 -
-
Trả lời cho Em muốn hỏi mọi người về nguyên lý hoạt động, tần số của mạch công suất trong máy rửa siêu âm ạ.bởi nguyendinhvanBạn nên nghiên cứu cái chấn lưu đèn ống Compact fluorescent lamp hay đèn compact trước đã. Nó rẻ đỡ tốn kém.
Sau khi hiểu rõ rồi thì chuyển sang cái mạch này.
Ở cái chấn lưu, tần số của nó linh tinh lắm, tùy điện áp nguồn, tùy...-
Channel: Hỗ trợ học tập
Hôm qua, 22:44 -
-
bởi yname11 E có 1 laptop bị hỏng màn hình, e tháo ra thì thấy nó có 4 lớp , lớp ngoài cùng là 1 lớp nhựa rất mỏng màu hơi đen ( chắc là 1 loại film dán), tiếp theo là 1 lớp thủy tinh bị vỡ (màu đen) , đến 1 lớp thủy tinh trắng ( lớp này có...
-
Channel: Thiết bị điện tử cá nhân
18-11-2024, 19:12 -
-
Trả lời cho Mua anten ở đâu?bởi tmcodonAnten bạn thu nguồn sóng nào vậy? Nếu xem truyền hình thì giờ k làm đc anten nữa rồi
-
Channel: Ăng ten và truyền sóng
16-11-2024, 15:34 -
-
Trả lời cho Mạch nguồn đôi dùng 7812 và 7912bởi tmcodonThank bác nhá. Tìm mãi mới thấy. Giờ vọc đã xem sao...
-
Channel: Hỗ trợ học tập
16-11-2024, 10:39 -
-
bởi tungdqEm cần tìm sơ đồ mạch một số Main máy tính đời cao như Asrock B560M-HDV, các cao nhân chỉ giúp với. Thank!
-
Channel: Các mạch điện ứng dụng
15-11-2024, 08:27 -
Comment