久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2378|回復: 5
打印 上一主題 下一主題
收起左側

關于單片機模擬鍵盤初始化的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:305998 發表于 2018-4-24 14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
剛開始學習PS2協議,寫了PS2設備發送到PC的函數,和PS2設備接收PC的函數, 但是在開機自檢的時候出了問題,我認為是接收函數 可能寫錯了。然后我用串口監測接收,按理來說我按下cap鍵,設備應該會接收到PC發送過來的命令吧,但是卻沒有。所有想請大佬幫我看下,哪里出錯了

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:305998 發表于 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);

       
               
               


               
        }  

}
回復

使用道具 舉報

板凳
ID:305998 發表于 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();
       
}

回復

使用道具 舉報

地板
ID:305998 發表于 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;
        }
回復

使用道具 舉報

5#
ID:305998 發表于 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;
}
回復

使用道具 舉報

6#
ID:305998 發表于 2018-4-25 08:09 | 只看該作者
有沒有大神能解答下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕精品视频 | 日本在线免费看最新的电影 | 午夜久久久久久久久久一区二区 | 91电影 | 久久久久久久一区二区三区 | 91天堂网| 免费看片在线播放 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 国产综合久久久久久鬼色 | 精品自拍视频在线观看 | 狠狠草视频 | 91成人小视频 | 中文字幕一区在线观看视频 | 国产成人精品久久二区二区91 | 亚洲三区在线观看 | 777毛片| 国产欧美精品一区 | 久久久www成人免费精品 | 综合久久亚洲 | 偷拍第一页 | 亚洲福利精品 | 国产精品久久7777777 | 91观看| 中文字幕在线视频一区二区三区 | 天天看逼 | 欧美一二三区 | 久久91精品 | 精品一区二区三区中文字幕 | 日日干日日操 | 欧美中文字幕一区二区三区亚洲 | 一级h片| 精品国产一区二区三区性色 | 一区二区三区四区国产 | 看一级毛片视频 | 欧美一级片免费看 | 亚洲97| 欧美激情在线精品一区二区三区 | 嫩草伊人 | 91视频久久久久 | av电影手机版 | 一区二区三区亚洲 |