51C矩阵键盘控制电机程序

// 程序清单 3 2
// 矩阵键盘扫描管理程序
// 假设key_port口的高四位输出4个行选择信号,低四位用来获取4列按键状态。

#include
#define uchar unsigned char
#define uint unsigned int
#define key_port P3
void delay(uint c)
{
uint a;
while(c--)
for(a=0;a<125;a++)

{;}
}

unsigned char keycode[16]={12,13,14,15,
10,7,4,1,
0,8,5,2,
11,9,6,3
};
//unsigned char LED_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
uchar code init_password[4]={1,2,3,4};//内部初始密码
uchar code zheng[]={0xf9,0xf5,0xf6,0xfa};
uchar code fan[]={0xfa,0xf6,0xf5,0xf9};
uchar password_buf[4]={0xff,0xff,0xff,0xff};//密码输入存入区
uchar disp_buf[4]={0xbf,0xbf,0xbf,0xbf}; //显示缓冲区,初始显示“-”
uchar count=0; //密码输入位计数
uchar flag=0xff; //密码输入正确标志,为1正确,为0错误
uchar error_count=0;//密码输入错误计数
void display(uchar *p);
void beep_on_off(bit on_off);
void subDelay( uint x );
void password_compare();

//////////////////////////////////
void beep_on_off(bit on_off)
{uchar i;
if(on_off==1)
{P1_0=0;
for(i=0;i<2;i++)
{display(disp_buf);} //
//subDelay(1000);
P1_0=1;
}
else
P1_0=1;

}
///////////////////////////////////////////////////
void subDelay( uint x )
{ // 延时函数
while( x-- );
}
////////////////////////////////////
char subMatrixScan( )
{
unsigned char lcKeyTemp, i;
unsigned char lcRowSel = 0xf7; // 4个输出行分别输出0的选择码

key_port = 0xF0;
lcKeyTemp = key_port;
//subDelay( 200 );// 延时,消除抖动
for(i=0;i<8;i++)
{display(disp_buf);}//延时,消除抖动
if ( (key_port ==0xF0) || (key_port != lcKeyTemp) )
{
return (16); // 无按键或未稳定,返回空键码,随后再来
}
beep_on_off(1); //按键声音
for (i=0; i<4; ++i)
{
key_port = lcRowSel | 0xF0; // 检查各行有无按键

switch (key_port & 0xF0)
{ // 获取4列按键状态
case 0xE0:
lcKeyTemp = 0; break; // 仅第1列有按键
case 0xD0:
lcKeyTemp = 1; break; // 仅第2列有按键
case 0xB0:
lcKeyTemp = 2; break; // 仅第3列有按键
case 0x70:
lcKeyTemp = 3; break; // 仅第4列有按键
default:
lcKeyTemp = 16;break; // 无按键或多按键
}
if ( lcKeyTemp != 16 )
{
lcKeyTemp += i<<2;
break;
}
lcRowSel >>= 1; // 右移1位,选择下一行
}
for(i=0;i<8;i++)
{display(disp_buf);}//延时,消除抖动
return (lcKeyTemp); // 返回按键状态
}
//////////////////////////////
void display(uchar *p)
{uchar i,temp=0x7f;
for(i=0;i<4;i++)
{P0=p[i];
P2=temp;
subDelay( 250 );
temp=temp>>1|temp<<7;
}
}
void disp_input(uchar s)
{uchar i;
for(i=0;i<4;i++)
disp_buf[i]=s;
}
////////////////////////////////
void enter_password()
{uns

igned char key_val=0xff;uchar i;
key_val=subMatrixScan( );
key_val=keycode[key_val];
if(key_val<10) //数字键0-9按下
{if(count<4)
{password_buf[count]=key_val;
disp_buf[count]=0x88;//输出显示"A"
count++;
}
}
else if(key_val==10) //确认键按下
{password_compare();}
else if(key_val==11) //重新开始输入
{count=0;
for(i=0;i<4;i++)
password_buf[i]=0xff;
disp_input(0xbf); //输出显示“-”
}
else if(key_val==12) //删除键按下
{if(count>0)
{count--;
password_buf[count]=0xff;
disp_buf[count]=0xbf; //输出显示“-”
}
}
}
////////////////////////////////////////
void password_compare()
{
if(password_buf[0]==init_password[0]&&password_buf[1]==init_password[1]&&password_buf[2]==init_password[2]&&password_buf[3]==init_password[3])
{flag=1;
TR0=1;}
else
{flag=0;

error_count++;
}
count=0;
}
///////////////////////////////
void open_or_close()
{uint i;
if(flag==1)
{P1_1=0;
disp_input(0xbf); //输出显示“-"
for(i=0;i<250;i++)
display(disp_buf);
P1_1=1;
flag=0xff;
}
else if(flag==0)
{
if(error_count==3)
{error_count=0;
P1_0=0;
disp_input(0xbf); //输出显示“-"
for(i=0;i<500;i++)
display(disp_buf);
P1_0=1;
}
else
disp_input(0xbf); //输出显示“-"
flag=0xff;
}
}
void main()
{key_port=0xff;
P2=0xff;
TMOD=0X01;
TH1=0xd8;
TL1=0xf0;
EA=1;
ET0=1;
while(1)
{enter_password();
display(disp_buf);
open_or_close();

}
}


void dianji() interrupt 1
{uchar i;
uchar j;
uchar k;
uchar l;
uchar m;
uchar n;
TH1=0xd8;
TL1=0xf0;
TR0=0;
for(k=0;k<2;k++)
{for(j=0;j<240;j++)
{
for(i=0;i<4;i++)
{ P1=zheng[i];
subDelay( 400 );
}
}
}
subDelay( 60000 );
delay(2000);
for(l=0;l<2;l++)
{for(m=0;m<240;m++)
{
for(n=0;n<4;n++)
{P1=fan[n];
subDelay( 400 );
}
}
}
}





















相关文档
最新文档