?? 51
字號(hào):
//-----------------------函數(shù)聲明,變量定義---------------------------
#include <reg51.h> //頭文件
#include <absacc.h> //XBYTE 宏定義
#define uchar unsigned char//類型定義
#define uint unsigned int //類型定義
#define com XBYTE[0x7f00] //8155命令狀態(tài)寄存器地址
#define pa XBYTE[0x7f01] //8155的A口地址
#define pb XBYTE[0x7f02] //8155的B口地址
#define pc XBYTE[0x7f03] //8155的C口地址
#define LED1 P1 //鍵號(hào)十位顯示數(shù)碼管驅(qū)動(dòng)口
#define LED2 P2 //鍵號(hào)個(gè)位顯示數(shù)碼管驅(qū)動(dòng)口
sbit iom=P1^7; //8155的I/O與RAM選擇端口
const uchar tab[]={ //7段共陽(yáng)極數(shù)碼管的段選碼表
0xc0,0xf9,0x24,0x30, //0~3
0x19,0x12,0x02,0x78, //4~7
0x00,0x18,0x08,0x03, //8~b
0x46,0x21,0x06,0x0e, //c~f
0x7f // 數(shù)碼管滅
};
//-----------------------函數(shù)聲明------------------------------------
bit press(void); //判斷是否有鍵按下,有返回1,沒(méi)有返回0
uchar read(void); //掃描鍵盤(pán),返回鍵值
uchar show(uchar row); //顯示鍵號(hào)
void delay_50us(uint m); //延時(shí)子程序
//****************************//
main()
{
uchar row3;
iom=1; //8155的IO定義
com=0x0c; //8155 C口設(shè)置為輸出口,A口設(shè)置為輸入口
while(1)
{
row3=read(); //讀按鍵號(hào)
show(row3); //顯示鍵號(hào)
while(press()); //等待鍵釋放
delay_50us(50); //延時(shí),防止數(shù)碼管閃爍
}
}
bit press(void)
{
uchar hang;
pc=0x00; //4行輸出全‘0’
hang=pa; //讀A口數(shù)據(jù) 列號(hào)
if(hang!=0xff) //看是否不全為高電平
return(1); //有低電平時(shí),表示有鍵按下,返回1
else
return(0); //全為高電平時(shí),表示無(wú)鍵按下,返回0
}
uchar read(void)
{
uint t;
uchar hang,lie,keyscan,j,value;
value=0x00;
if(press()==1)
{
delay_50us(200); //延時(shí)去抖
if(press()==1)
{
hang=0xfe; //輸出監(jiān)測(cè)行號(hào)賦初值,監(jiān)測(cè)第1行
//****************逐行掃描開(kāi)始****************//
for(t=0;t<4;t++) //逐行監(jiān)測(cè)循環(huán)
{
pc=hang; //輸出行監(jiān)測(cè)碼
lie=pa; //讀列號(hào)段碼,有鍵按下的位為0
if(lie!=0xff) //如果不為全1,表示該行有鍵按下
//****************計(jì)算鍵號(hào)開(kāi)始****************//
for(j=0;j<8;j++) //看是8列中的哪列有鍵按下
{
if((lie&0x01)!=0x01) //是第j列嗎
{ //是
keyscan=j+value; //列號(hào)+行號(hào)×8=鍵號(hào)
return(keyscan); //返回鍵號(hào)
}
else //不是
{
lie>>=1; //列段碼右移,繼續(xù)監(jiān)測(cè)最低位
}
}
//****************計(jì)算鍵號(hào)結(jié)束****************//
else //否則,該行無(wú)鍵按下準(zhǔn)備監(jiān)測(cè)下一行
{
hang=(hang<<1)|0x01; //行監(jiān)測(cè)碼左移
value+=0x08; //每監(jiān)測(cè)一行無(wú)鍵按下時(shí),鍵號(hào)加8
}
}
//****************逐行掃描結(jié)束****************//
}
return(0xff);
}
return(0xff); //無(wú)鍵按下時(shí),返回FFH
}
uchar show(uchar row)
{
uchar row1,row2;
if(row==0xff) //無(wú)鍵按下時(shí)
{
LED1=tab[16]; //2個(gè)數(shù)碼管滅
LED2=tab[16];
}
else
{ //有鍵按下
row1=row/10; // 16進(jìn)制鍵號(hào)除以10,得十位
row2=row%10; // 16進(jìn)制鍵號(hào)對(duì)10求余數(shù),得個(gè)位
LED1=tab[row1]; //顯示十位
LED2=tab[row2]; //顯示個(gè)位
}
}
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -