?? keyborad2.c
字號(hào):
#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]; //根據(jù)公式倒算鍵盤(pán)編碼
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位,實(shí)際上是取高8位
PB=0x00; //輸入引腳為高電平
switch(sts)
{
case 0:if(keyscan()!=0) sts=1;break; //按鍵則進(jìn)入狀態(tài)1
case 1:
if(keyscan()==0) sts=0; //假按錯(cuò),或干擾,回狀態(tài)0
else{sts=2;keyPut(keyscan);} //確按鍵,鍵值進(jìn)入隊(duì)列,并轉(zhuǎn)狀態(tài)2
break;
case 2:if(keyscan()==0) sts=3;break; //如果松鍵則轉(zhuǎn)狀態(tài)3
case 3:
if(keyscan()!=0) sts=2; //假松鍵回狀態(tài)2
else sts=0; //真松鍵,回狀態(tài)0,等待下一次按鍵過(guò)程
}
}
main()
{
//uchar i;
CTRL=0x0d; //控制口,AC均為輸出,B為輸入
TMOD=(TMOD&0xf0)|0x01;
TL0=-20000;
TH0=(-20000)>>8;
TR0=1; //允許T0開(kāi)始計(jì)數(shù)
ET0=1; //允許T0記計(jì)數(shù)溢出時(shí)產(chǎn)生中斷
EA=1; //允許cpu響應(yīng)中斷
while(1)
{
if(keyHit()!=0) // 如果隊(duì)列中有按鍵
//PA=1; // 段碼輸出
PC=cod[keyGet()]; //從隊(duì)列中取出按鍵值并且顯示在數(shù)碼管上
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -