📄 ps2key.c
字号:
#include <reg52.h>
sbit ps2dat=P2^0;
sbit ps2clk=P2^2;
sbit SPK=P3^7;
sbit K1=P1^6;
sbit K2=P1^7;
bit parity;
unsigned char sdata;
void delayus(unsigned char n)
{ n=n>>1;
while(n--);
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void send_char(unsigned char send_data)
{unsigned char i;
parity=1;
while(!ps2clk)
{delayus(10);}//等待主机释放抑制
if(!ps2dat)
return;//主机要发送数据,传输中止
delayus(20);
// 发送起始位
ps2dat=0;
delayus(10);
ps2clk=0;
delayus(20);
ps2clk=1;
delayus(10);
ps2dat=1;
//发送数据
for(i=0;i<8;i++)
{ps2dat=send_data&0x01;
parity=parity^(ps2dat^0);
send_data=send_data>>1;
delayus(10);
ps2clk=0;
SPK=0;
delayus(20);
ps2clk=1;
SPK=1;
delayus(10);
}
//发送校验位
ps2dat=parity;
delayus(10);
ps2clk=0;
delayus(20);
ps2clk=1;
delayus(10);
ps2dat=1;
//发送停止位
ps2dat=1;
delayus(10);
ps2clk=0;
delayus(20);
ps2clk=1;
}
main()
{unsigned char kk1,kk2;
kk1=1;
kk2=1;
while(1)
{/*if(K1==0)
{ delayms(50);
if(K1==0)
{send_char(0x11);
delayms(10);
send_char(0x0d);
delayms(10);
send_char(0xf0);
delayms(10);
send_char(0x0d);
delayms(10);
send_char(0xf0);
delayms(10);
send_char(0x11);
delayms(100);
}
}
if(K2==0)
{ delayms(50);
if(K2==0)
{send_char(0x2e);
delayms(10);
send_char(0xf0);
delayms(10);
send_char(0x2e);
delayms(100);
}
} */
if(K1==0&&kk1==1) //K1按下
{kk1=0;
send_char(0x11);
delayms(10);
}
if(K1==1&&kk1==0) //K1弹起
{kk1=1;
send_char(0xf0);
delayms(10);
send_char(0x11);
delayms(10);
}
if(K2==0&&kk2==1) //K2按下
{kk2=0;
send_char(0x0d);
delayms(10);
}
if(K2==1&&kk2==0) //K2按下
{kk2=1;
send_char(0xf0);
delayms(10);
send_char(0x0d);
delayms(10);
}
}
}
/*
#include <intrins.h>
sbit ps2data = P2^0;
sbit ps2clock = P2^2;
sbit speak = P3^7;
unsigned char bdata ps2char;
unsigned char bdata status;
sbit ps2lsb = ps2char^0;
sbit pverify = status^0;
unsigned char bdata keystatus;
sbit key1_up=keystatus^0;
sbit AN1 = P1^6;
sbit AN2 = P1^7;
sbit LED1 = P0^2;
sbit irt = P0^0;
sbit gdt = P0^1;
void delayus(unsigned char us)
{ us=us*2;
while(--us) ;
}
void send_char()
{
unsigned char cnt = 9;
while(!ps2clock)
delayus(10);
if(!ps2data)
return;
//起始位
ps2data = 0;
delayus(10);
ps2clock = 0;
delayus(20);
ps2clock = 1;
delayus(10);
ACC = ps2char;
pverify = ~P;
while(--cnt)
{
ps2data = ps2lsb;
ps2char = _cror_(ps2char,1);
delayus(10);
ps2clock = 0;
speak = 0;
delayus(20);
ps2clock = 1;
speak = 1;
delayus(10);
}
ps2data = ps2lsb;
delayus(10);
ps2clock = 0;
delayus(20);
ps2clock = 1;
delayus(10);
ps2data = 1;
delayus(10);
ps2clock = 0;
delayus(20);
ps2clock = 1;
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void main(void)
{
P0=0xFF;
keystatus = 0xFF;
gdt = 0;
while(1)
{
LED1 = irt;
speak = irt;
if(AN1==0) // 扫描按键
{
delayms(100); // 延时去抖动
if(AN1==0) // 再次扫描
{
key1_up = AN1;
//if(!key1_up)
{
LED1 = 0;
ps2char = 0x1c;
send_char();
delayms(10);
}
//else
{
LED1 = 1;
ps2char = 0xF0;
send_char();
delayms(10);
ps2char = 0x1c;
send_char();
}
}
}
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -