您的位置 首页 芯闻

STC89C52单片机矩阵键盘试验

实现功能:完成独立按键的测试,当key5-key20这二十个按

///////////////////////////////////////////////////////////////////////////

完结功用: 完结独立按键的测验,当key5-key20这二十个按键中,有一个按下时,
则在开发板的榜首个数码管上会显现详细的数值,显现的数值是这样
界说的,key5按下时,显现0,key6按下时显现2,然后顺次这样类推,
到达按下去相应的值显现相应数值的功用
试验板类型:BS-XYD-C52
试验称号: 静态数码管
编写人: 谢应东
编写日期: 2012-4-26
///////////////////////////////////////////////////////////////////////////

#include
#include

#define uchar unsigned char //界说unsigned char 为 uchar
#define uint unsigned int

sbit Duan=P2^6;//界说数码管的段选使能端
sbit Wei =P2^7; //界说数码管的位选使能端

#define Digital_tube_Wei_Enable Wei=1;//敞开操控数码管的位选使能端
#define Digital_tube_Wei_Disable Wei=0; //封闭操控数码管的位选使能端

#define Digital_tube_Duan_Enable Duan=1;//敞开操控数码管的段选使能端
#define Digital_tube_Duan_Disable Duan=0;//封闭操控数码管的段选使能端

#define Digital_tube_Duan P0 //界说数码管数据端口

#define KEY_DOWN 0
#define Keyport P3

