PS/2鍵盤掃描實(shí)驗(yàn)C程序
#include"../Inc/MyCommon.h"
#include
#include
#include"../Inc/MyDelay.h"
#include"../Inc/CH451.h"
#definePS2SDA(1<<;PA0)
#definePS2SCL(1<<;PE6)
ucharDisplayData[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};//數(shù)碼管各位要顯示的數(shù)據(jù)
ucharIntNum=0;//中斷次數(shù)
ucharKeyUP=0;//鍵松開標(biāo)識
//鍵盤編碼表
ucharPS2KeyCode[16]={
69,//0
22,//1
30,//2
38,//3
37,//4
46,//5
54,//6
61,//7
62,//8
70,//9
28,//a
50,//b
33,//c
35,//d
36,//e
43,//f
};
//鍵盤解碼函數(shù)
voidDecode(){
if(!KeyUP){//當(dāng)鍵盤不是松開時
switch(KeyValue){
case0xF0://便是斷碼開始
KeyUP=1;
break;
default:{
for(uchari=0;i<16;i++){//查找鍵值對應(yīng)的數(shù)字
if(KeyValue==PS2KeyCode){
for(ucharj=0;j<7;j++)DisplayData[j]=DisplayData[j+1];//前移一位
DisplayData[7]=i;//最后一位顯示剛輸入的數(shù)字
}
}
break;
}
}
}else{
KeyUP=0;
}
}
//INT6中斷處理程序
ISR(SIG_INTERRUPT6){
//PS2鍵盤中斷
if((IntNum>0)&&(IntNum<9)){
KeyValue>>=1;//因鍵盤數(shù)據(jù)是低>>高,結(jié)合上一句所以右移一位
if(PINA&PS2SDA)KeyValue|=0x80;//當(dāng)鍵盤數(shù)據(jù)線為1時到最高位
}
IntNum++;
while(!(PINE&PS2SCL));//等待CLK拉高
if(IntNum>10){//接收完一個數(shù)據(jù)
IntNum=0;
Decode();
}
}
//主函數(shù)
intmain(){
uchari;
DDRA=0xA8;//PA3PA5PA7設(shè)置為輸出
DDRA&=~PS2SDA;//PA0設(shè)置為輸入
DDRE&=~PS2SCL;//PE6設(shè)置為輸入
EICRB&=~(1<
sei();//開總中斷
while(1){
for(i=0;i<8;i++)CH451_DisplayDig(7-i,DisplayData,0);//顯示新的數(shù)據(jù)
}
return0;
}
#ifndef _MYCOMMON_H
#define _MYCOMMON_H
//全局宏定義
#define F_CPU 7.3728E6//晶振頻率
#defineuint unsigned int
#defineuchar unsigned char
#defineulong unsigned long
#endif
#ifndef _MYDELAY_H
#define _MYDELAY_H
#include "MyCommon.h"
#include
void DelayMS(uint ms);//毫秒級延時函數(shù)
void Delay10US(uint us);//10微秒級延時函數(shù)
//ms級延時程序
void DelayMS(uint ms){
while(ms--){
_delay_ms(1);
}
}
//10us級延時程序
void Delay10US(uint us){
while(us--){
_delay_us(10);
}
}
#endif