?? keyborad.c
字號:
#include <REGX51.H>
#include <absacc.h>
#include <Key.h>
#define uchar unsigned char
#define CTRL XBYTE[0x0100] /*控制字地址*/
#define PA XBYTE[0x0101] /*PA口地址*/
#define PB XBYTE[0x0102] /*PB口地址*/
#define PC XBYTE[0x0103] /*PC口地址*/
code uchar cod[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//字段碼
uchar keyscan(void)
{
code uchar keycod[16]={0,0,0,0,
0,0,0,1, //算法為:retVal=keycod[x]*4+keycod[y]
0,0,0,2,
0,3,4,0};
uchar x,y,retVal;
PB=0x0f; //低四位 高四位輸出0
x=PB&0x0f; //PB輸入后清高四位,作為X值
PB=0xf0; //高四位 低四位輸出0
y=(PB>>4)&0x0f; //PB輸入后移位到低四位,并清高四位
retVal=keycod[x]*4+keycod[y]; //根據公式倒算鍵盤編碼
if(retVal==0) return(0);
else return(retVal-4);
}
void timer0int(void) interrupt 1
{
static uchar sts=0 ;
TL0=-20000; //方式1為軟件重載
TH0=(-20000)>>8; //右移8位,實際上是取高8位
PB=0x00; //輸入引腳為高電平
switch(sts)
{
case 0:if(keyscan()!=0) sts=1;break; //按鍵則進入狀態1
case 1:
if(keyscan()==0) sts=0; //假按錯,或干擾,回狀態0
else{sts=2;keyPut(keyscan);} //確按鍵,鍵值進入隊列,并轉狀態2
break;
case 2:if(keyscan()==0) sts=3;break; //如果松鍵則轉狀態3
case 3:
if(keyscan()!=0) sts=2; //假松鍵回狀態2
else sts=0; //真松鍵,回狀態0,等待下一次按鍵過程
}
}
main()
{
//uchar i;
CTRL=0x0d; //控制口,AC均為輸出,B為輸入
TMOD=(TMOD&0xf0)|0x01;
TL0=-20000;
TH0=(-20000)>>8;
TR0=1; //允許T0開始計數
ET0=1; //允許T0記計數溢出時產生中斷
EA=1; //允許cpu響應中斷
while(1)
{
if(keyHit()!=0) // 如果隊列中有按鍵
//PA=1; // 段碼輸出
PC=cod[keyGet()]; //從隊列中取出按鍵值并且顯示在數碼管上
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -