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

標(biāo)題: 關(guān)于單片機(jī)模擬鍵盤初始化的問題 [打印本頁]

作者: yzcook    時(shí)間: 2018-4-24 14:52
標(biāo)題: 關(guān)于單片機(jī)模擬鍵盤初始化的問題
剛開始學(xué)習(xí)PS2協(xié)議,寫了PS2設(shè)備發(fā)送到PC的函數(shù),和PS2設(shè)備接收PC的函數(shù), 但是在開機(jī)自檢的時(shí)候出了問題,我認(rèn)為是接收函數(shù) 可能寫錯(cuò)了。然后我用串口監(jiān)測接收,按理來說我按下cap鍵,設(shè)備應(yīng)該會(huì)接收到PC發(fā)送過來的命令吧,但是卻沒有。所有想請(qǐng)大佬幫我看下,哪里出錯(cuò)了

作者: yzcook    時(shí)間: 2018-4-24 14:54
這是我的主函數(shù)

#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    時(shí)間: 2018-4-24 14:54
這是我的發(fā)送函數(shù)
發(fā)送應(yīng)該是沒有問題的
因?yàn)槲野l(fā)送0x58 能實(shí)現(xiàn)讓燈亮



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;                          //奇效驗(yàn),找出發(fā)送的數(shù)據(jù)中1的個(gè)數(shù),如果為偶數(shù),則置標(biāo)志位為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的下降沿讀取數(shù)據(jù),起始位
                                Delay20us();
                                PS2_CLK = 0;
                                Delay40us();
       
                                for (i=0; i<8;i++) //發(fā)送數(shù)據(jù)位
                                {
                                        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; //發(fā)送奇校驗(yàn)
                                        Delay20us();
                                        PS2_CLK = 0;
                                        Delay40us();                               

                                        PS2_CLK = 1;
                                        Delay20us();                                       
                                        PS2_DAT = 1; // 發(fā)送停止位
                                        Delay20us();
                                        PS2_CLK = 0;
                                        Delay40us();
       
                                        PS2_CLK = 1;

                        }
                }

         Delay50us();
       
}


作者: yzcook    時(shí)間: 2018-4-24 14:55
這是我的接收函數(shù)
感覺在這里出了問題



unsigned char ps2_rec( )//返回接收到的字節(jié),接收錯(cuò)誤則返回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應(yīng)該為低        如果此時(shí)PS2_DAT為高,則退出并發(fā)送錯(cuò)誤狀態(tài)字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)        //每讀完一個(gè)位都檢測時(shí)鐘線是否被拉低
                                {
                                                ps2_send(0xfe);      
                                                return 0;            
                                }
//======================================================                       
                        Delay20us();
                        PS2_CLK = 0;
                        Delay40us();
                        PS2_CLK = 1;       
                        Delay20us();
                        PARITY = PS2_DAT;
                        if(!PS2_CLK)        //每讀完一個(gè)位都檢測時(shí)鐘線是否被拉低
                                {
                                                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)//接收停止位,此時(shí)PS2_DAT應(yīng)該為高,否則發(fā)送0xfe報(bào)錯(cuò)
                        {
                                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)            //進(jìn)行奇校驗(yàn)            
        {
//                                        ps2_send(0xfe);
          return 0;
        }
//                        SendStr("0x33");
                Delay40us();
                Delay5us();
        }
//        SendByte(0X30+temp);
        return temp;
        }
作者: yzcook    時(shí)間: 2018-4-24 14:56
這是命令處理函數(shù)


unsigned char receive_process()
{
  unsigned char  command,led_rec;
//  if(!KB_START())  return;//如果當(dāng)前的PS2_CLK和PS2_DAT不都為低,表明沒有命令
        command = ps2_rec();
//        SendStr("pass");
        switch(command)
        {
                case 0xff:   //復(fù)位命令
                        ps2_send(0xfa);
                        delay_ms(50);
                  ps2_send(0xaa); //自檢通過返回0xaa
                                                                //執(zhí)行復(fù)位
                break;
                case 0xfe:
                        ps2_send(0xfa);
                        ps2_send(last_s);                                        //發(fā)送上一次的命令
                        break;
                case 0xf6:  //設(shè)置缺省值
                        ps2_send(0xfa);
                       
                break;
                case 0xf5:  //設(shè)置缺省值和停止鍵盤 ,等待進(jìn)一步命令
                        ps2_send(0xfa);
               
               
                break;
                case 0xf4:  //重新使能鍵盤
                        ps2_send(0xfa);  
               
               
                break;
                case 0xf3:        //設(shè)置機(jī)打速率和延遲
                        ps2_send(0xfa);
                       
               
                break;
                case 0xee://回應(yīng)命令
                        ps2_send(0xee);
               
                case 0xed: //指示燈參數(shù)
                        ps2_send(0xfa);                               
                        led_rec = ps2_rec();
                        SendByte(led_rec);
                        ps2_send(0xfa);               
                break;
                default:
                        ps2_send(0xfa); //對(duì)于其他命令發(fā)送完成標(biāo)志
                break;
                       
               
        }
        return command;
}
作者: yzcook    時(shí)間: 2018-4-25 08:09
有沒有大神能解答下




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩欧美国产精品一区二区三区 | 一级高清视频 | 超碰人人人人 | 久久久精彩视频 | 美女亚洲一区 | av资源中文在线天堂 | 精品国产欧美 | 日韩精品极品视频在线观看免费 | 91新视频| 青青久久av北条麻妃海外网 | 国产精品免费一区二区三区 | 成人伊人 | 中文字幕在线观看国产 | 亚洲国产精品一区二区久久 | 日韩一二区 | 99草免费视频 | 毛片入口 | 国产乱码精品1区2区3区 | 国产日韩久久久久69影院 | 日韩av在线一区 | 91成人在线 | 国产高清一区二区三区 | 午夜网 | 天堂成人国产精品一区 | www视频在线观看 | 亚洲欧洲色视频 | 午夜不卡福利视频 | 亚洲精品麻豆 | 欧美精品乱码久久久久久按摩 | 毛片免费在线 | 免费在线成人 | 在线观看国产精品一区二区 | 国产一区电影 | 国产91黄色 | 中文字幕日韩欧美一区二区三区 | 蜜桃五月天| 亚洲国产成人精品女人久久久 | 亚洲国产精品久久久久秋霞不卡 | 日韩欧美一区二区三区免费观看 | 欧美午夜一区二区三区免费大片 | 成人免费看黄网站在线观看 |