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

📄 mkey.c

📁 在单片机系统中实现4*4的小键盘的扫描程序
💻 C
字号:
/*******************************************
  文件:MKEY.C
  环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
  硬件:ATMEGA16芯片
  日期:2006年12月10日 
  功能:驱动开发板上的矩阵键盘,按不同的键,则数码管显示键码0~F
  备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
/******************************************/
#include <iom16v.h>			//包含型号头文件
#include <macros.h>			//包含"位"操作头文件
#include <stdio.h>			//标准输入输出头文件
#include <AVR_PQ1A.h>		//包含自定义常量头文件
#include "SMG.C"			//包含数码管显示函数

/*******************************************
函数名称: Key_press
功    能: 检测是否有键按下
参    数: 无
返回值  : pressed--有键按下时为TRUE,否则为FALSE
/********************************************/
uchar Mkey_press(void)
{
 uchar pressed;		 		
 KEY_DDR=OUT;				//定义数据端口为输出
 KEY_PORTO=0xF0;			//输出数据(输出检测码)
 KEY_DDR=IN;				//定义数据端口为输入
 if(KEY_PORTI!=0xF0)		//检测是否有键按下
 	pressed=TRUE;			//有键按下则返回TRUE
 else
 	pressed=FALSE;			//无键按下则返回FALSE
 KEY_DDR=OUT;				//数据端口还原为输出
 return pressed;
}
/*******************************************
函数名称: Key_scan
功    能: 扫描所按的键并返回键值
参    数: 无
返回值  : keycode--被按下键值
/********************************************/
uchar Mkey_scan(void)
{
 uchar i=0x7F,keycode=0xFF;		//i为扫描码,
 Delayms(15);					//延时消抖
 if(Mkey_press()==TRUE)			//如果有键按下
 {
  	do
	{
	   i=(i<<1|i>>7);		//进行行扫描
	   KEY_DDR=0x0F;		//定义数据端口低四位为输出,高四位为输入
	   KEY_PORTO=i;			//输出扫描码	   #define KEY_PORTO PORTD		   
	   Delayms(1);			//防止读入出错,加入延时
	   keycode=KEY_PORTI;	//读入原始键码     #define KEY_PORTI PIND			
	}while((keycode&0xF0)==0xF0);	//是否检测到被按下按键(扫描到就跳出循环,否则继续扫描)
	do
	{
	}while(Mkey_press()==TRUE);	//等待按键释放(为了防止按一次,执行多次的现象)
	Delayms(15);				//延时消抖
	switch(keycode)				//将原始键码翻译成0~F
	{
	   case 0xEE:
	   		keycode=0x1;
			break;
	   case 0xDE:
	   		keycode=0x2;
			break;
	   case 0xBE:
	   		keycode=0x3;
			break;
	   case 0x7E:
	   		keycode=0xa;
			break;
	   case 0xED:
	   		keycode=0x4;
			break;
	   case 0xDD:
	   		keycode=0x5;
			break;
	   case 0xBD:
	   		keycode=0x6;
			break;
	   case 0x7D:
	   		keycode=0xb;
			break;
	   case 0xEB:
	   		keycode=0x7;
			break;
	   case 0xDB:
	   		keycode=0x8;
			break;
	   case 0xBB:
	   		keycode=0x9;
			break;
	   case 0x7B:
	   		keycode=0xc;
			break;
	   case 0xE7:
	   		keycode=0xe;
			break;
	   case 0xD7:
	   		keycode=0x0;
			break;
	   case 0xB7:
	   		keycode=0xf;
			break;
	   case 0x77:
	   		keycode=0xd;
			break;
	}
 }
 return keycode;  		//返回经过翻译的键码
}
/*******************************************
函数名称: main
功    能: 独立按键驱动主函数
参    数: 无
返回值  : 无
/********************************************/
void main(void)
{
 uchar i;
 uchar j=0;
 uchar temp[4];
 uchar qq;
 
 
 
 uchar p=0;      // 确认
 uchar tem;
 uchar k;        //PA0  光电传感器输入
 uchar a=0x7f;   // 1111 1110
 
 Board_init( );				//初始化开发板
 
 DDRA|=BIT(7);   //定义PA7为输出
 PORTA&=0x7F;    //初始设置输出为0,不发声  0111 1111
 DDRC&=0x7F; //0111 1111 定义PORTC7为输入
 PORTC|=0x00;//PC7 不设上拉电阻  1000 0000
 
 //DDRC&=a;        //定义PA0为输入 0111 1111  高电平有效
 //PORTA&=0xff;       //PA0 不设上拉电阻
 
 //One_smg_display(0,1);		//第1个数码管,初始显示数字8
 
 
 /*for(j=0;j<4;j++)         //初始数码管显示 0000
 {    
     temp[j]=0x0;
     j=0;
 }
 for(i=0;i<4;i++)					
   {
    One_smg_display(temp[i],i+1);	   
    Delayms(5);
   }*/
 
 
 while(1)
 {
   
   
   if(Mkey_press())	  		//是否有按键按下
   {
    qq=Mkey_scan();
    if(qq==0xB)             //按键确认 是否按下
    {
     for(j=0;j<4;j++)
     temp[j]=0x0;
     j=0;
	 p=0x01;
    }
    else if(qq==0xA)               //清除当前输入
        {
	     if(j>0)
	      {
	        temp[j-1]=0x0;
	        j--;
	      }
	     else
	        {
	          temp[3]=0x0;
	          j=3;
	        }
	   }
	else
	   {
	    temp[j]=qq;                  //Mkey_scan();//扫描并反回翻译后的键码
	    j++;	
	    if(j>3)
        j=0;
	   }
   }//if end
   
   
   for(i=0;i<4;i++)					//显示按键数字
   {
    One_smg_display(temp[i],i+1);	   
    Delayms(5);
   }
   
   
   tem=PINC;           //uchar k;        //PC7  光电传感器输入
   k=tem>>7;
   if(k==1 )
   {
        One_smg_display(8,6);
		Delayms(5);
        if(p==0) {PORTA|=0xFF;Delayms(200);PORTA&=0x7F;}//无刷卡,有人通过,发声2妙后停止 0111 1111
   
   }
   if(p==1 )             {Delayms(2000);p=0;} //有刷卡,2妙内有人通过不发声,2妙后,有人通过,发声
  
  
 } //while end
   
    
}//main end

⌨️ 快捷键说明

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