亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
關于單片機模擬鍵盤初始化的問題
[打印本頁]
作者:
yzcook
時間:
2018-4-24 14:52
標題:
關于單片機模擬鍵盤初始化的問題
剛開始學習PS2協議,寫了PS2設備發送到PC的函數,和PS2設備接收PC的函數, 但是在開機自檢的時候出了問題,我認為是接收函數 可能寫錯了。然后我用串口監測接收,按理來說我按下cap鍵,設備應該會接收到PC發送過來的命令吧,但是卻沒有。所有想請大佬幫我看下,哪里出錯了
作者:
yzcook
時間:
2018-4-24 14:54
這是我的主函數
#include <reg51.h>
#include "ps2.h"
#include "delay.h"
#include "usart.h"
#include "key.h"
#include<intrins.h>
sbit BEEP = P1^7;
void main ( )
{
ConfigUART(9600);
while(1)
{
ps2_rec();
receive_process();//處理PC命令
// delay_ms(5000);
}
}
作者:
yzcook
時間:
2018-4-24 14:54
這是我的發送函數
發送應該是沒有問題的
因為我發送0x58 能實現讓燈亮
void ps2_send(unsigned char value)
{
unsigned char i;
unsigned char char_temp,temp;
unsigned char PARITY = 1 ;
temp = value;
last_s = value;
for(i=0;i<8;i++)
{
char_temp = temp&0x01; //奇效驗,找出發送的數據中1的個數,如果為偶數,則置標志位為1,反之為0
if(char_temp == 0x01)
{
PARITY = !PARITY;
}
temp = temp>>1;
}
PS2_CLK = 1;
PS2_DAT = 1;
while(!PS2_CLK) //等待clock為高
{
PS2_CLK = 1;
PS2_DAT = 1;
Delay50us();
}
PS2_CLK = 1;
PS2_DAT = 1;
if(PS2_CLK)
{
if(PS2_DAT)
{
PS2_DAT = 0; //PC在PS2_CLK的下降沿讀取數據,起始位
Delay20us();
PS2_CLK = 0;
Delay40us();
for (i=0; i<8;i++) //發送數據位
{
PS2_CLK = 1;
Delay20us();
char_temp = value&0x01;
if(char_temp == 0x01)
PS2_DAT = 1;
else
PS2_DAT = 0;
char_temp = 0;
Delay20us();
PS2_CLK = 0;
Delay40us();
value = value>>1;
}
PS2_CLK = 1;
Delay20us();
PS2_DAT = PARITY; //發送奇校驗
Delay20us();
PS2_CLK = 0;
Delay40us();
PS2_CLK = 1;
Delay20us();
PS2_DAT = 1; // 發送停止位
Delay20us();
PS2_CLK = 0;
Delay40us();
PS2_CLK = 1;
}
}
Delay50us();
}
作者:
yzcook
時間:
2018-4-24 14:55
這是我的接收函數
感覺在這里出了問題
unsigned char ps2_rec( )//返回接收到的字節,接收錯誤則返回0
{
unsigned char i,STOPBIT;
unsigned char PARITY,temp ;
PS2_CLK = 1;
PS2_DAT = 1;
Delay100us();
PS2_DAT = 0;
PS2_CLK = 1;
if (PS2_DAT)//PS2_DAT應該為低 如果此時PS2_DAT為高,則退出并發送錯誤狀態字0xfe
{
ps2_send(0xfe);
return 0;
}
else
{
Delay40us();
for(i=0;i<8;i++)
{
Delay20us();
PS2_CLK = 0;
Delay40us();
PS2_CLK = 1;
Delay20us();
temp = temp>>1;
if(PS2_DAT)
{
temp |=0x80;
}
}
// SendByte(0X30+temp);
// delay_ms(3000);
if(!PS2_CLK) //每讀完一個位都檢測時鐘線是否被拉低
{
ps2_send(0xfe);
return 0;
}
//======================================================
Delay20us();
PS2_CLK = 0;
Delay40us();
PS2_CLK = 1;
Delay20us();
PARITY = PS2_DAT;
if(!PS2_CLK) //每讀完一個位都檢測時鐘線是否被拉低
{
ps2_send(0xfe);
return 0;
}
// SendByte(0x30+PARITY);
// SendStr("4");
//======================================================
Delay20us();
PS2_CLK = 0;
Delay40us();
PS2_CLK = 1;
Delay20us();
STOPBIT = PS2_DAT;
if(!PS2_CLK)//接收停止位,此時PS2_DAT應該為高,否則發送0xfe報錯
{
ps2_send(0xfe);
return 0;
}
//======================================================
Delay15us();
PS2_DAT = 0;
Delay5us();
PS2_CLK = 0;
Delay40us();
PS2_CLK = 1;
Delay5us();
PS2_DAT = 1;
ACC = temp;
SendByte(P);
if(P == PARITY) //進行奇校驗
{
// ps2_send(0xfe);
return 0;
}
// SendStr("0x33");
Delay40us();
Delay5us();
}
// SendByte(0X30+temp);
return temp;
}
作者:
yzcook
時間:
2018-4-24 14:56
這是命令處理函數
unsigned char receive_process()
{
unsigned char command,led_rec;
// if(!KB_START()) return;//如果當前的PS2_CLK和PS2_DAT不都為低,表明沒有命令
command = ps2_rec();
// SendStr("pass");
switch(command)
{
case 0xff: //復位命令
ps2_send(0xfa);
delay_ms(50);
ps2_send(0xaa); //自檢通過返回0xaa
//執行復位
break;
case 0xfe:
ps2_send(0xfa);
ps2_send(last_s); //發送上一次的命令
break;
case 0xf6: //設置缺省值
ps2_send(0xfa);
break;
case 0xf5: //設置缺省值和停止鍵盤 ,等待進一步命令
ps2_send(0xfa);
break;
case 0xf4: //重新使能鍵盤
ps2_send(0xfa);
break;
case 0xf3: //設置機打速率和延遲
ps2_send(0xfa);
break;
case 0xee://回應命令
ps2_send(0xee);
case 0xed: //指示燈參數
ps2_send(0xfa);
led_rec = ps2_rec();
SendByte(led_rec);
ps2_send(0xfa);
break;
default:
ps2_send(0xfa); //對于其他命令發送完成標志
break;
}
return command;
}
作者:
yzcook
時間:
2018-4-25 08:09
有沒有大神能解答下
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1