标题:
单片机3个IO做9个按键程序
[打印本页]
作者:
daming
时间:
2014-12-30 00:49
标题:
单片机3个IO做9个按键程序
#include<reg51.h>
//P0.0-P0.2
unsigned char leddata[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
0x88, //"A"
0x83, //"B"
0xC6, //"C"
0xA1, //"D"
0x86, //"E"
0x8E, //"F"
0x89, //"H"
0xC7, //"L"
0xC8, //"n"
0xC1, //"u"
0x8C, //"P"
0xA3, //"o"
0xBF, //"-"
0xFF, //熄灭
0xFF //自定义
};
unsigned char key;
void delay(unsigned char x)
{
unsigned char i;
while(x--)
for(i=0;i<115;i++);
}
void keyscan()
{
//------先扫描直接接地的3个按键-----//
P0|=0X07; //先将IO拉高
if(P0&0X01==0){
delay(15);
key=7;
return;
}
else if(P0&0x02==0){
delay(15);
key=8;
return;
}
else if(P0&0x04==0){
delay(15);
key=9;
return;
}
//------接着对逐一对IO口进行扫键-----//
P0|=0X07; //先将IO拉高,很重要
P0&=0XFE; //P0.0置0
if((P0&0X02)==0){
delay(15);
if((P0&0X02)==0){
P0|=0X07; //对地的按键优先级高,这里是为了防止误判
if((P0&0X07)==0X07)
key=1;
else
key=8;
return;
}
}
else if((P0&0X04)==0){
delay(15);
if((P0&0X04)==0){
P0|=0X07;
if((P0&0X07)==0X07)
key=2;
else
key=9;
return;
}
}
P0|=0X07;//先将IO拉高,很重要
P0&=0XFD;
if((P0&0X01)==0){
delay(15);
if((P0&0X01)==0){
P0|=0X07;
if((P0&0X07)==0X07)
key=3;
else
key=7;
return;
}
}
else if((P0&0X04)==0){
delay(15);
if((P0&0X04)==0){
P0|=0X07;
if((P0&0X07)==0X07)
key=4;
else
key=9;
return;
}
}
P0|=0X07; //先将IO拉高,很重要
P0&=0XFB;
if((P0&0X01)==0){
delay(15);
if((P0&0X01)==0){
P0|=0X07;
if((P0&0X07)==0X07)
key=5;
else
key=7;
return;
}
}
else if((P0&0X02)==0){
delay(15);
if((P0&0X02)==0){
P0|=0X07;
if((P0&0X07)==0X07)
key=6;
else
key=8;
return;
}
}
}
void main()
{
while(1){
keyscan();
P3=leddata[key];
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1