<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于STEP FPGA的PS2鍵盤(pán)驅動(dòng)

基于STEP FPGA的PS2鍵盤(pán)驅動(dòng)

作者: 時(shí)間:2023-11-29 來(lái)源:電子森林 收藏

硬件說(shuō)明

我們的STEP-BaseBoard底板上集成了PS2鍵盤(pán)的接口,可以供大家連接PS2鍵盤(pán)或PS2鼠標完成相應設計,接下來(lái)我們來(lái)了解PS2接口的硬件連接及PS2鍵盤(pán)的驅動(dòng)方法。
PS2接口連線(xiàn)非常簡(jiǎn)單,只需接4根線(xiàn):

本文引用地址:http://dyxdggzs.com/article/202311/453397.htm
  • 4號引腳VCC接供電電源,一般為5V供電,后經(jīng)測試3.3V也可以
  • 3號引腳GND接地即可
  • 5號引腳時(shí)鐘線(xiàn)和1號引腳數據線(xiàn)為兩條雙向的信號線(xiàn)
  • 2號引腳和6號引腳為保留引腳,不需要連接

當PS2鍵盤(pán)上有按鍵按動(dòng)或操作的時(shí)候,鍵盤(pán)會(huì )發(fā)信號給主機,PS2接口的時(shí)鐘信號和數據信號的時(shí)序如下圖:

FPGA或主機接收鍵盤(pán)發(fā)回的數據,通過(guò)鍵盤(pán)的編碼規則判定鍵盤(pán)當前的操作,掃描碼有兩種不同的類(lèi)型:通碼(make code)和斷碼(break code)。當一個(gè)鍵被按下或持續按住時(shí),鍵盤(pán)會(huì )將該鍵的通碼發(fā)送給主機;而當一個(gè)鍵被釋放時(shí),鍵盤(pán)會(huì )將該鍵的斷碼發(fā)送給主機。
根據鍵盤(pán)按鍵掃描碼的不同,在此可將按鍵分為如下幾類(lèi):

  • 第一類(lèi)按鍵,通碼為1字節,斷碼為0xF0+通碼形式。如A鍵,其通碼為0x1C,斷碼為0xF0 0x1C。
  • 第二類(lèi)按鍵,通碼為2字節0xE0+0xXX形式,斷碼為0xE0+0xF0+0xXX形式。如right ctrl鍵,其通碼為0xE0 0x14,斷碼為0xE0 0xF0 0x14。
  • 第三類(lèi)特殊按鍵有兩個(gè),print screen鍵通碼為0xE0 0x12 0xE0 0x7C,斷碼為0xE0 0xF0 0x7C 0xE0 0xF0 0x12; pause鍵通碼為0x E1 0x14 0x77 0xE1 0xF0 0x14 0xF0 0x77,斷碼為空。

組合按鍵的掃描碼發(fā)送按照按鍵發(fā)生的次序,如以下面順序按左SHIFT+A鍵:1按下左SHIFT鍵,2按下A鍵,3釋放A鍵,4釋放左SHIFT鍵,那么計算機上接收到的一串數據為0x12 0x1C 0xF0 0x1C 0xF0 0x12。
在驅動(dòng)程序設計中,就是根據這樣的分類(lèi)來(lái)對不同的按鍵進(jìn)行不同處理的,當前簡(jiǎn)單程序只支持第一類(lèi)按鍵的操作。
鍵盤(pán)中不同按鍵的編碼如下:

Verilog代碼

