⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test024.c

📁 51单片机全套学习资料 提供电路原理图 各种C语言实验程序 包括LED流水灯,数码管显示,中断,定时器,串口通信,DS18B20温度显示,液晶1602,12864显示,看门狗,按键检测,音乐播放等程序
💻 C
字号:
/********************************************************************************************
* 文 件 名:test024.c
* 功    能:4*4行列式键盘驱动。
* 硬件条件:1.CPU型号:AT89S52
*           2.晶振:12.000MHz
*           3.用跳线帽短接BEEP_P1.3
*           4.用杜绑线将4*4行列式键盘模块与开发板的P2口相连,连接关系如下:
*             ==============================================================
*             ARMSKY-51Easy教学实验开发板                  4*4行列式键盘模块
*  
*                     P2.7                                      row1
*                     P2.6                                      row2
*                     P2.5                                      row3
*                     P2.4                                      row4
*                     P2.3                                      col1
*                     P2.2                                      col2
*                     P2.1                                      col3
*                     P2.0                                      col4
*                     +5V                                       VCC
*                     GND                                       GND
*             ==============================================================
*             注意:用户可根据自己的情况,选择ARMSKY-51Easy教学实验开发板上
*                   的其他引脚与4*4行列式键盘模块相连。
*             
* 作    者:POWER
* 日    期:2006年12月12号
* 斯凯科技主页:www.armsky.net
* 斯凯科技论坛:www.armsky.net/bbs
*********************************************************************************************/
#include "reg52.h"                               // 包含头文件    

/* 与编译器无关的数据类型定义 */
/********************************************************************************************/
typedef unsigned char      uint8;                // 无符号8位整型变量
typedef signed   char      int8;                 // 有符号8位整型变量
typedef unsigned short     uint16;               // 无符号16位整型变量
typedef signed   short     int16;                // 有符号16位整型变量
typedef unsigned int       uint32;               // 无符号32位整型变量
typedef signed   int       int32;                // 有符号32位整型变量
typedef float              fp32;                 // 单精度浮点数(32位长度)
typedef double             fp64;                 // 双精度浮点数(64位长度)
/********************************************************************************************/

/* 定义位变量 */
sbit P1_3 = P1 ^ 3;                                                   
sbit row1 = P2 ^ 7;
sbit row2 = P2 ^ 6;
sbit row3 = P2 ^ 5;
sbit row4 = P2 ^ 4;
sbit col1 = P2 ^ 3;
sbit col2 = P2 ^ 2;
sbit col3 = P2 ^ 1;
sbit col4 = P2 ^ 0;

#define BEEP_ON()        (P1_3=0)                // 定义"BEEP_ON()"为P1.3输出低电平,控制蜂鸣器蜂鸣
#define BEEP_OFF()       (P1_3=1)                // 定义"BEEP_OFF()"为P1.3输出高电平,控制蜂鸣器不蜂鸣


/********************************************************************************************
* 函数名称:Delay()
* 功    能:软件延时
* 入口参数:count    延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void Delay(uint16 count)
{
  uint8 i;                

  while(--count != 0)        
 	  {
	    for(i = 0; i < 125; i++);                // ";" 表示空语句,CPU空转。
	  }   				                         // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
}


/********************************************************************************************
* 函数名称:BeepCount()
* 功    能:蜂鸣器按指定次数缝鸣
* 入口参数:count
* 出口参数:无
*********************************************************************************************/
void BeepCount(uint8 count)
{
  for(;count>0;count--)
     {
       BEEP_ON(); Delay(120);
       BEEP_OFF();Delay(120);
     }
}


/********************************************************************************************
* 函数名称:KeyDown()
* 功    能:检测键盘是否按下
* 入口参数:无
* 出口参数:返回1表示键盘按下,返回0表示键盘未按下
* 注    意:该函数有消抖功能
*********************************************************************************************/
uint8 KeyDown(void)
{
  col1=0; col2=0; col3=0; col4=0;	                       // 列线全部置低
  
  if((row1==0) || (row2==0) || (row3==0) || (row4==0)) 	   // 若有任一行线读回状态为低
   {
     Delay(80);	                                           // 延时消抖
     if((row1==0) || (row2==0) || (row3==0) || (row4==0))  // 再次读行线状态,若有任一行线读回状态为低
       return 1;									       // 返回1,表明有键盘按下
     else
       return 0;       									   // 返回0,表明无键盘按下
	} 
  else 
    return 0;     
}

