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

📄 4key.c

📁 AVR单片机控制下的实时按键显示,已测试通过
💻 C
字号:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <inttypes.h>
/主要是完成对输出管脚值的定义   /
/*用于列扫描,高四位置为高电平,低四位循环有效 置0为有效
#define cloumcode1 0xF7
#define cloumcode2 0xFB
#define cloumcode3 0xFD
#define cloumcode4 0xFE

/*行列值与键盘对应值*/
#define keycode0 0xE7
#define keycode1 0xD7
#define keycode2 0xB7
#define keycode3 0x77

#define keycode4 0xEB
#define keycode5 0xDB
#define keycode6 0xBB
#define keycode7 0x7B

#define keycode8 0xED
#define keycode9 0xDD
#define keycodeA 0xBD
#define keycodeB 0x7D

#define keycodeC 0xEE
#define keycodeD 0xDE
#define keycodeE 0xBE
#define keycodeF 0x7E

/*单片机输出管脚定义,其中键盘连接于单片机PC0-PC7脚*/
#define KEY_DDR DDRC
#define KEY_PORT PORTC
#define KEY_PIN PINC

/*六位LED数码管选通*/
#define LED_DATA_DDR DDRB
#define LED_DATA_PORT PORTB
#define LED_DATA_PIN PINB

/*每一个八段数码管数值显示*/
#define LED_ADD_DDR DDRD
#define LED_ADD_PORT PORTD
#define LED_ADD_PIN PIND  


uint8_t ledcode[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,0x7C,0x58,0x5E,0x79,0x71};//定义数组用来表示"0"到"F"


uint8_t Keyboard(void)
{
static uint8_t ScanCode=0xF7,Time=0,led=0x00,ledcurrent=0x00,ledlast=0x00;
	do			//键盘扫描
		{
		switch(ScanCode)	//扫描信号
			{   
   // 扫描信号从0111-1011
				case 0XF7: ScanCode=0XFB;break;
   // 扫描信号从1011-1101
			     case 0XFB: ScanCode=0XFD;break;
   //扫描信号从1101-1110
				case 0XFD: ScanCode=0XFE;break;
   //扫描信号从1110-0111
				case 0XFE: ScanCode=0XF7;break;
				default: {ScanCode=0XF7;break;}
			}

    /*在main()函数里需将DDRC设成0x0F,即PC7~PC4为输入,PC3~PC0为输出。
    下面PORTC=ScanCode意味着,将PC7~PC4设为带上拉功能的输入,
    而PC3~PC0输出扫描信号。*/
		KEY_PORT=ScanCode;

/*键值判断,有按键时,将键值赋予led ,否则计数变量time加1*/
		switch(KEY_PIN)	        // 解读行列电平值与按键值的关系			
			{
				case keycode0: led=ledcode[0];Time=0;break;
				case keycode1: led=ledcode[1];Time=0;break;
				case keycode2: led=ledcode[2];Time=0;break;
				case keycode3: led=ledcode[3];Time=0;break;
				case keycode4: led=ledcode[4];Time=0;break;
				case keycode5: led=ledcode[5];Time=0;break;
				case keycode6: led=ledcode[6];Time=0;break;
				case keycode7: led=ledcode[7];Time=0;break;
				case keycode8: led=ledcode[8];Time=0;break;
				case keycode9: led=ledcode[9];Time=0;break;
				case keycodeA: led=ledcode[10];Time=0;break;
				case keycodeB: led=ledcode[11];Time=0;break;
				case keycodeC: led=ledcode[12];Time=0;break;
				case keycodeD: led=ledcode[13];Time=0;break;
				case keycodeE: led=ledcode[14];Time=0;break;
				case keycodeF: led=ledcode[15];Time=0;break;
				default : {
					Time++;
					break;
					}
			}
		}
		while((Time!=0)&(Time<4));	//如果time=4(键盘扫描一遍)

		
		if(Time==4)			//由time=4条件而退出,即没有扫描到按键
			{
				return(ledlast);
			}
		else
			{
		//检测到有按键时,更新按键值
			ledlast=ledcurrent;
			ledcurrent=led;
			return(ledcurrent);
			}
}


void Initi_Device(void)
{
	LED_ADD_DDR=0xFF;    //定义为输出
	LED_ADD_PORT=0xFE;   //控制最后一个八段数码管亮
	LED_DATA_DDR=0xFF;   //定义为输出
	LED_DATA_PORT=0xBF;  //输出数字
}

SIGNAL(SIG_OVERFLOW0)
{
TCNT0=0XB2;
LED_DATA_PORT=Keyboard();
}

int main(void)
{
KEY_DDR=0X0F;
KEY_PORT=0XFF;
Initi_Device();
TCCR0=5;
TCNT0=0XB2;
TIMSK=(1<<TOIE0);
sei();
for(;;)
{}
}

⌨️ 快捷键说明

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