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

📄 key.c

📁 4x4键盘处理程序
💻 C
字号:

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <avr/pgmspace.h>
#include "main.h"
//----------------------------------
//返回       按键   ||   返回       按键   ||   返回       按键   ||   返回       按键   ||   
//0~9        0~9          10          。         11         up          12         dw
//返回       按键   ||   返回       按键   ||   返回       按键   ||   返回       按键   ||   
// 13        enter        14        menu         15        esc          16         无效   
unsigned char array_scan[4]={0xef,0xdf,0xbf,0x7f};
int key_scan(void)
{
 int array,jianhao=16;
 DDRB=0xf0;//PB4-PB7输出,PB0-PB3输入
 PORTB=0x0f;//PB0-PB3使能内部上拉,PB4-PB7输出低
 if((PINB&0x0f)!=0x0f)//判断是否有键按下
 {
    _delay_loop_2(50000);//延时18毫秒
	if((PINB&0x0f)!=0x0f)//再次判断是否有键按下
	{
		for(array=0;array<4;array++)
		{
			PORTB=array_scan[array];
			switch(PINB&0x0f)
			{
				case 0x0e:jianhao=0+array;break;
				case 0x0d:jianhao=4+array;break;
				case 0x0b:jianhao=8+array;break;
				case 0x07:jianhao=12+array;break;
				default:_delay_loop_1(1);//延时270纳秒;
			}
		}
		if((jianhao>=0)&&(jianhao<=3))//等待按键释放
		{
			PORTB=array_scan[jianhao];
			while((PINB&0x0f)!=0x0f);
		}
		else if((jianhao>=4)&&(jianhao<=7))
		{
			PORTB=array_scan[jianhao-4];
			while((PINB&0x0f)!=0x0f);
		}
		else if((jianhao>=8)&&(jianhao<=11))
		{
			PORTB=array_scan[jianhao-8];
			while((PINB&0x0f)!=0x0f);
		}
		else if((jianhao>=12)&&(jianhao<=15))
		{
			PORTB=array_scan[jianhao-12];
			while((PINB&0x0f)!=0x0f);
		}
  
	}
	else
		_delay_loop_1(1);//延时270纳秒
 }
 else
 _delay_loop_1(1);//延时270纳秒
 
 switch(jianhao)
 {
	case 0: jianhao=15;break;
	case 1: jianhao=12;break;
	case 2: jianhao=14;break;
	case 3: jianhao=13;break;
	case 4: jianhao=10;break;
	case 5: jianhao=11;break;
	case 6: jianhao=0;break;
	case 7: jianhao=9;break;
	case 8: jianhao=7;break;
	case 9: jianhao=8;break;
	case 10: jianhao=6;break;
	case 11: jianhao=5;break;
	case 12: jianhao=3;break;
	case 13: jianhao=4;break;
	case 14: jianhao=2;break;
	case 15: jianhao=1;break;
	default:jianhao=16; 
 } 
 if(jianhao!=16)
 {bell_di();}
 //SREG=0x00;//关全局中断
 return jianhao;
}

⌨️ 快捷键说明

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