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

发布者:乘风翻浪最新更新时间:2014-12-04 来源: 21ic关键字:stc89c52  矩阵键盘  数码管 手机看文章 扫描二维码
随时随地手机看文章

///////////////////////////////////////////////////////////////////////////
 实现功能:  完成独立按键的测试,当key5-key20这二十个按键中,有一个按下时,
             则在开发板的第一个数码管上会显示具体的数值,显示的数值是这样
    定义的,key5按下时,显示0,key6按下时显示2,然后依次这样类推,
    达到按下去相应的值显示相应数值的功能
 实验板型号:BS-XYD-C52
 实验名称:  静态数码管
 编写人:  TabLee
 编写日期:  2014-3-21     
///////////////////////////////////////////////////////////////////////////

#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();    //调用键盘扫描函数
 }
}

关键字:stc89c52  矩阵键盘  数码管 引用地址:基于stc89c52的4*4矩阵键盘输入数码管

上一篇:LCD12232液晶的模块化程序
下一篇:单片机I/O口的开漏输出及推挽输出区别

推荐阅读最新更新时间:2024-03-16 13:47

4*4键盘输入在LED数码管上的显示
【实验要求】   1)在实验一基础上添加4*4键盘,使键盘输入的操作通过 LED 给予显示。   2)键盘实现的功能如键盘图。 【实验目的】   1)了解4*4键盘的使用方法   2)进一步了解键唤醒的使用方法。 【实验设备】   1)装有u’nsp IDE仿真环境的PC机一台。   2)μ’nSP十六位  单片机  实验箱一个。 【实验原理】   通过对键盘的操作在LED 数码管 上给予显示及相应操作。键盘扫描在时基中断中进行   键盘界面如下:  7 8 99 F1 44 55 66 F2 11 22 33 F33 DEL 00 F44 ENT   0~9:数字键  DEL:
[嵌入式]
单片机+数码管简单秒表程序,带停止启动复位
p0口是数码管的位选入口,P2口是数码管的段选用4位一体的数码管,P3.0 P3.1 P3.2分别是启动停止和复位按钮 #include reg51.h #define uchar unsigned char #define uint unsigned int #define DATA P2 sbit start=P3^0; sbit stop=P3^1; sbit reset=P3^2; //---------启停标志----- bit SAT=0; bit RST=0; //------------数码管码表---------- uchar tab ={0x3F, 0x0
[单片机]
采用STC89C52单片机水陆两栖救灾车系统电路模块设计
  传统的救灾车对路面的要求比较高,该文提出并设计了一种水陆两栖的救灾车。该文主要使气垫船与轮式车辆相结合,选择STC89C52单片机,通过红外避障技术的相关知识,实现了水陆两栖的救灾车的设计。通过实践证明,车在行驶时,具备避障、防撞功能,完成了救灾的功能。该小车由路面行进至水中时,通过水检测装置检测水位,当水深达到一定高度时,小车可以自动实现水陆两栖转换功能。当声源散发出声音时,由小车周围的声音传感器根据接收的声响,判断其具体的方向,缓缓向声源靠近。当水上模式时,该小车可收起车轮;当由陆地转换成水上时,动力由车轮转换为涡轮驱动。    声音模块   本文的声音模块主要利用震动的规律来设计,其模块电路图如图2所示。   
[电源管理]
采用<font color='red'>STC89C52</font>单片机水陆两栖救灾车系统电路模块设计
51单片机STC89C52控制LED闪烁(将延时程序写成子函数有形参)
/*-----------------------包含头文件区域-------------------------*/ #include reg52.h //单片机头文件 /*-----------------------端口/引脚定义区域----------------------*/ sbit LED=P2^0; //位定义P2.0引脚名为LED /*-----------------------函数声明区域---------------------------*/ void delay(unsigned int xms);//延时函数声明 /*-----------------------主函数区域-----
[单片机]
基于PIC16F877单片机数码管显示矩阵键值
PIC16F877单片机数码管显示矩阵键值,4X4矩阵键盘一共有16个按键,对应的是0~F,十六进制数,本程序是利用行扫描法,进行循环扫描矩阵键盘,当每一行有一个按键被按下,它都会检测得到键值,然后数码管就会显示对应的数值啦。 #include pic.h typedef unsigned char uchar; typedef unsigned int uint; uchar table ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管共阳段码 uchar table_we ={0xfe,
[单片机]
51单片机(STC89C52RC)光电耦合控制继电器实验
单片机控制继电器一般是两种方式:一是单片机-三极管(PNP)-继电器,二是单片机-光电耦合器-三极管(NPN)-继电器,后者由于采用了光电隔离,故起抗干扰能力相对前者要强.前者选用PNP型主要是考虑控制逻辑,采用低电平触发的控制逻辑能够防止单片机复位时候产生的误动作.后者NPN是为了控制的方便,但也是遵循这样的控制逻辑.   本次实验采用材料有: STC89C52RC    51单片机 NEC/Ps2002B    晶体管光电耦合器 9013         NPN型三极管 SRD-06VDC-SL-C 松乐6V继电器   电路图我就不画了,可以google,MCS-51直流继电器接口关键字.在这里主要碰到的问
[单片机]
第26节:在主函数while循环中驱动数码管的动态扫描程序
开场白: 上一节通过一个机械手自动控制程序展示了我在工控常用的编程框架,但是一直没涉及到人机界面,在大多数的实际项目中,人机界面是必不可少的,这一节开始讲最常用的人机界面------动态数码管的驱动。 这一节要教会大家两个知识点: 第一点:数码管的动态驱动原理。 第二点:如何通过编程,让数码管显示的内容转移到几个变量接口上,方便以后编写更上一层的窗口程序。 具体内容,请看源代码讲解。 (1)硬件平台:基于朱兆祺51单片机学习板。用两片74HC595动态驱动八位共阴数码管。 (2)实现功能: 开机后显示 8765.4321 的内容,注意,其中有一个小数点。 (3)源代码讲解如下: #include REG52.H
[单片机]
按键数码管数值前移
#include reg51.h typedef unsigned char uchar; typedef unsigned int uint; void delay(unsigned int i); //函数声名 char DelayCNT;//定义变量 sbit P10=P1^0; uint Count=0; uchar n=0; uchar Key_Value;//获取键盘码 uint i=0; uint flag=0; //此表为 LED 的字模, 共阴数码管 0-f unsigned char code Disp_Tab = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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