uchar code Dis_table[]= //将BCD码转换成数码管扫描码的数组
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71};
uchar code Dis_Position[]=//界说数码管位选的数组
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
///////////////////////////////////////////////////////////////////////////
函数称号:毫秒延时函数
函数功用:完结毫秒级的延时
参数介绍:Delay_MS: 界说需求延时的毫秒的数值
iNumber: 记载Delay_MS的数值,以for句子完结所要求的延时
iValue: 要延时毫秒所要进行的循环数值,本数值为实践测得
返回值:
注意事项:本试验是在所用晶振为12M的前提下完结的毫秒延时,本函数是经过循环的形
式完结,所以假如改动了晶振的频率,请做相应的改动
///////////////////////////////////////////////////////////////////////////
void DelayMs(uint Delay_MS)
{
uint iNumber,iValue;
for(iNumber=0;iNumber{
iValue=107;
while(iValue–);
}
}
///////////////////////////////////////////////////////////////////////////

函数称号:One_DigitalTube_display
函数功用:完结在试验板上数码管指定显现,即在特定的数码管上显现特定的数字,比
在榜首个数码管上显现0
参数介绍:uData:要显现的数字的BCD码数组
uNumber:挑选哪个数码管显现,即让某个特定数码管显现
返回值:
注意事项:试验板上的数码管是共阴极的数码管,假如运用共阳极的数码管,请注意不
要弄反了
///////////////////////////////////////////////////////////////////////////

void One_DigitalTube_display(uchar uData,uchar uNumber)
{
Digital_tube_Duan=Dis_Position[uNumber]; //点亮特定的数码管
Digital_tube_Wei_Enable; //使能数码管的位选
Digital_tube_Wei_Disable; //封闭数码管的位选
DelayMs(5); //调整时序,以完结安稳显现

Digital_tube_Duan_Enable; //使能数码管的段选
Digital_tube_Duan=Dis_table[uData];//输入所要显现的数值
Digital_tube_Duan_Disable; //封闭数码管的段选
}
///////////////////////////////////////////////////////////////////////////
函数称号:Scan_Keyboard
函数功用:这是一个矩阵键盘扫描函数,主要是测验是否有按键按下,此函数是按一列
一列的方式扫描的,假如有按键按下,近一步判别是哪个按键按下,然后显
示在数码管上显现相应的数值
参数介绍:cTemp_Value: 记载按键端口数值的暂时变量
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////

void Scan_Keyboard()
{
uchar cTemp_Value;
//扫描矩阵键盘的榜首列
Keyport=0xef; //赋给键盘端口特定的值,以完结后边的检测
cTemp_Value=Keyport; //把键盘端口值赋给暂时变量
if(cTemp_Value!=0xef)
{
DelayMs(10); //消除颤动,即消除搅扰
cTemp_Value=Keyport; //从头赋值于暂时值
if(cTemp_Value!=0xef) //再次查看
while((Keyport&0x0F)!=0x0F) //再次判别是否有按键按下
{
switch(cTemp_Value)
{
case 0xee:
One_DigitalTube_display(0,0);break; //第五个按键按下,显现0
case 0xed:
One_DigitalTube_display(4,0);break; //第九个按键按下,显现4
case 0xeb:
One_DigitalTube_display(8,0);break; //第十三个按键按下,显现8
case 0xe7:
One_DigitalTube_display(12,0);break; //第十七个按键按下,显现C
}
}
}
//扫描矩阵键盘的第二列
Keyport=0xdf; //赋给键盘端口特定的值,以完结后边的检测
cTemp_Value=Keyport; //把键盘端口值赋给暂时变量
if(cTemp_Value!=0xdf)
{
DelayMs(10); //消除颤动,即消除搅扰
cTemp_Value=Keyport; //从头赋值于暂时值
if(cTemp_Value!=0xdf) //再次查看
while((Keyport&0x0F)!=0x0F) //再次判别是否有按键按下
{
switch(cTemp_Value)
{
case 0xde:
One_DigitalTube_display(1,0);break; //第六个按键按下,显现1
case 0xdd:
One_DigitalTube_display(5,0);break; //第十个按键按下,显现5
case 0xdb:
One_DigitalTube_display(9,0);break; //第十四个按键按下,显现9
case 0xd7:
One_DigitalTube_display(13,0);break; //第十八个按键按下,显现D
}
}
}
//扫描矩阵键盘的第三列
Keyport=0xbf; //赋给键盘端口特定的值,以完结后边的检测
cTemp_Value=Keyport; //把键盘端口值赋给暂时变量
if(cTemp_Value!=0xbf)
{
DelayMs(10); //消除颤动,即消除搅扰
cTemp_Value=Keyport; //从头赋值于暂时值
if(cTemp_Value!=0xbf) //再次查看
while((Keyport&0x0F)!=0x0F) //再次判别是否有按键按下
{
switch(cTemp_Value)
{
case 0xbe:
One_DigitalTube_display(2,0);break; //第七个按键按下,显现2
case 0xbd:
One_DigitalTube_display(6,0);break; //第十一个按键按下,显现6
case 0xbb:
One_DigitalTube_display(10,0);break; //第十五个按键按下,显现A
case 0xb7:
One_DigitalTube_display(14,0);break; //第十九个按键按下,显现E
}
}
}
//扫描矩阵键盘的第四列
Keyport=0x7f; //赋给键盘端口特定的值,以完结后边的检测
cTemp_Value=Keyport; //把键盘端口值赋给暂时变量
if(cTemp_Value!=0x7f)
{
DelayMs(10); //消除颤动,即消除搅扰
cTemp_Value=Keyport; //从头赋值于暂时值
if(cTemp_Value!=0x7f) //再次查看
while((Keyport&0x0F)!=0x0F) //再次判别是否有按键按下
{
switch(cTemp_Value)
{
case 0x7e:
One_DigitalTube_display(3,0);break; //第八个按键按下,显现3
case 0x7d:
One_DigitalTube_display(7,0);break; //第十二个按键按下,显现7
case 0x7b:
One_DigitalTube_display(11,0);break; //第十六个按键按下,显现B
case 0x77:
One_DigitalTube_display(15,0);break; //第二十个按键按下,显现F
}
}
}
}
///////////////////////////////////////////////////////////////////////////

函数称号:main
函数功用:不断地循环扫描键盘,当有按键按下时,则在数码管上显现相应的数值
参数介绍:无
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////

void main()
{
DelayMs(50);
while(1)
{
Scan_Keyboard(); //调用键盘扫描函数
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/262868.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部