📄 ps2.c
字号:
//用于PS2键盘。第二套码值。
///////////////////////////////////////////////////////////////////////////////////
sbit scl=P1^7;
sbit sda=P1^6;
#define WAITFORKEYBOARDPULSE while(scl); while(!scl);
/*********************************************************/
//函数:ReadPS2()
//功能:扫描键盘
//输入:
//输出:键值
//描述:
/*********************************************************/\
void ReadPS2()
{
//unsigned char KeyCode; //键盘键值
unsigned char bitCount; //位数
// uchar bitnumber;
// while(scl); // 等待键盘把时钟第一次拉低
for(bitCount = 8; bitCount != 0; bitCount --) // 把起始位算入
{
WAITFORKEYBOARDPULSE; // 等待一个有效的下跳沿
KeyCode >>= 1; // 按照PS2格式,数据低位在前
// scl = 1;
// sda = 1;
if(scl==0)return;
if(sda == 0)
{
KeyCode |= 0x80; // 得到有效的数据位
// bitnumber++;
}
}
WAITFORKEYBOARDPULSE; // 等待按键发送效验位
// if(sda==0&&(bitnumber%2)==0);
// else KeyCode=0x00;
WAITFORKEYBOARDPULSE; // 等待按键发送终止位
while(scl); // 等待键盘把时钟线拉高
// return(KeyCode); // 返回按键扫描
}
void timer2_interrupt(void) interrupt 5// using 2
{
// uchar i;
TR2=0;
if(sclsign==0)
{
if(sda==1&&scl==1)
{
ReadPS2();
if(KeyCode==key_da[0])//01为 F9读值比较是否为01..
{
sclsign=1;
key_data=0xef;
}
else
{
sclsign=1; key_biaoji1=1;
if(KeyCode==key_da[1])key_data=0xbf;// //F10
else
{
if(KeyCode==key_da[2])key_data=0xf7;// //F11
else
{
if(KeyCode==key_da[3])key_data=0xfd;// //F8
}
}
}
}//////
}
else
{
if(key_biaoji1==1)scltime++;
if(scltime>=200){scltime=0;sclsign=0;key_biaoji1=0;}
}
TF2 = 0;TR2=1;
}
//定时器2的初始化22.1184M
void init_timer2(void)
{
T2CON = 0x00;
IP=0x20;
//RCAP2H = 0xb7; // Reload value..10ms
//RCAP2L = 0xfe;
RCAP2H=0Xff;RCAP2L=0Xf7; //....0.01ms=0.01*1000=10us
TH2 = 0xff; // Initial load value
TL2 = 0xf7;
TR2 = 1; // Timer 2 run
ET2 = 1; // Timer2 interrupt
}
/*
接线说明
PS2 公 PS2母 说明
1 1 P1_6
3 3 电源地
4 4 电源正5V
5 5 P1_7
电路说明
————————PS2的1线 到-10K 电阻--到三极管的9014的B极
三极管的C极-电阻4.7K到电源正
三极管的E极接到P1_6或P1_7
///*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -