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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機驅動ps2鍵盤

[復制鏈接]
跳轉到指定樓層
樓主
ID:1092316 發表于 2024-4-6 09:09 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我只要簡單的功能,按下一個按鍵,執行一個功能,如按下9,P30輸出低電平。第二代碼報錯,第一個不會用。PS2讀電腦鍵盤實驗 數碼管顯示 只看樓主

*                 ID:487236 樓主
*                 2019-8-7 20:50 查看1538 回復0 收藏
*                 /****************************************************************************************
*                         PS2 讀電腦鍵盤實驗                              *
*                 連接方法 : P0口與J12連接 拔開跳線帽用杜邦線連接左針與P3.2右針與P1.6連接       *
*                 使用方法:用外部中斷讀取PS2鍵盤的數據 并在數碼管上顯示,此程序只處理數字鍵盤。    *
*                                                                            *
*                 其余按鍵功能用戶可以自行擴展,為了程序簡單便于閱讀和學習,程序中沒有使用奇偶校驗,    *
*                 校驗程序請自行添加。       *                                      *
*                                                                  *
*                 *****************************************************************************************/
*                 
*                 #include<reg52.h>   
*                 
*                 sbit LS138A=P2^2;
*                 sbit LS138B=P2^3;
*                 sbit LS138C=P2^4;
*                 
*                 sbit BEEP = P1^5;
*                 
*                 sbit Key_Data = P1^6 ; //定義鍵盤引腳
*                 sbit Key_CLK = P3^2; //使用外部中斷
*                 
*                 /******************************************************************/
*                 /*      函數聲明            */
*                 /******************************************************************/
*                 void Decode(unsigned char ScanCode);//解碼子程序
*                 void delay(unsigned int i);  //函數聲名
*                 void display();
*                 void beep();
*                 
*                 
*                 // 此表為 LED 的字模    // 0  1  2  3  4  5  6 7  8  9  A  b  c  d  E  -  L P  U  Hidden_ (20)
*                 unsigned char code Disp_Tab[] = { ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff,~0xf7 };
*                 bit BF;            
*                 unsigned char KeyV;
*                 unsigned char LedNumVal;
*                 int KEY_val,IntNum;
*                 
*                 /******************************************************************/
*                 /*      主函數            */
*                 /******************************************************************/
*                 void main()
*                 {
*                 
*                 IT1 = 0;          //設外部中斷1為低電平觸發
*                 EA = 1;           //外部中斷開
*                 EX0 = 1;          //開中斷
*                 
*                 while(1)
*                 {
*                  if (BF)
*                   {
*                   if (KeyV != 240)beep();
*                     
*                    Decode(KeyV);  //解碼
*                    
*                     }
*                   else
*                   EA = 1; //開中斷   
*                     display();
*                 }
*                 
*                 }
*                 
*                 /******************************************************************/
*                 /*      外部中斷讀入信息          */
*                 /******************************************************************/
*                 void Keyboard_out(void) interrupt 0
*                 {
*                 if ((IntNum > 0) && (IntNum < 9))
*                  {
*                   KeyV = KeyV >> 1;      //因鍵盤數據是低>>高,結合上一句所以右移一位
*                   if (Key_Data)
*                     KeyV = KeyV | 0x80;    //當鍵盤數據線為1時到最高位
*                   }
*                   IntNum++;
*                   while (!Key_CLK);      //等待PS/2CLK拉高
*                 
*                   if (IntNum > 10)
*                    {
*                      IntNum = 0;      //當中斷11次后表示一幀數據收完,清變量準備下一次接收
*                      BF = 1;        //標識有字符輸入完了
*                       EA = 0;        //關中斷等顯示完后再開中斷
*                       }
*                 
*                 }
*                 
*                 /******************************************************************/
*                 /*      解碼信息            */
*                 /******************************************************************/
*                 void Decode(unsigned char ScanCode) //注意:如SHIFT+G為12H 34H F0H 34H F0H 12H,也就是說shift的通碼+G的通碼+shift的斷碼+G的斷碼
*                 {
*                 
*                     switch (ScanCode)
*                         {
*                         case 0x70 :     // 當收到0xF0,Key_UP置1表示斷碼開始
*                           KEY_val = 0;
*                           break;
*                 
*                         case 0x69 :     
*                           KEY_val = 1;
*                           break;
*                 
*                         case 0x72 :     
*                           KEY_val = 2;
*                           break;
*                 
*                         case 0x7A :     
*                           KEY_val = 3;
*                           break;
*                 
*                         case 0x6B :     
*                           KEY_val = 4;
*                           break;
*                 
*                         case 0x73 :     
*                           KEY_val = 5;
*                           break;
*                 
*                         case 0x74 :     
*                           KEY_val = 6;
*                           break;
*                 
*                         case 0x6c :     
*                           KEY_val = 7;
*                           break;
*                 
*                         case 0x75 :     
*                           KEY_val = 8;
*                           break;
*                 
*                         case 0x7d :     
*                           KEY_val = 9;
*                           break;
*                 
*                        case 0x71 :
*                           
*                         //  dot = 0X7F;
*                           break;
*                  
*                   }
*                    
*                 
*                 BF = 0; //標識字符處理完了   
*                 }
*                 
*                 
*                 /***************************************************************************************/
*                 void display( )
*                 {
*                  unsigned char i;
*                  unsigned int LedOut[8];
*                 
*                  LedNumVal = KEY_val ;
*                 
*                    //顯示鍵值
*                    LedOut[0]=Disp_Tab[KeyV%10000/1000];
*                  LedOut[1]=Disp_Tab[KeyV%1000/100];
*                  LedOut[2]=Disp_Tab[KeyV%100/10];
*                  LedOut[3]=Disp_Tab[KeyV%10];
*                    
*                    //顯示對應的字符
*                    LedOut[4]=Disp_Tab[LedNumVal%10000/1000];   //千位
*                  LedOut[5]=Disp_Tab[LedNumVal%1000/100];//百位帶小數點
*                  LedOut[6]=Disp_Tab[LedNumVal%100/10];       //十位
*                  LedOut[7]=Disp_Tab[LedNumVal%10];     //個位
*                     
*                  
*                    for( i=0; i<8; i++)
*                    {   P0 = LedOut[i ];
*                        
*                     switch(i)              
*                      {   
*                         case 0:LS138A=0; LS138B=0; LS138C=0; break;   
*                       case 1:LS138A=1; LS138B=0; LS138C=0; break;      
*                       case 2:LS138A=0; LS138B=1; LS138C=0; break;
*                       case 3:LS138A=1; LS138B=1; LS138C=0; break;
*                         case 4:LS138A=0; LS138B=0; LS138C=1; break;
*                         case 5:LS138A=1; LS138B=0; LS138C=1; break;
*                         case 6:LS138A=0; LS138B=1; LS138C=1; break;
*                         case 7:LS138A=1; LS138B=1; LS138C=1; break;
*                        
*                      }
*                     
*                       delay(50);
*                     }
*                 
*                 }
*                 
*                 /***************************************************************************************
*                 延時程序                                                   *
*                 ****************************************************************************************/
*                 void delay(unsigned int i)
*                 {
*                   char j;
*                   for(i; i > 0; i--)
*                   for(j = 200; j > 0; j--);
*                 }
*                 
*                 /***************************************************************************************
*                 蜂鈴器發聲                                                   *
*                 ****************************************************************************************/
*                 void beep()
*                 {
*                 unsigned char i;
*                 for (i=0;i<255;i++)
*                  {
*                  delay(5);
*                  BEEP=!BEEP;     //BEEP取反
*                  }
*                 BEEP=1;        //關閉蜂鳴器
*                 }
*                 














單片機學習筆記(八)PS/2電腦鍵盤 只看樓主

*                 ID:108531 樓主
*                 2016-3-12 16:47 查看3765 回復1 收藏
PS/2鍵盤是一種編碼鍵盤,只需要一根數據線和一根時鐘線就可以完成數據的輸入。
實驗程序設計為,按鍵盤上的"J"鍵,繼電器閉合。
C語言源程序:
#include <reg52.h> //52單片機頭文件包含
#include <intrins.h>//常用移位函數頭文件包含
sbit key_data=P1^5; //定義鍵盤接口的數據腳
sbit key_clk=P3^2;//定義鍵盤接口的時鐘腳
sbit JDQ=P2^4; //定義繼電器連接引腳
bit BF=0; //定義位變量BF
unsigned char keyv=0; //定義無符號字符變量keyv并賦初值0
unsigned int intNum=0;//定義無符號整型變量intNum并賦初值0
unsigned char key_up=1;//定義無符號字符變量key_up并賦初值1
void ldedata(unsigned char scandata);//按鍵數據處理函數
void main() //主函數
{
    EA=1; //打開總中斷
    EX0=1;//打開0號中斷
    IT0=1;//中斷方式為下降沿觸發方式
    do{    //do-while循環
        if(BF)   //如果有鍵按下
            ldedata(keyv);//處理按鍵數據
        else
            EA=1;//否則打開中斷
    }while(1); //總為真不斷循環
}
void key_scan() interrupt 0  //中斷函數鍵盤輸入key_scan 中斷入口0
{
    if((intNum>0)&&(intNum<9))    //如果intNum>0并且intNum<9 就執行if里面的語句
    {
        keyv=keyv>>1;     //將字符變量keyv右移一位
        if(key_data)      //判斷key_data 是否為真 即是否有數據
            keyv=keyv|0x80;    //有就將keyv與0x80進行或運算再賦值給keyv
    }
    intNum++;//將intNum的值自加1
    while(!key_clk)//鍵值是否處理完
    if(intNum>10)//判斷intNum是否大于10
    {
        intNum=0;//將intNum賦值為0
        BF=1;//將BF賦值為1
        EA=0;//關閉總中斷
    }
}
void ldedata(unsigned char scandata) //鍵盤數據處理函數
{
    if(!key_up) //鍵盤松開時
    {
        switch(scandata){ //處理鍵盤數據
        case 0xf0://沒按下任何鍵
            key_up=1;//按下
            break;//跳出
        case 0x12://左邊SHIFT
            break;//跳出
        case 0x59://右邊SHIFT
            break;//跳出
        default://缺省處理
            P1=~scandata;//將按下的鍵碼輸出給P2口驅動燈亮,因發光二極采用共陽級,所以取反輸出
            if(scandata==0x3b)//當按下J鍵時
                JDQ=0;//打開繼電器
            if(scandata==0x29){//當按下空格鍵時
                JDQ=1;//關閉繼電器
            }
            break;//跳出
        }
    }
    else{ //否則
        key_up=0;//按鍵按下
        switch(scandata){//處理按鍵
        case 0x12://左邊SHIFT
            break;//跳出
        case 0x59://右邊SHIFT
            break;//跳出
        }    
    }
    BF=0;//標識字符表示處理完了
}
//實驗結果 按下鍵盤j鍵繼電器打開 按下空格鍵繼電器關閉



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

使用道具 舉報

沙發
ID:301191 發表于 2024-4-8 00:59 | 只看該作者
頂一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看国产网站 | 99精品视频一区二区三区 | 涩爱av一区二区三区 | 日本福利视频免费观看 | 91视视频在线观看入口直接观看 | 不卡在线视频 | 日韩在线电影 | 人人做人人澡人人爽欧美 | 成人av免费看 | av一级毛片| 日韩国产精品一区二区三区 | 国产精品色| 综合自拍 | 午夜视频在线观看一区二区 | 久久国产婷婷国产香蕉 | 一级欧美 | 天天看天天摸天天操 | 99热在线免费 | 久久久久久久av麻豆果冻 | av在线播放不卡 | www.精品国产 | 在线成人一区 | 一级黄色片免费在线观看 | 一区二区国产在线 | 久久久久久久久久久蜜桃 | 国产激情一区二区三区 | 国产日韩欧美 | 亚洲视频一区在线观看 | 男女羞羞视频在线 | 全部免费毛片在线播放网站 | 免费一二区 | 国产一区精品 | 97久久精品午夜一区二区 | 91亚洲国产精品 | 亚洲精品资源 | 免费在线观看h片 | 色欧美片视频在线观看 | 精品在线一区 | 国产精品国产三级国产aⅴ浪潮 | 一级毛片播放 | 国产高清视频在线观看 |