|
- /****************************************************************************************
- 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; //關閉蜂鳴器
- }
復制代碼
|
-
接線圖.jpg
(96.94 KB, 下載次數: 66)
下載附件
2019-8-7 20:50 上傳
讀取鍵盤值
-
PS2局部原理圖.jpg
(984.37 KB, 下載次數: 65)
下載附件
2019-8-7 20:51 上傳
-
-
PS2_數碼管顯示.rar
2019-8-7 20:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
22.51 KB, 下載次數: 16, 下載積分: 黑幣 -5
-
-
PS2知識.doc
2019-8-7 20:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
42.5 KB, 下載次數: 14, 下載積分: 黑幣 -5
|