ƯỜ

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.

 50­MHz oscillator and 27­MHz oscillator for clock sources.

 24­bit CD­quality audio CODEC with line­in, line­out, and microphone­in

jacks.

 VGA DAC (10­bit high­speed triple DACs) with VGA­out connector.

 TV Decoder (NTSC/PAL) and TV­in connector.

 10/100 Ethernet Controller with a connector.

 USB Host/Slave Controller with USB type A and type B connectors.

 RS­232 transceiver and 9­pin connector.

 PS/2 mouse/keyboard connector.

 IrDA transceiver.

 Two 40­pin 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 84­101 phím:

 6 đ u n i DIN

ầ ố

ề ề ố ế  truy n n i ti p 2 chi u

 s  d ng scan code set 2

ử ụ

 84­102 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à ọ make­code.

 Khi phím đ

ượ ả ọ c nh , mã này g i là break­code.

ế ầ ồ Break­code g m 2 byte: byte đ u là F0, byte k  là mã make­code.

Ví d : ụ

(cid:0) ấ nh n SHIFT: make­code = 12

10

(cid:0) Nh n A: ấ make­code = 1C

(cid:0) Nh   A:  ả break­code = F0, 1C

ả Nh  SHIFT:   break­code = F0, 12

ượ ấ ữ ượ ề ề (cid:0) Khi m t phím đ ộ c nh n và gi , make­code đ ặ   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 10­16.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 11­12bit 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  Auto­Assign 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 .c và import các file h  tr  vào:

(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 examples­Pong 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.