// --------------------------------------------------------------------
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------------------
// Module: Keyboard_PS2
// 
// Author: Step
// 
// Description: PS2 keyboard driver
// 
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date:   |Changes Made:
// V1.0     |2016/04/20   |Initial ver
// --------------------------------------------------------------------
module Keyboard_PS2
(
input					clk_in,				//系統時(shí)鐘
input					rst_n_in,			//系統復位,低有效
input					key_clk,			//PS2鍵盤(pán)時(shí)鐘輸入
input					key_data,			//PS2鍵盤(pán)數據輸入
output	reg				key_state,			//鍵盤(pán)的按下?tīng)顟B(tài),按下為1,松開(kāi)為0
output	reg		[7:0]	key_ascii			//按鍵鍵值對應的ASCII編碼); 
/*
這個(gè)模塊為FPGA驅動(dòng)PS2鍵盤(pán)的簡(jiǎn)單程序,只能支持鍵盤(pán)中第一類(lèi)按鍵的單鍵按動(dòng),不支持多個(gè)按鍵同時(shí)按動(dòng)
*/ 
reg		key_clk_r0 = 1'b1,key_clk_r1 = 1'b1; 
reg		key_data_r0 = 1'b1,key_data_r1 = 1'b1;
//對鍵盤(pán)時(shí)鐘數據信號進(jìn)行延時(shí)鎖存
always @ (posedge clk_in or negedge rst_n_in) begin
	if(!rst_n_in) begin
		key_clk_r0 <= 1'b1;
		key_clk_r1 <= 1'b1;
		key_data_r0 <= 1'b1;
		key_data_r1 <= 1'b1;
	end else begin
		key_clk_r0 <= key_clk;
		key_clk_r1 <= key_clk_r0;
		key_data_r0 <= key_data;
		key_data_r1 <= key_data_r0;
	endend //鍵盤(pán)時(shí)鐘信號下降沿檢測
	wire	key_clk_neg = key_clk_r1 & (~key_clk_r0);  
	reg				[3:0]	cnt; 
	reg				[7:0]	temp_data;
	//根據鍵盤(pán)的時(shí)鐘信號的下降沿讀取數據,詳細參考PS2鍵盤(pán)數據的傳輸格式及時(shí)序
	always @ (posedge clk_in or negedge rst_n_in) begin
	if(!rst_n_in) begin
		cnt <= 4'd0;
		temp_data <= 8'd0;
	end else if(key_clk_neg) begin 
		if(cnt >= 4'd10) cnt <= 4'd0;
		else cnt <= cnt + 1'b1;
		case (cnt)
			4'd0: ;	//起始位
			4'd1: temp_data[0] <= key_data_r1;  //數據位bit0
			4'd2: temp_data[1] <= key_data_r1;  //數據位bit1
			4'd3: temp_data[2] <= key_data_r1;  //數據位bit2
			4'd4: temp_data[3] <= key_data_r1;  //數據位bit3
			4'd5: temp_data[4] <= key_data_r1;  //數據位bit4
			4'd6: temp_data[5] <= key_data_r1;  //數據位bit5
			4'd7: temp_data[6] <= key_data_r1;  //數據位bit6
			4'd8: temp_data[7] <= key_data_r1;  //數據位bit7
			4'd9: ;	//校驗位
			4'd10:;	//結束位
			default: ;
		endcase
	end
end 
	reg						key_break = 1'b0;   
	reg				[7:0]	key_byte = 1'b0;//根據通碼和斷碼判定按鍵的當前是按下還是松開(kāi)
	always @ (posedge clk_in or negedge rst_n_in) begin 
	if(!rst_n_in) begin
		key_break <= 1'b0;
		key_state <= 1'b0;
		key_byte <= 1'b0;
	end else if(cnt==4'd10 && key_clk_neg) begin 
		if(temp_data == 8'hf0) key_break <= 1'b1;	//收到段碼(8'hf0)表示按鍵松開(kāi),設置斷碼標示為1
		else if(!key_break) begin 	//當斷碼標示為0時(shí),表示當前數據為按下數據,輸出鍵值并設置按下標示為1
			key_state <= 1'b1;
			key_byte <= temp_data; 
		end else begin	//當斷碼標示為1時(shí),標示當前數據為松開(kāi)數據,斷碼標示和按下標示都清零
			key_state <= 1'b0;
			key_break <= 1'b0;
		end
	endend //將鍵盤(pán)返回的有效鍵值轉換為按鍵字母對應的ASCII碼值
	always @ (key_byte) begin
	case (key_byte)    //translate key_byte to key_ascii
		8'h15: key_ascii = "Q";//8'h51;   //Q
		8'h1d: key_ascii = "W";//8'h57;   //W
		8'h24: key_ascii = "E";//8'h45;   //E
		8'h2d: key_ascii = "R";//8'h52;   //R
		8'h2c: key_ascii = "T";//8'h54;   //T
		8'h35: key_ascii = "Y";//8'h59;   //Y
		8'h3c: key_ascii = "U";//8'h55;   //U
		8'h43: key_ascii = "I";//8'h49;   //I
		8'h44: key_ascii = "O";//8'h4f;   //O
		8'h4d: key_ascii = "P";//8'h50;   //P
		8'h1c: key_ascii = "A";//8'h41;   //A
		8'h1b: key_ascii = "S";//8'h53;   //S
		8'h23: key_ascii = "D";//8'h44;   //D
		8'h2b: key_ascii = "F";//8'h46;   //F
		8'h34: key_ascii = "G";//8'h47;   //G
		8'h33: key_ascii = "H";//8'h48;   //H
		8'h3b: key_ascii = "J";//8'h4a;   //J
		8'h42: key_ascii = "K";//8'h4b;   //K
		8'h4b: key_ascii = "L";//8'h4c;   //L
		8'h1a: key_ascii = "Z";//8'h5a;   //Z
		8'h22: key_ascii = "X";//8'h58;   //X
		8'h21: key_ascii = "C";//8'h43;   //C
		8'h2a: key_ascii = "V";//8'h56;   //V
		8'h32: key_ascii = "B";//8'h42;   //B
		8'h31: key_ascii = "N";//8'h4e;   //N
		8'h3a: key_ascii = "M";//8'h4d;   //M
		default: ;
	endcase
	end 
	endmodule

小結

本節主要為大家講解了PS2接口電路、PS2鍵盤(pán)編碼規則及使用FPGA簡(jiǎn)單驅動(dòng)PS2鍵盤(pán)的方法,需要大家掌握的同時(shí)自己創(chuàng )建工程,通過(guò)整個(gè)設計流程,生成FPGA配置文件加載測試。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>