亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛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