培训资料精选

基于stc89c52的4*4矩阵键盘输入数码管

点击量:   时间:05-08
实现功能:  完成独立按键的测试,当key5-key20这二十个按键中,有一个按下时, 则在开发板的第一个数码管上会显示具体的数值,显示的数值是这样定义的,key5按下时,显示0,key6按下时显示2,然后依次这样类推,达到按下去相应的值显示相应数值的功能
实验板型号:BS-XYD-C52
实验名称:  静态数码管
     
///////////////////////////////////////////////////////////////////////////
 
#include<reg52.h>
#include <intrins.h>
                    
#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<Delay_MS;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();    //调用键盘扫描函数
 }
}

  • 时代楷模展板

    时代楷模展板

  • 中国共产党人精神谱系精神谱系

    中国共产党人精神谱系精神谱系

  • 党员活动室

    党员活动室

  • 王远文工作室

    王远文工作室

  • 乒乓球活动室

    乒乓球活动室