PS/2鍵盤是一種編碼鍵盤,只需要一根數據線和一根時鐘線就可以完成數據的輸入。
實驗程序設計為,按鍵盤上的"J"鍵,繼電器閉合。
C語言源程序:
#include <reg52.h> //52單片機頭文件包含
#include <intrins.h>//常用移位函數頭文件包含
sbit key_data=P1^5; //定義鍵盤接口的數據腳
sbit key_clk=P3^2;//定義鍵盤接口的時鐘腳
sbit JDQ=P2^4; //定義繼電器連接引腳
bit BF=0; //定義位變量BF
unsigned char keyv=0; //定義無符號字符變量keyv并賦初值0
unsigned int intNum=0;//定義無符號整型變量intNum并賦初值0
unsigned char key_up=1;//定義無符號字符變量key_up并賦初值1
void ldedata(unsigned char scandata);//按鍵數據處理函數
void main() //主函數
{
EA=1; //打開總中斷
EX0=1;//打開0號中斷
IT0=1;//中斷方式為下降沿觸發(fā)方式
do{ //do-while循環(huán)
if(BF) //如果有鍵按下
ldedata(keyv);//處理按鍵數據
else
EA=1;//否則打開中斷
}while(1); //總為真不斷循環(huán)
}
void key_scan() interrupt 0 //中斷函數鍵盤輸入key_scan 中斷入口0
{
if((intNum>0)&&(intNum<9)) //如果intNum>0并且intNum<9 就執(zhí)行if里面的語句
{
keyv=keyv>>1; //將字符變量keyv右移一位
if(key_data) //判斷key_data 是否為真 即是否有數據
keyv=keyv|0x80; //有就將keyv與0x80進行或運算再賦值給keyv
}
intNum++;//將intNum的值自加1
while(!key_clk)//鍵值是否處理完
if(intNum>10)//判斷intNum是否大于10
{
intNum=0;//將intNum賦值為0
BF=1;//將BF賦值為1
EA=0;//關閉總中斷
}
}
void ldedata(unsigned char scandata) //鍵盤數據處理函數
{
if(!key_up) //鍵盤松開時
{
switch(scandata){ //處理鍵盤數據
case 0xf0://沒按下任何鍵
key_up=1;//按下
break;//跳出
case 0x12://左邊SHIFT
break;//跳出
case 0x59://右邊SHIFT
break;//跳出
default://缺省處理
P1=~scandata;//將按下的鍵碼輸出給P2口驅動燈亮,因發(fā)光二極采用共陽級,所以取反輸出
if(scandata==0x3b)//當按下J鍵時
JDQ=0;//打開繼電器
if(scandata==0x29){//當按下空格鍵時
JDQ=1;//關閉繼電器
}
break;//跳出
}
}
else{ //否則
key_up=0;//按鍵按下
switch(scandata){//處理按鍵
case 0x12://左邊SHIFT
break;//跳出
case 0x59://右邊SHIFT
break;//跳出
}
}
BF=0;//標識字符表示處理完了
}
//實驗結果 按下鍵盤j鍵繼電器打開 按下空格鍵繼電器關閉
|