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

📄 app.c

📁 AVR Devolpment Board
💻 C
字号:
#include "avr/io.h"
#include "util/delay.h"
#include "avr/pgmspace.h"


#define No_key 255
#define K0_0 0
#define K1_0 1
#define K2_0 2
#define K3_0 3
#define K0_1 4
#define K1_1 5
#define K2_1 6
#define K3_1 7
#define K0_2 8
#define K1_2 9
#define K2_2 10
#define K3_2 11
#define K0_3 12
#define K1_3 13
#define K2_3 14
#define K3_3 15

#define Key_mask 0b00001111

char read_keyboard()
{
	static char key_state = 0, key_value, key_line;
	char key_return = No_key,i;
	switch (key_state)
	{
		case 0:
			key_line = 0b00010000;
			for (i=0; i<4; i++) // 扫描键盘
			{
				PORTD = ~key_line; // 输出行线电平
				PORTD = ~key_line; // 必须送2次!!!
				key_value = Key_mask & PIND; // 读列电平
				if (key_value == Key_mask)
					key_line <<= 1; // 没有按键,继续扫描
				else
				{
					key_state++; // 有按键,停止扫描
					break; // 转消抖确认状态
				}
			}
			break;
		case 1:
			if (key_value == (Key_mask & PIND)) // 再次读列电平,
			{
				switch (key_line | key_value) // 与状态0的相同,确认按键
				{ // 键盘编码,返回编码值
					case 0b00011110:
						key_return = K0_0;
						break;
					case 0b00011101:
						key_return = K0_1;
						break;
					case 0b00011011:
						key_return = K0_2;
						break;
					case 0b00010111:
						key_return = K0_3;
						break;
					case 0b00101110:
						key_return = K1_0;
						break;
					case 0b00101101:
						key_return = K1_1;
						break;
					case 0b00101011:
						key_return = K1_2;
						break;
					case 0b00100111:
						key_return = K1_3;
						break;
					case 0b01001110:
						key_return = K2_0;
						break;
					case 0b01001101:
						key_return = K2_1;
						break;
					case 0b01001011:
						key_return = K2_2;
						break;
					case 0b01000111:
						key_return = K2_3;
						break;
					case 0b10001110:
						key_return = K3_0;
						break;
					case 0b10001101:
						key_return = K3_1;
						break;
					case 0b10001011:
						key_return = K3_2;
						break;
					case 0b10000111:
						key_return = K3_3;
						break;
				}
				key_state++; // 转入等待按键释放状态
			}
			else
				key_state--; // 两次列电平不同返回状态0,(消抖处理)
			break;
		case 2: // 等待按键释放状态
			PORTD = 0b00001111; // 行线全部输出低电平
			PORTD = 0b00001111; // 重复送一次
			if ( (Key_mask & PIND) == Key_mask)
				key_state=0; // 列线全部为高电平返回状态0
			break;
	}
	return key_return;
}

const prog_char SegCode[16]={
/* Cathode common Smg display code*/
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 

unsigned char DisBuffer[8]={0,0,0,0,0,0,0,0};

void Scanf(void)
{
	unsigned char i=0;
	for(i=0;i<8;i++)
	{
		PORTB = pgm_read_byte(&SegCode[DisBuffer[i]]);
		PORTA|= (1<<PA4);
		PORTA&=~(1<<PA4);	
				
		PORTB = (1<<i);
		PORTA|= (1<<PA5);
		PORTA&=~(1<<PA5);
		

		_delay_ms(2);
	}
}

int main(void)
{
	unsigned char KeyNumber=0;
	/* Set LED and Smg LE pin as output , databus as output */
	DDRA |=(1<<PA4)|(1<<PA5)|(1<<PA6); 
	DDRB  = 0xFF;

	/* Off the LED display */
	PORTB = 0xFF;
	PORTA|= (1<<PA6);
	PORTA&=~(1<<PA6);
	
	/* Set the direction of the keyboard interface */
	DDRD = 0xF0;

	while(1)
	{
		KeyNumber=read_keyboard();
		if(KeyNumber!=255)
			DisBuffer[7]=KeyNumber;
		
		Scanf(); /* 16ms */
	}
	return 0;
}




⌨️ 快捷键说明

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