/********************************************************************************************
* 函数名称:KeyUp()
* 功    能:检测键盘是否弹起
* 入口参数:无
* 出口参数:返回1表示键盘弹起,返回0表示键盘未弹起
* 注    意:该函数有消抖功能
*********************************************************************************************/
uint8 KeyUp(void)
{
  col1=0; col2=0; col3=0; col4=0;                          // 列线全部置低

  if((row1==1) && (row2==1) && (row3==1) && (row4==1)) 	   // 若全部行线读回状态都为高 
   {
     Delay(80);											   // 延时消抖
     if((row1==1) && (row2==1) && (row3==1) && (row4==1))  // 再次读行线状态,若全部行线读回状态都为高
       return 1;  										   // 返回1,表明所有键盘都处于弹起状态
     else
       return 0;										   // 返回0,表明有键盘处于按下状态
   }
  else 
    return 0;
}
 
/********************************************************************************************
* 函数名称:KeyNum()
* 功    能:检测用户按下的键盘所对应的键盘号
* 入口参数:无
* 出口参数:返回0表示没有键盘被按动,返回1~16对应被按动的键盘
* 说    明:用户可根据自己的键盘编号修改该函数。
*********************************************************************************************/
uint8  KeyNum(void)
{

  uint8 KeyTemp;
  
  KeyTemp=0;

  if(KeyDown()==1)	                                        // 若键盘被按下
   {
     col1=0; col2=1; col3=1; col4=1;						// 将列线1置低,其他列线置高
     
     if (row1==0) KeyTemp=1; 								// 若行线1读回状态为低,则表明按键1被按下
     if (row2==0) KeyTemp=5; 	                            // 若行线2读回状态为低,则表明按键5被按下
     if (row3==0) KeyTemp=9; 								// 若行线3读回状态为低,则表明按键9被按下
     if (row4==0) KeyTemp=13; 								// 若行线4读回状态为低,则表明按键13被按下
     
     col1=1; col2=0; col3=1; col4=1;			            // 将列线2置低,其他列线置高
      
     if (row1==0) KeyTemp=2;                                // 若行线1读回状态为低,则表明按键2被按下
     if (row2==0) KeyTemp=6; 	                            // 若行线2读回状态为低,则表明按键6被按下
     if (row3==0) KeyTemp=10; 				                // 若行线3读回状态为低,则表明按键10被按下
     if (row4==0) KeyTemp=14;							    // 若行线4读回状态为低,则表明按键14被按下
     
     col1=1; col2=1; col3=0; col4=1;
     
     if (row1==0) KeyTemp=3; 
     if (row2==0) KeyTemp=7; 
     if (row3==0) KeyTemp=11; 
     if (row4==0) KeyTemp=15;		  
     
     col1=1; col2=1; col3=1; col4=0;
     
     if (row1==0) KeyTemp=4; 
     if (row2==0) KeyTemp=8; 
     if (row3==0) KeyTemp=12; 
     if (row4==0) KeyTemp=16;
      
     while ( KeyUp()!=1);	                               // 等待按下的键盘被释放
      
     return KeyTemp;                                       // 返回被按下并被释放的键盘的编号 

    }
  else
      return 0;
}



/********************************************************************************************
* 函数名称:main()
* 功    能:4*4行列式键盘驱动。当发现用户按下并释放键盘,则检测出相应键盘号,并控制蜂鸣器蜂鸣
*           相应次数。
*********************************************************************************************/   	
void main (void)                
{
														   
  BEEP_OFF();											   // 蜂鸣器不蜂鸣

  while(1)                                                 // 死循环
      {
	    BeepCount(KeyNum());
	  }  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -