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

📄 demo_key_test.c

📁 基于MEGA16的按键识别程序
💻 C
字号:

/*********************************************************************
    工程名  :Demo_key_test
    程序名  :同上
    创建时间:11月4日
    创建单位:广西师范大学
    专业    :电子信息工程
    作者    :陈哲(06电信)
    程序作用:按键识别,按下按键后,数码管切换不同的显示
    实验CPU :ATMEGA16
    晶振    :内部8MHZ
    版本    :1.0
    修改人  :
    修改时间:
    
*************************************************************************/

//思考:1。按键消抖除了延时还有没有更加好的方法?
//      2。AVR没有位操作,那要怎样进行位操作?
//      3。阅读相关资料,思考硬件消抖和软件消抖的区别,和软件消抖的好处



#include<avr/io.h>
#include<util/delay.h>

#define uchar unsigned char
#define uint unsigned int

uchar disbeat_run[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar disnumber_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴极数码管,分别表示:0 1 2 3 4 5 6 7 8 9 A b C d E F



//**************端口初始化程序*************************//
void port_init()
{
    DDRA=0xff;
	PORTA=0xff;
	DDRC=0xff;
	PORTC=0xff;
	DDRB&=~(1<<0);//出现AVR的位操作
	PORTB=0xff;
	}


//****************显示程序1*************************//
//****************显示01234567*********************//
void led_display_1()
{
  uchar j;
  for(j=0;j<8;j++)
  {
    PORTA=disnumber_code[j];
	PORTC=disbeat_run[j];
	_delay_ms(2);
   }
}

//***************显示程序2***************************//
//********************显示89ABCDEF*******************//
void led_display_2()
{
  uchar i;
  for(i=8;i<16;i++)
  {
    PORTA=disnumber_code[i];
	PORTC=disbeat_run[i];
	_delay_ms(2);
   }
}


//****************主函数开始****************************//

void main()
{
  uchar flat=0;//设定一个标志位,为以后的状态选择做准备
               //不同的状态对应不同的输出结果 如果flat是0,进入状态1输出“01234567”如果
			   //flat是1进入状态2输出“89ABCDEF”
			   //flat为2时,则从状态2跳到状态3,状态3时即把flat从新给0,回到状态1
			   
 
 
  port_init();
  
  while(1)
    {
      if((PINB&0x01)==0)  //消抖要检测两次,这是最基本的写法
        {
	     _delay_ms(10);  //延时10毫秒是为了消抖
		  if((PINB&0x01)==0)  
	       {
		        flat++;
				while((PINB&0x01)==0); //思考出现这条语句的作用是什么,有和没有有区别吗
				                        //这条语句是为了保证按下按键多久,flat都只加1;如果没有,就会连续加下去
									    //这样就不符合实际的要求
	        }
	  		  
	    }
			//三种状态,有限状态机的思想	
	  if(flat==0)   //状态1
	    {
		  led_display_1();
        }
		
	  if(flat==1)  //状态2
	    {
		  led_display_2();
		}
	
	  if(flat==2)  //状态3
        {
          flat=0;
        }	
		
		
		
	}	
}
		

⌨️ 快捷键说明

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