文档库 最新最全的文档下载
当前位置:文档库 › 51单片机4x4矩阵键盘

51单片机4x4矩阵键盘

程序功能说明:4×4键盘按键识别,并显示键值
*/
#include
#define uchar unsigned char
#define sk P1
#define bit_select P0
sbit ds=P2^5;
sbit st=P2^6;
sbit sh=P2^7;
bit flag; /*定义位变量,标志是否有键按下*/
uchar key; /*定义全局变量,存放键值*/
uchar s[4]={0xfe,0xfd,0xfb,0xf7}; /*行扫描码*/
uchar code seg7[16]={0x3f,0x06,0x5b,0x4f, /*数码管段码表,0~9,A~F*/
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
//****************************************************************************//
//函数名称:delay()
//函数功能:实现可变时间延时
//入口参数: t
//****************************************************************************//
delay(uchar t)
{
uchar i=250,j;
for(j=t;j>0;j++) /*延时t*0.5ms(不精确)*/
while(--i); /*延时0.5ms*/

}

//*****************************************************************************//
//函数名称:scan_key()
//函数功能:扫描键盘,是否有键按下
//出口参数:flag,是否有键按下。有,flag=1,没有,flag=0
//*****************************************************************************//

bit scan_key()
{
uchar i,j,k_row,k_colum,inpt;
flag=0;
for(i=0;i<4;i++)
{
sk=s[i]; /*送行扫描码*/
inpt=sk; /*读列*/
inpt=inpt>>4; /*右移4位*/
inpt=inpt|0xf0;
for(j=0;j<4;j++)
if(inpt==s[j])
{
delay(20); /*延时消抖*/
if(inpt==s[j])
{
flag=1; /*有键按下,置flag为1,并记下所按键的行列号*/
k_row=i;
k_colum=j;
break;
}
}
if(flag)
break;
}
if(!flag)
return 0; /*无键按下,则返回0*/
else
{
key=k_row*4+k_colum; /*有键按下,则计算键值,返回1*/
return 1;
}
}

//*****************************************************************************//
//函数名称:disp()
//函数功能:在数码管上显示数字0~9,A~F
//入口参数: k——要显示的数据,n——用于显示的数码管的位置
//出口参数:无
//*****************************************************************************//

disp(uchar k,uchar n)
{
uchar b[8]={0xfe,0xfd,0xfb,0xf7, /*8只数码管的位选码*/
0xef,0xdf,0xbf,0x7f};
uchar i,ch;
ch=k;
for(i=0;i<8;i++) /*送8位数到595的数据输入端DS*/
{
sh=0;
ds=ch&0x80; /*发送数据的最高位*/
ch<<=1; /*左移一位,为下一位数据的传送做准备*/
sh=1; /*将8位数依次移入移位寄存器*/
}
st=0; /*将移位寄存器中的数移入存储寄存器并输出*/
st=1;
bit_select=b[n]; /*数码管位选线

有效*/
}

//***************************************************************************//
//函数名称:main()
//函数功能:主函数
//***************************************************************************//

main()
{
uchar m;
disp(0x00,0); /*初始化数码管不显示*/
while(1)
{
scan_key(); /*调用扫描键盘子程序*/
m=seg7[key]; /*将键值转化为7段码 */
if(flag) /*若有新键(flag为1)按下,则将其显示*/
disp(m,0);
}
}

相关文档
相关文档 最新文档