Đồ án môn học 2 Tìm hiểu về DE 2 – Lập trình giao tiếp bàn phím hiển thị lên màn hình LCD được thuyết minh với các nội dung: Giới thiệu về Altera DE 2 Board, tìm hiểu module LCD, PS2 – KEYBOARD, thiết kế giao tiếp LCD và bàn phím. Mời các bạn tham khảo tài liệu.
Trang 2Ph n 1 ầ : Gi i thi u v Altera DE 2 Board ớ ệ ề
Trang 3 24bit CDquality audio CODEC with linein, lineout, and microphonein jacks.
2.1. Gi i thi u s lớ ệ ơ ược v LCDề
Module LCD c a DE 2 là m t màn hình LCD hai hàng, m i hàng 16 kí t ủ ộ ỗ ự
S đ k t n i ph n c ng LCDơ ồ ế ố ầ ứ
Trang 5LCD core kh i t o LCD controller khi thi t l p và giao ti p v i nó. LCDở ạ ế ậ ế ớ core s cung c p giao di n s đ b nh cho ngẽ ấ ệ ơ ồ ộ ớ ườ ử ụi s d ng đi u khi n và vi tề ể ế lên màn hình LCD b ng các vi t lên đ a ch b nh đã bi t.ằ ế ị ỉ ộ ớ ế
LCD core cung c p xung block t n s 50 MHz trên Board DE 1 và DE 2.ấ ầ ố
Trang 6 Chân ch n thanh ghi RS (Register Select)ọ : chân RS được dùng đ ch nể ọ thanh ghi này nh sau: ư
N u RS = 0 thì thanh ghi mà l nh đế ệ ược 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.ử ộ ệ ẳ ạ ư ư ỏ ề ầ
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/ghi (R/W):ọ cho phép người dùng ghi thông tin lên LCD khi R/W=0 ho c đ c thông tin t nó khi R/W=1ặ ọ ừ
Chân cho phép E (Enable): được s d ng b i LCD đ ch t thông tinử ụ ở ể ố
hi n h u trên chân d li u c a nó. Khi d li u đệ ữ ữ ệ ủ ữ ệ ược cung 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 đ LCD ch t dế ể ố ữ
li u trên các chân d li u. ệ ữ ệ
Trang 7Các câu l nh c b n đi u khi n LCD:ệ ơ ả ề ể
Các câu l nh c b n c a LCD là kh i t o màn hình, xóa màn hình, đ t conệ ơ ả ủ ở ạ ặ
tr , d ch con tr , d ch màn hình, v.v… Các l nh này l u trong m t th vi n:ỏ ị ỏ ị ệ ư ộ ư ệ
Vi t các ký t trong b đ m đế ự ộ ệ ược tr đ n b i ptr cho LCD,b t đ u tỏ ế ở ắ ầ ừ
ch con tr th i đi m hi n t i:ỗ ỏ ở ờ ể ệ ạ
int alt_up_character_lcd_write(alt_up_character_lcd_dev
*lcd, const char *ptr, unsigned int len)
Đ t v trí con tr :ặ ị ỏ
Trang 9D li u đữ ệ ược truy n n i ti p t ng bit theo khung truy n 11 bit g m:ề ố ế ừ ề ồ
Trang 10B đi u khi n bàn phím thộ ề ể ường là chip 8042, 8048, 8049, 8741, 8742,
6868, 6805
Khi chip đi u khi n nh n đề ể ậ ược yêu c u t bàn phím, chip này g i tín hi uầ ừ ử ệ
ng t IRQ1 và truy n d li u vào CPU.ắ ề ữ ệ
3.2. Mã quét bàn phím (Scan code)
Khi nh n hay nh 1 phím, b x lý bàn phím g i đ n PC mã quét (scanấ ả ộ ử ử ếcode) c a phím đủ ược nh n.ấ
Khi phím được nh n, mã này g i là ấ ọ makecode
Khi phím được nh , mã này g i là ả ọ breakcode
Breakcode g m 2 byte: byte đ u là F0, byte k là mã ồ ầ ế makecode
Ví d : ụ
nh n SHIFT: makecode = 12 ấ
Nh n A:ấ makecode = 1C
Trang 11 Bàn phím PS2 giao ti p b ng giao th c n i ti p b t đ ng b 2 chi uế ằ ứ ố ế ấ ồ ộ ề
Xung clock được phát b i bàn phím, t n s kho ng 1016.7kHzở ầ ố ả
Các tr ng thái ho t đ ng:ạ ạ ộ
Data=high, clock=high: tr ng thái r nh.ạ ả
Data=high, clock=low: tr ng thái c m giao ti p.ạ ấ ế
Data=low, clock=high: tr ng thái máy ch đạ ủ ược yêu c u truy n d li u.ầ ề ữ ệ
N u máy ch mu n truy n d li u, nó ph i c m giao ti p t bàn phímế ủ ố ề ữ ệ ả ấ ế ừ
b ng cách kéo clock xu ng th p, sau đó kéo Data xu ng m c th p và gi i phóngằ ố ấ ố ứ ấ ả cho clock
Data được truy n theo khung d li u g m 1112bit nh sau:ề ữ ệ ồ ư
Trang 12 Ki m tra bus đang tr ng thái r nh.ể ở ạ ả
Clock m c cao ít nh t 50us trở ứ ấ ước khi bàn phím g i data.ử
Bàn phím g i data t ng khung d li u 11bit.ử ừ ữ ệ
D li u đữ ệ ược đ c t i c nh xu ng c a clock.ọ ạ ạ ố ủ
Máy ch có th c m giao ti p b ng cách kéo clock xu ng th p.ủ ể ấ ế ằ ố ấ
Khi clock được gi i phóng, bàn phím l i truy n ti p d li u ch a hoànả ạ ề ế ữ ệ ư
ch nh.ỉ
3.2.2. Truy n d li u t máy ch đ n bàn phím ề ữ ệ ừ ủ ế
Các bước th c hi n:ự ệ
Máy ch c m truy n t bàn phím đ n b ng cách kéo clock xu ng th p.ủ ấ ề ừ ế ằ ố ấ
Máy ch kéo data xu ng th p và gi i phóng clock báo hi u bàn phím phátủ ố ấ ả ệ xung clock b t đ u truy n d li u.ắ ầ ề ữ ệ
D li u đữ ệ ược đ c t i c nh lên c a clock.ọ ạ ạ ủ
Trang 13 Sau khi bàn phím nh n stop bit nó s truy n tín hi u ACK đ n máy chậ ẽ ề ệ ế ủ
S d ng gi i thu t phát hi n c nh xu ng c a xung clock keyboard.ử ụ ả ậ ệ ạ ố ủ
C nh xu ng c a ps2c cho bi t bit ps2d là h p l và có th đạ ố ủ ế ở ợ ệ ể ượ c
nh n. ậ
Trang 14L u đ quá trình nh n d li u t bàn phímư ồ ậ ữ ệ ừ
Trang 15 Dùng đ chuy n d li u t bàn phím ra thành ể ể ữ ệ ừ make code và break code
Cho ta bi t phím đang đế ược nh n hay nh ấ ả
S d ng gi i thu t l y 3 byte sau cùng khi nh phím thông qua bi nử ụ ả ậ ấ ả ế got_code_tick báo đã nh phím.ả
Code:
ps2_rx receiver
(.clock(clock),.reset(reset),.ps2d(ps2d),.ps2c(ps2c),.rx_en(1'b1), .rx_done_tick(scan_done_tick), .dout(dout));
Trang 184.1. Các bước th c hi n trong Quartusự ệ
T o project doan.vhdl trong quartus.ạ
Trong SOPC gán các đ a ch t đ ng cho các IP:ị ỉ ự ộ
Cpu_0 (Ch n Nios II/e,memory ọ :sdram_0)
Trang 19Add các file v a t o ra t SOPC vào module giaotiep.vhdl r i biên d chừ ạ ừ ồ ị
Trang 21 the_sdram_0
zs_addr_from_the_sdram_0 : OUT STD_LOGIC_VECTOR (11 DOWNTO 0);
zs_ba_from_the_sdram_0 : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
zs_cas_n_from_the_sdram_0 : OUT STD_LOGIC;
zs_cke_from_the_sdram_0 : OUT STD_LOGIC;
zs_cs_n_from_the_sdram_0 : OUT STD_LOGIC;
zs_dq_to_and_from_the_sdram_0 : INOUT STD_LOGIC_VECTOR (15 DOWNTO 0);
zs_dqm_from_the_sdram_0 : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
zs_ras_n_from_the_sdram_0 : OUT STD_LOGIC;
zs_we_n_from_the_sdram_0 : OUT STD_LOGIC;
the_up_avalon_character_lcd_0
LCD_BLON_from_the_up_avalon_character_lcd_0 : OUT STD_LOGIC;
LCD_DATA_to_and_from_the_up_avalon_character_lcd_0 : INOUT STD_LOGIC_VECTOR (7 DOWNTO 0);
LCD_EN_from_the_up_avalon_character_lcd_0 : OUT STD_LOGIC; LCD_ON_from_the_up_avalon_character_lcd_0 : OUT STD_LOGIC; LCD_RS_from_the_up_avalon_character_lcd_0 : OUT STD_LOGIC; LCD_RW_from_the_up_avalon_character_lcd_0 : OUT STD_LOGIC; the_up_avalon_ps2_0
Trang 22PS2_CLK_to_and_from_the_up_avalon_ps2_0 : INOUT STD_LOGIC; PS2_DAT_to_and_from_the_up_avalon_ps2_0 : INOUT STD_LOGIC );
Trang 244.2. Các bước th c hi n trong Nios IIự ệ
T o project <ten>.c và import các file h tr vào:ạ ỗ ợaltera_up_avalon_character_lcd.c
Trang 25char_lcd_dev = alt_up_character_lcd_open_dev ("/dev/LCD_0"); alt_up_character_lcd_init (char_lcd_dev);
Trang 28
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row2); break;
case 0x23:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row3); break;
case 0x24:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row4); break;
case 0x2B:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row5); break;
case 0x34:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1);
Trang 29case 0x33:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row7); break;
case 0x43:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row8); break;
case 0x3b:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row9); break;
case 0x42:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row10); break;
Trang 30
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row11); break;
case 0x3a:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row12); break;
case 0x31:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row13); break;
case 0x44:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row14); break;
case 0x4d:
Trang 31alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row15); break;
case 0x15:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row16); break;
case 0x2d:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row17); break;
case 0x1b:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row18); break;
case 0x2c:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1);
Trang 32alt_up_character_lcd_string(char_lcd_dev, second_row19); break;
case 0x3c:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row20); break;
case 0x2a:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row21); break;
case 0x1d:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row22); break;
case 0x22:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row23); break;
Trang 33
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row24); break;
case 0x1a:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row25); break;
case 0x45:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row26); break;
case 0x16:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row27); break;
case 0x1e:
Trang 34alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row28); break;
case 0x26:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row29); break;
case 0x25:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row30); break;
case 0x2e:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row31); break;
case 0x36:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1);
Trang 35case 0x3d:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row33); break;
case 0x3e:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row34); break;
case 0x46:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row35); break;
case 0x0e:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row36); break;
Trang 36
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row37); break;
case 0x55:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row38); break;
case 0x54:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row39); break;
case 0x5b:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row40); break;
case 0x5d:
Trang 37alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row41); break;
case 0x4c:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row42); break;
case 0x52:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row43); break;
case 0x41:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row44); break;
case 0x49:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1);
Trang 38alt_up_character_lcd_string(char_lcd_dev, second_row45); break;
case 0x4a:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1); alt_up_character_lcd_string(char_lcd_dev, second_row46); break;
Trang 39Tài li u tham kh o ệ ả
1) FPGA prototyping by Verilog examplesPong P. Chu
Cleveland State University
Trang 403) PS 2 Core for Altera DE 2 board
4) Character LCD Core for Altera DE 2/DE 1 Board