新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 課程設(shè)計(jì):矩陣鍵盤(pán)(c51,使用掃描法實(shí)現(xiàn))

課程設(shè)計(jì):矩陣鍵盤(pán)(c51,使用掃描法實(shí)現(xiàn))

作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
//可以比較一下和以前發(fā)表的一篇用反轉(zhuǎn)法實(shí)現(xiàn)的不同(感覺(jué)一下那個(gè)更簡(jiǎn)單)

//這種方法是用只用P3口的前高四位來(lái)比較,看改變了么(由于比較倉(cāng)促,沒(méi)有proteus仿真,不過(guò)這是個(gè)比較經(jīng)典的方法,網(wǎng)上有很多這個(gè)代碼,源自郭天祥的視頻和書(shū)籍)

本文引用地址:http://butianyuan.cn/article/201611/315828.htm

#include

#define uchar unsigned char

#define uint unsigned int

sbit wela=P2^7;

sbit dula=P2^6;

uchar num,num1;

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,

0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(uint xms)

{

uint x,y;

for(x=xms;x>0;x--)

for(y=111;y>0;y--);

}

void display(uchar num)

{

dula=1;

P1=table[num];

dula=0;

//delay(10);

}

void matrixkeyscan()

{

uchar temp,key;

P3=0xfe;//第一行

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:

key=0;

break;

case 0xde:

key=1;

break;

case 0xbe:

key=2;

break;

case 0x7e:

key=3;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xfd;//第二行

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:

key=4;

break;

case 0xdd:

key=5;

break;

case 0xbd:

key=6;

break;

case 0x7d:

key=7;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xfb;//第三行

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:

key=8;

break;

case 0xdb:

key=9;

break;

case 0xbb:

key=10;

break;

case 0x7b:

key=11;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xf7;//第四行

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xe7:

key=12;

break;

case 0xd7:

key=13;

break;

case 0xb7:

key=14;

break;

case 0x77:

key=15;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

}

void main()

{

dula=0;

wela=1;

P1=0x00;

wela=0;

//dula=0;

while(1)

{//dula=0;

matrixkeyscan();

}

}



評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