/*********************************************************************
目 的: 建立操作PC鍵盤的示例程序(硬件中斷讀取PS/2接收到的數據)
目標系統: 基于AVR單片機
應用軟件: ICCAVR
版 本: Version 1.0
*********************************************************************/
/*01010101010101010101010101010101010101010101010101010101010101010101
----------------------------------------------------------------------
版本更新記錄:
----------------------------------------------------------------------
實驗內容:
按PC鍵盤,觀察單片機讀到的數據,使用PA/PB口的LED做指示。
----------------------------------------------------------------------
硬件連接:
將PA/PB口的LED指示燈使能開關切換到"ON"狀態
將PC鍵盤插入PS2接口,將PD3與PS2.SDA連接,將PD4與PS2.SCK連接
----------------------------------------------------------------------
注意事項:
(1)若有加載庫函數,請將光盤根目錄下的“庫函數”下的“ICC_H”文件夾拷到D盤
(2)請詳細閱讀“使用必讀”及相關資料。
----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/
#include
#include "D:ICC_HCmmICC.H"
#include "D:ICC_HPS2.H"
#define PRESS_DATA_DDR DDRA
#define PRESS_DATA_PORT PORTA
#define SHIFT_DATA_DDR DDRB
#define SHIFT_DATA_PORT PORTB
#define SET_SDA sbi(PORTD,4)
#define CLR_SDA cbi(PORTD,4)
#define GET_SDA gbi(PIND,4)
#define OUT_SDA sbi(DDRD,4)
#define IN_SDA cbi(DDRD,4)
#define SET_SCK sbi(PORTD,3)
#define CLR_SCK cbi(PORTD,3)
#define GET_SCK gbi(PIND,3)
#define OUT_SCK sbi(DDRD,3)
#define IN_SCK cbi(DDRD,3)
bool rcvF = 0; //是否收到字符標志
uint8 keyVal; //鍵值
/*--------------------------------------------------------------------
函數名稱:PS/2
函數功能:
注意事項:
提示說明:
輸 入:
返 回:
--------------------------------------------------------------------*/
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
static uint8 rcvBits = 0; //接收次數,中斷次數
if((rcvBits>0) && (rcvBits<9))
{
keyVal=keyVal>>1; //數據是LSB格式
//IN_SDA; //當有對鍵盤有屬性設置時,注意輸入輸出切換
//DELAY();
if(GET_SDA)
keyVal=keyVal|0x80;
}
rcvBits++;
while(!GET_SCK); //等待PS/2CLK拉高
if(rcvBits>10)
{
rcvBits=0; //接收11次表示接收完一幀數據
rcvF=1; //標識有字符已經輸入
}
}
/*--------------------------------------------------------------------
函數名稱:PS/2
函數功能:
注意事項:
提示說明:
輸 入:
返 回:
--------------------------------------------------------------------*/
void keyHandle(uint8 val)
{
uint8 i;
static bool isUp=0; //按鍵釋放動作標志
static bool shift=0; //shift鍵按下標志
rcvF = 0;
PRESS_DATA_PORT = val; //狀態指示
if(!isUp)
{
switch(val)
{
case 0xF0 : // a relase action
isUp = 1;
break;
case 0x12 : // Left shift
shift = 1;
break;
case 0x59 : // Right shift
shift = 1;
break;
default:
if(!shift) // If shift not pressed
{
/*
for(i=0; unshifted[i][0]!=val && unshifted[i][0]; i++)
;
上述寫法較為靈活,但KEIL非UNIXC標準,不能采用該寫法
*/
for(i=0; unshifted[i][0]!=val && i<59; i++)
;
if(unshifted[i][0] == val)
; //狀態指示
}
else // If shift pressed
{
/*
for(i=0; unshifted[i][0]!=val && unshifted[i][0]; i++)
;
上述寫法較為靈活,但KEIL非UNIXC標準,不能采用該寫法
*/
for(i=0; shifted[i][0]!=val && i<59; i++)
;
if(shifted[i][0] == val)
SHIFT_DATA_PORT = val;//狀態指示
}
}
}
else
{
isUp=0;
switch(val)
{
case 0x12 : // Left SHIFT
shift = 0;
break;
case 0x59 : // Right SHIFT
shift = 0;
break;
}
}
}
/*--------------------------------------------------------------------
函數名稱:PS/2
函數功能:
注意事項:
提示說明:
輸 入:
返 回:
--------------------------------------------------------------------*/
void int1_init()
{
IN_SCK; // set SCK_DDR (PD3/INT1) as input
SET_SCK; // set SCK_PORT as high level,avoid triggering
MCUCR |= 0b11110011; // set PD3/INT1 as low level active
GICR |= 0b10000000; // enable global interrupt
SEI(); // enable external interrupt
}
/*--------------------------------------------------------------------
函數名稱:PS/2
函數功能:
注意事項:
提示說明:
輸 入:
返 回:
--------------------------------------------------------------------*/
void main(void)
{
PRESS_DATA_DDR = 0XFF;
SHIFT_DATA_DDR = 0XFF;
IN_SDA;
int1_init();
while(1)
{
if(rcvF)
keyHandle(keyVal);
}
}
上一篇:LCD12864子程序
下一篇:AVR PS/2 軟件查詢控制程序
推薦閱讀
史海拾趣
隨著市場的不斷變化和需求的日益增長,City Technology并未滿足于已有的成就。在1980年代末至1990年代初,公司積極擴展產品線,相繼開發了電化學有毒氣體傳感器和可燃氣體傳感器。這些新產品的推出,不僅豐富了公司的產品線,也進一步鞏固了其在氣體傳感領域的領先地位。同時,公司還不斷對已有產品進行優化升級,以滿足客戶日益多樣化的需求。
在快速發展的過程中,Cofan Usa Inc公司意識到供應鏈管理的重要性。為了確保產品質量和交貨期的穩定性,公司開始優化供應鏈管理流程,與優質供應商建立長期合作關系,并引入先進的供應鏈管理系統。這些舉措有效提升了公司的運營效率和市場競爭力。
除了連接器產品外,ERNI Electronics的系統技術部門也取得了顯著的發展。該部門為客戶提供標準型和定制化的背板和子系統解決方案,以及高性能、自行設計的工具制造、現代器件裝配和測試設備等高附加值服務。隨著市場對完整解決方案的需求不斷增長,系統技術部門的業績也實現了大幅增長,成為公司發展的重要支柱之一。
在電子行業的早期,FDI(Future Designs, Inc.)還只是一家名不見經傳的小公司。創始人李明,憑借其對電子技術的熱愛和敏銳的商業洞察力,帶領團隊研發出了一款具有革命性的電子芯片。這款芯片不僅性能卓越,而且成本較低,迅速在市場上獲得了認可。正是這款產品,為FDI公司贏得了第一桶金,也為公司后續的發展奠定了堅實的基礎。
隨著市場競爭的加劇,FDI公司意識到只有不斷創新才能在行業中立足。于是,公司加大了對研發的投入,引進了一批頂尖的技術人才。經過數年的努力,FDI成功研發出了一款具有自主知識產權的智能電子系統,該系統集成了多項先進技術,可以廣泛應用于智能家居、工業自動化等領域。這一技術突破,不僅使FDI公司的知名度大幅提升,也為其帶來了豐厚的利潤。
Brand-Rex一直致力于技術創新和產品研發。其專利銅線絞合技術大大改善了結構回路損耗,降低了衰減;同時,利用電纜內十字截面塑膠隔離層把四組雙絞線分隔開,減少了近端串擾。這些技術創新不僅提升了產品的性能和質量,還使Brand-Rex在行業中樹立了技術領先的形象。此外,Brand-Rex還積極參與國際標準的制定和推廣工作,為全球布線行業的發展做出了重要貢獻。
Cadence設計系統有限公司日前宣布推出基于空間的、全芯片和模塊布線解決方案,Cadence Precision Router面向高級混合信號、模擬與定制數字設計,為實現設計性能閉合并更快實現量產,它允許設計者在設計過程中制造相關的效應建模。 復雜的互連規則, ...… 查看全部問答∨ |
|
兄弟們,你們有誰用過swellsoftware的pegpro? 我下載的Evaluation如何創建,編譯項目呢. 如果哪位有全功能版的,可以短消息告訴我哈.非常感謝. 主要想個人學一下.… 查看全部問答∨ |
|
下了一個本地數據庫的小例子 打開vcw的時候 evc提示 fatal error RC1015:cannot open include file \'afxres.h\' 請問是怎么回事? 缺少頭文件? 謝謝~ 怎么解決?… 查看全部問答∨ |
|
我在主機上PB用菜單上的Target/Attach Device連接設備時。 調試信息的輸出窗口輸出 The Kernel Debugger is waiting to connect with target. 請問為什么? 我在PB的connectity option已經定義了設備的地址。 我還需 ...… 查看全部問答∨ |
|
STM32一書錯誤百出很失望,不知道是否在出版要求以內,看書的時候和電子板的stm3210x中文參考手冊對比到看才行。該 ...… 查看全部問答∨ |