STC89C52单片机按键实验

发布者:Meiren520最新更新时间:2016-04-15 来源: eefocus关键字:STC89C52  单片机  按键实验 手机看文章 扫描二维码
随时随地手机看文章
//////////////////////////////////////////////////////////////////////////

 实现功能:  完成独立按键的测试,当key1-key4这四个按键中,有一个按下时,在
             开发板的第一个数码管上会显示具体的数值,比如说按下key1键,在
    数码管上会显示1,其他的类似
 实验板型号: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,0x40,0x80,0x00};
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_Wei_Enable;   //使能数码管的位选
  Digital_tube_Duan=0XFF;   //熄灭所有的数码管,以达到稳定的显示
  Digital_tube_Wei_Disable;   //关闭数码管的位选
 
  Digital_tube_Duan_Enable;      //使能数码管的段选
  Digital_tube_Duan=Dis_table[uData];//输入所要显示的数值
  DelayMs(1);         //调整时序,以实现稳定显示
  Digital_tube_Duan_Disable;      //关闭数码管的段选
 
  Digital_tube_Wei_Enable;      //使能数码管的位选
  Digital_tube_Duan=Dis_Position[uNumber]; //点亮特定的数码管
  Digital_tube_Wei_Disable;      //关闭数码管的位选
}
 //////////////////////////////////////////////////////////////////////////
函数名称:Scan_Keyboard
函数功能:这是一个键盘扫描函数,主要是测试是否有按键按下,如果有按键按下,近
          一步判断是哪个按键按下,然后显示在数码管上显示相应的数值
参数介绍:cTemp_Value: 记录按键端口数值的临时变量
返回值: 
注意事项:无
 //////////////////////////////////////////////////////////////////////////

void Scan_Keyboard()
{
 uchar cTemp_Value;
 Keyport=0x0f;              //赋给键盘端口特定的值,以实现后面的检测
 cTemp_Value=Keyport;   //把键盘端口值赋给临时变量
 if(cTemp_Value!=0x0f)
 {
  DelayMs(10);       //消除抖动,即消除干扰
        cTemp_Value=Keyport;  //重新赋值于临时值
        if(cTemp_Value!=0x0f)   //再次检查
        while((Keyport&0x0F)!=0x0F) ;   //再次判断是否有按键按下
     switch(cTemp_Value)    
     {
      case 0x0e:
        One_DigitalTube_display(1,0);break;  //第一个按键按下,显示1
      case 0x0d:
        One_DigitalTube_display(2,0);break;  //第二个按键按下,显示2
      case 0x0b:
        One_DigitalTube_display(3,0);break;  //第三个按键按下,显示3
      case 0x07:
        One_DigitalTube_display(4,0);break;  //第四个按键按下,显示4
     }
 }
}
 //////////////////////////////////////////////////////////////////////////
函数名称:main
函数功能:不断地循环扫描键盘,当有按键按下时,会在数码管上显示相应的数值
参数介绍:无
返回值: 
注意事项:无
 //////////////////////////////////////////////////////////////////////////
void main()
{
 while(1)
 {
  Scan_Keyboard();    //调用键盘扫描函数
 }
}

关键字:STC89C52  单片机  按键实验 引用地址:STC89C52单片机按键实验

上一篇:STC89C52单片机矩阵键盘实验
下一篇:STC89C52单片机数码管静态显示

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved