ƯỜ
TR
ệ ử ệ NG ĐH BÁCH KHOA TP HCM Khoa Đi n Đi n t
ọ
ồ
Đ án môn h c 2
ể
ề
ậ
Đ tàiề
ể
ế : 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
ướ
ị
Giáo viên h
ẫ ng d n: Võ Th Thu H ng ự ậ
ư
ồ Sinh viên th c t p: L Sanh Nhân
1
ớ
ệ ề
Ph n 1ầ : Gi
i thi u v Altera DE 2 Board
Altera Cylone II 2C35 FPGA device.
Altera Serial Configuration device – EPCS 16.
ệ ậ ể USB Blaster (on board) cho vi c l p trình và ki m soát API; h tr c ổ ợ ả
ế ộ ậ JTAG và các ch đ l p trình AS.
512 – Kbyte SRAM.
8 – Mbyte SDRAM.
4 – Mbyte Flash memory.
Khung c m SD card. ắ
4 pushbutton switches.
18 toggle switches.
18 red user LEDs.
2
9 green user LEDs.
50MHz oscillator and 27MHz oscillator for clock sources.
24bit CDquality audio CODEC with linein, lineout, and microphonein
jacks.
VGA DAC (10bit highspeed triple DACs) with VGAout connector.
TV Decoder (NTSC/PAL) and TVin connector.
10/100 Ethernet Controller with a connector.
USB Host/Slave Controller with USB type A and type B connectors.
RS232 transceiver and 9pin connector.
PS/2 mouse/keyboard connector.
IrDA transceiver.
Two 40pin Expansion Headers with diode protection.
============================================
ể Ph n 2ầ : Tìm hi u module LCD
ớ ệ ơ ượ ề 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 ự .
3
ơ ồ ế ố ầ ứ S đ k t n i ph n c ng LCD
ơ ồ ủ S đ chân c a module LCD
ộ ộ ậ ọ ẽ ề Trong module LCD có m t b ph n g i là LCD Core, mà cái này s đi u
ệ ể ể ị ự khi n vi c hi n th kí t lên màn hình LCD.
ử ự LCD core g i các kí t ủ thông qua Character generator ROM pattern c a
4
LCD.
ở ạ ế ậ ớ LCD 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.
ơ ồ ủ S đ xung block c a LCD core
ạ ộ ậ 2.2. L p trình ho t đ ng cho LCD
ứ ả ấ B ng ch c năng hai thanh ghi quan trong nh t trong LCD:
5
ủ ộ ề ứ ể ấ C u trúc và ch c năng c a b đi u khi n LCD:
ọ ượ ể 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.
Chân DB0~DB7:
ữ ệ ượ ể ử Đây là 8 chân d li u 8 bit, đ ặ c dùng đ g i thông tin trê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 đ n các chân này khi b t RS
6
= 1.
ơ ả ề ể ệ Cá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:
#include "altera_up_avalon_character_lcd.h"
Trong đó:
Kh i t o màn hình LCD b ng cách xóa màn hình hi n th c a nó:
ở ạ ị ủ ể ằ
Void alt_up_character_lcd_init(alt_up_character_lcd_dev*lcd)
ở ộ ị ằ M màn hình LCD b ng m t câu xác đ nh:
alt_up_character_lcd_dev*alt_up_character_lcd_open_dev(const char *name)
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)
7
ặ ị ỏ Đ t v trí con tr :
intalt_up_character_lcd_set_cursor_pos(alt_up_character_lcd_dev*lcd, unsigned
x_pos, unsigned y_pos)
D ch con tr sang trái ho c ph i:
ặ ả ỏ ị
intalt_up_character_lcd_shift_cursor(alt_up_character_lcd_dev
*lcd, int x_right_shift_offset)
ả ặ ộ ị ị ể D ch toàn b màn hình hi n th sang trái ho c ph i:
int alt_up_character_lcd_shift_display(alt_up_character_lcd_dev
*lcd, int x_right_shift_offset)
============================================
Ph n 3ầ : PS2 – KEYBOARD
ớ ệ ề 3.1. Gi i thi u v PS2 KEYBOARD
ẩ 3.1.1. Chu n PS/2
ẩ ượ ớ ữ ệ ữ ế ề ệ ể Chu n PS/2 đ c IBM gi i thi u đ giao ti p, truy n d li u gi a bàn
ủ ộ ớ phím, chu t v i máy ch .
ơ ồ ổ S đ chân c ng PS/2
1. Clock
2. GND
3. Data
4. N/C
5. +5V (VCC)
8
6. N/C
ữ ệ ượ ố ế ừ ề ề ồ D li u đ c truy n n i ti p t ng bit theo khung truy n 11 bit g m:
ứ ấ 1start bit m c th p.
ữ ệ 8 bit d li u.
ứ 1 stop bit m c cao.
ể 1 parity bit ki m tra l ẻ .
ể 3.1.2. Các ki u bàn phím
ươ ử ụ ể Các máy tính IBM và t ng thích s d ng các ki u bàn phím sau:
ẩ Bàn phím XT chu n 83 phím:
ầ ố 5 đ u n i DIN
ề ề ố ế truy n n i ti p 1 chi u
không h tr t
ỗ ợ ừ ế host đ n bàn phím
s d ng scan code set 1
ử ụ
ẩ Bàn phím AT chu n 84101 phím:
6 đ u n i DIN
ầ ố
ề ề ố ế truy n n i ti p 2 chi u
s d ng scan code set 2
ử ụ
84102 phím
9
Bàn phím PS/2:
ầ ố 6 đ u n i mini DIN
ề ề ố ế truy n n i ti p 2 chi u
h tr s d ng scan code set 3
ỗ ợ ử ụ
có 17 l nh host to keyboard
ệ
ế ấ 3.1.3. C u trúc và giao ti p bàn phím
ộ ế ệ ể ấ ạ ỗ ạ M i phím là 1 chuy n m ch switch, t o ra m t ti p xúc đi n khi n phím.
ổ ế ạ Các lo i nút ph bi n:
(cid:0) Pure mechanical
(cid:0) Foam element
(cid:0) Rubber dome
(cid:0) Membrane
ượ ố ế ạ Cáp bàn phím đ c n i đ n chip ngo i vi 8255A.
ộ ề ườ ể B đ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 : ụ
(cid:0) ấ nh n SHIFT: makecode = 12
10
(cid:0) Nh n A: ấ makecode = 1C
(cid:0) Nh A: ả breakcode = F0, 1C
ả Nh SHIFT: breakcode = F0, 12
ượ ấ ữ ượ ề ề (cid:0) Khi m t phím đ ộ c nh n và gi , makecode đ ặ c truy n đ u đ n
ở ộ ầ ố ị m t t n s xác đ nh.
ả B ng scancode
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: 11
1 start bit = 0
8 data bit (LSB truy n tr
1 parity bit
1 stop bit = 1
1 acknowledge bit (host only)
ề ướ c)
ề ữ ệ ừ ề ủ 3.2.1. Truy n d li u t bàn phím v máy ch
ướ ự ệ Các b c th c hi n:
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.
12
ữ ệ ượ ọ ạ ạ ủ D li u đ c đ c t i c nh lên c a clock.
ế ẽ ề ệ ậ Sau khi bàn phím nh n stop bit nó s truy n tín hi u ACK đ n máy ch ủ
ề ữ ệ ế k t thúc quá trình truy n d li u
ả ơ ồ ố 3.3. S đ kh i, gi ậ i thu t
ơ ồ ố ộ S đ kh i toàn b
3.3.1. Module ps2_rx
ể ừ Dùng đ nh n 8 bit data t ậ bàn phím.
ả ệ ạ ủ ậ ố 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
13
nh n. ậ
14
ậ ữ ệ ừ ư ồ L u đ quá trình nh n d li u t bàn phím
3.3.2. Module key_code
ể ữ ệ ừ ể 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));
3.3.3. Module ps2_kb (Display)
ể ể ạ ị Dùng đ hi n th make code , break code lên các LED 7 đo n.
ị Hex5, Hex4: hi n th make code ể
ể ị Hex3, Hex2, Hex1, Hex0: hi n th break code
Code:
//body
key_code_receiver key_code_unit (.clock(CLOCK_50),
.reset(SW[0]), .ps2c(PS2_CLK), .ps2d(PS2_DAT),
15
.make_code(make_code), .break_code(break_code));
3.4. Software function
#include "altera_up_avalon_ps2.h"
#include "altera_up_ps2_keyboard.h"
3.4.1. PS2 port
ở ạ ế ị ệ ạ ế ị alt_up_ps2_init : kh i t o thi t b PS/2, phá hi n lo i thi t b ( mouse hay
keyboard).
void alt_up_ps2_init(alt_up_ps2_dev *ps2)
ế alt_up_ps2_write_data_byte: vi ế t 1 byte đ n PS/2 port
int alt_up_ps2_write_data_byte(alt_up_ps2_dev*ps2,alt_u8 byte)
ế ế alt_up_ps2_write_data_byte_with_ack : vi t 1 byte đ n PS2 Port và ch ờ
ACK.
int alt_up_ps2_write_data_byte_with_ack(alt_up_ps2_dev*ps2, alt_u8 byte)
ọ ừ alt_up_ps2_read_data_byte : đ c 1 byte t PS2 port.
int alt_up_ps2_read_data_byte(alt_up_ps2_dev *ps2,alt_u8 *byte)
alt_up_ps2_clear_fifo : xóa FIFO cho PS2 port.
void alt_up_ps2_clear_fifo(alt_up_ps2_dev *ps2)
ở ấ ế ớ ị alt_up_ps2_open_dev: m c u trúc thi t b PS2 v i tên trong SOPC
16
builder.
alt_up_ps2_dev* alt_up_ps2_open_dev(const char *name)
3.4.2. PS2 Keyboard
ậ ượ ạ KB_CODE_TYPE: các enumtype cho các lo i mã bàn phím nh n đ c.
ấ C u trúc:
typedef enum {
KB_ASCII_MAKE_CODE = 1;
KB_BINARY_MAKE_CODE = 2;
KB_LONG_BINARY_MAKE_CODE = 3;
KB_BREAK_CODE = 4;
KB_LONG_BREAK_CODE = 5;
KB_INVALID_CODE = 6;
} KB_CODE_TYPE ;
ậ ượ ạ Các enumtype cho các lo i mã bàn phím nh n đ c.
decode_scancode:
ấ C u trúc:
int decode_scancode (alt_up_ps2_dev *ps2, KB_CODE_TYPE *decode_mode,
alt_u8 *buf, char *ascii)
ế ậ ớ ượ Giao ti p v i bàn phím PS / 2 và nh n đ ủ c mã makecode c a
ộ ượ phím khi m t phím đ ấ c nh n.
=====================================
ế ế
ế
Ph n 4ầ : Thi
t k giao ti p LCD và bàn phím
17
ướ ự ệ 4.1. Các b c th c hi n trong Quartus
ạ T o project doan.vhdl trong quartus.
ỉ ự ộ ị đ ng cho các IP:
ọ Trong SOPC gán các đ a ch t (cid:0) Cpu_0 (Ch n Nios II/e,memory :sdram_0)
(cid:0) jtag_uart_0
(cid:0) sdram_0 (presets:Custom,data width:16)
(cid:0) up_avalon_character_lcd_0
(cid:0) up_avalon_ps2_0
ọ Ch n System AutoAssign Base Addresses
ẻ ế Generation SOPC: Click vào th System Generation Generater đ n khi
18
ế ả ấ nào có k t qu SUCCESS : SYSTEM GENERATION COMPLETE là hoàn t t.
ừ ạ ừ ồ ị Add các file v a t o ra t SOPC vào module giaotiep.vhdl r i biên d ch
ươ ạ đo n ch ng trình.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
entity doan is
port( KEY : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
19
CLOCK_50 : IN STD_LOGIC;
PS2_CLK : INOUT STD_LOGIC;
PS2_DAT : INOUT STD_LOGIC;
LCD_RW : OUT STD_LOGIC;
LCD_EN : OUT STD_LOGIC;
LCD_RS : OUT STD_LOGIC;
LCD_DATA : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);
LCD_ON : OUT STD_LOGIC;
LCD_BLON : OUT STD_LOGIC;
DRAM_CLK, DRAM_CKE : OUT STD_LOGIC;
DRAM_ADDR : OUT STD_LOGIC_VECTOR(11 DOWNTO
0);
DRAM_BA_1, DRAM_BA_0 : BUFFER STD_LOGIC;
DRAM_CS_N, DRAM_CAS_N, DRAM_RAS_N,
DRAM_WE_N : OUT STD_LOGIC;
DRAM_DQ : INOUT STD_LOGIC_VECTOR(15 DOWNTO 0);
DRAM_UDQM, DRAM_LDQM : BUFFER STD_LOGIC );
end giaotiep;
ARCHITECTURE giaotiep OF giaotiep IS
component nios_system1 is
port (
1) global signals:
20
clk_0 : IN STD_LOGIC;
reset_n : IN STD_LOGIC;
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;
21
the_up_avalon_ps2_0
PS2_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
);
end component;
component sdram_pll IS
port ( inclk0 : IN STD_LOGIC;
c0 : OUT STD_LOGIC );
end component;
SIGNAL BA : STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL DQM : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
DRAM_BA_1 <= BA(1);
DRAM_BA_0 <= BA(0);
DRAM_UDQM <= DQM(1);
DRAM_LDQM <= DQM(0);
NiosII: nios_system1 PORT MAP (
clk_0 => CLOCK_50,
reset_n => KEY(0),
the_sdram_0
zs_addr_from_the_sdram_0 => DRAM_ADDR,
22
zs_ba_from_the_sdram_0 => BA,
zs_cas_n_from_the_sdram_0 => DRAM_CAS_N,
zs_cke_from_the_sdram_0 => DRAM_CKE,
zs_cs_n_from_the_sdram_0 => DRAM_CS_N,
zs_dq_to_and_from_the_sdram_0 => DRAM_DQ,
zs_dqm_from_the_sdram_0 => DQM,
zs_ras_n_from_the_sdram_0 => DRAM_RAS_N,
zs_we_n_from_the_sdram_0 => DRAM_WE_N,
the_up_avalon_character_lcd_0
LCD_BLON_from_the_up_avalon_character_lcd_0 => LCD_BLON,
LCD_DATA_to_and_from_the_up_avalon_character_lcd_0 =>
LCD_DATA,
LCD_EN_from_the_up_avalon_character_lcd_0 => LCD_EN,
LCD_ON_from_the_up_avalon_character_lcd_0 => LCD_ON,
LCD_RS_from_the_up_avalon_character_lcd_0 => LCD_RS,
LCD_RW_from_the_up_avalon_character_lcd_0 => LCD_RW,
the_up_avalon_ps2_0
PS2_CLK_to_and_from_the_up_avalon_ps2_0 => PS2_CLK,
PS2_DAT_to_and_from_the_up_avalon_ps2_0 => PS2_DAT
);
neg_3ns: sdram_pll PORT MAP (CLOCK_50, DRAM_CLK);
23
end giaotiep;
ướ ự ệ 4.2. Các b c th c hi n trong Nios II
ỗ ợ ạ T o project
(cid:0) altera_up_avalon_character_lcd.c
(cid:0) altera_up_avalon_character_lcd.h
(cid:0) altera_up_avalon_character_lcd_regs.h
(cid:0) altera_up_avalon_ps2.c
(cid:0) altera_up_avalon_ps2.h
(cid:0) altera_up_avalon_ps2_regs.h
(cid:0) altera_up_ps2_keyboard.c
(cid:0) altera_up_ps2_keyboard.h
ế ươ ắ ầ Ta b t đ u vi t code ch ng trình:
#include "altera_up_avalon_character_lcd.h"
#include "altera_up_avalon_ps2.h"
#include "altera_up_ps2_keyboard.h"
#include "altera_up_ps2_mouse.h"
#include
#include
#include
#include
#include "system.h"
int main(void)
24
{
alt_up_character_lcd_dev *char_lcd_dev;
char_lcd_dev = alt_up_character_lcd_open_dev ("/dev/LCD_0");
alt_up_character_lcd_init (char_lcd_dev);
alt_up_character_lcd_string(char_lcd_dev, "Welcome ");
alt_up_ps2_dev * ps2_dev;
ps2_dev = alt_up_ps2_open_dev("/dev/Ps2_0");
alt_up_ps2_init(ps2_dev);
alt_up_ps2_clear_fifo(ps2_dev);
KB_CODE_TYPE decode_mode;
alt_u8 byte1;
char byte2;
unsigned int i;
char second_row0[] = "Welcome";
char second_row1[] = "B ";
char second_row2[] = "C ";
char second_row3[] = "D ";
char second_row4[] = "E ";
char second_row5[] = "F ";
char second_row6[] = "G ";
char second_row7[] = "H ";
char second_row8[] = "I ";
char second_row9[] = "J ";
char second_row10[] = "K ";
char second_row11[] = "L ";
char second_row12[] = "M ";
25
char second_row13[] = "N ";
char second_row14[] = "O ";
char second_row15[] = "P ";
char second_row16[] = "Q ";
char second_row17[] = "R ";
char second_row18[] = "S ";
char second_row19[] = "T ";
char second_row20[] = "U ";
char second_row21[] = "V ";
char second_row22[] = "W ";
char second_row23[] = "X ";
char second_row24[] = "Y ";
char second_row25[] = "Z ";
char second_row26[] = "0 ";
char second_row27[] = "1 ";
char second_row28[] = "2 ";
char second_row29[] = "3 ";
char second_row30[] = "4 ";
char second_row31[] = "5 ";
char second_row32[] = "6 ";
char second_row33[] = "7 ";
char second_row34[] = "8 ";
char second_row35[] = "9 ";
char second_row36[] = "` ";
char second_row37[] = " ";
char second_row38[] = "= ";
26
char second_row39[] = "[ ";
char second_row40[] = "] ";
char second_row41[] = "\ ";
char second_row42[] = "; ";
char second_row43[] = "' ";
char second_row44[] = ", ";
char second_row45[] = ". ";
char second_row46[] = "/ ";
while(1)
{
decode_scancode(ps2_dev,&decode_mode,&byte1,&byte2);
if (decode_mode == KB_ASCII_MAKE_CODE)
switch (byte1)
{case 0x1C:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1);
alt_up_character_lcd_string(char_lcd_dev, second_row0);
break;
case 0x32:
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1);
alt_up_character_lcd_string(char_lcd_dev, second_row1);
27
break;
case 0x21:
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);
28
alt_up_character_lcd_string(char_lcd_dev, second_row6);
break;
case 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);
29
break;
case 0x4b:
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;
30
case 0x4d:
alt_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:
31
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1);
alt_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);
32
break;
case 0x35:
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;
33
case 0x1e:
alt_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);
34
alt_up_character_lcd_string(char_lcd_dev, second_row32);
break;
case 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);
35
break;
case 0x4e:
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;
36
case 0x5d:
alt_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:
37
alt_up_character_lcd_set_cursor_pos(char_lcd_dev, 0, 1);
alt_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;
}
}
}
ế ờ Sau đó ta Build project ch cho đ n khi build complete.
ạ 4.3.N p lên DE 2
ọ Trong Quartus: ch n Programmer.
ọ o Hardware Setup Ch n USB Port 0
ọ Start. o Ch n file giaotiep_time_limited.sof
38
ọ Trong Nios II: ch n doan.c Run as Nios II Hardware.
ệ
ả Tài li u tham kh o
1) FPGA prototyping by Verilog examplesPong P. Chu
39
Cleveland State University
2) DE 2 Manual.
3) PS 2 Core for Altera DE 2 board.
40
4) Character LCD Core for Altera DE 2/DE 1 Board.