keyb.c

来自「共享几个AVR单片机的常用代码」· C语言 代码 · 共 85 行

C
85
字号
#include "KEYB.h"

uint8_t KB_GetChar(uint8_t Sync,uint8_t WaitRelease)
{
	uint8_t kbin,i;

START:
	kbin = 0;
	i = 0;

	KEYB_ROW_DDR	|= (0x0f << KEYB_ROW_SHIFT);		//Row Output Low
	KEYB_ROW_PORT	&= ~(0x0f << KEYB_ROW_SHIFT);

	KEYB_COL_DDR	&= ~(0x0f << KEYB_COL_SHIFT);		//Col Input Pull-Up
	KEYB_COL_PORT	|= (0x0f << KEYB_COL_SHIFT);
	
	DELAY_8M_us;
	DELAY_8M_us;
	DELAY_8M_us;
	DELAY_8M_us;

	do
	{
		kbin = ~((KEYB_COL_PIN>>KEYB_COL_SHIFT)|0xf0);
	}while(Sync && (!kbin));
	
	if(!kbin)
		return 0;
	Timer_Wait_ms(20);
	i =	~((KEYB_COL_PIN>>KEYB_COL_SHIFT)|0xf0);
	if(kbin != i)
		goto START;


	KEYB_ROW_DDR	&= ~(0x0f << KEYB_ROW_SHIFT);		//Row Input Pull-Up
	KEYB_ROW_PORT	|= (0x0f << KEYB_ROW_SHIFT);

	KEYB_COL_DDR	|= (0x0f << KEYB_COL_SHIFT);		//Col Output Low
	KEYB_COL_PORT	&= ~(0x0f << KEYB_COL_SHIFT);
	
	DELAY_8M_us;
	
	kbin |= ~(((KEYB_ROW_PIN<<(4-KEYB_ROW_SHIFT))|0x0f));

WAITRELEASE:
	if(WaitRelease)
	{
		while((~((KEYB_ROW_PIN>>KEYB_ROW_SHIFT)&0x0f))&0x0f);
	}
	Timer_Wait_ms(20);
	if((~((KEYB_ROW_PIN>>KEYB_ROW_SHIFT)&0x0f))&0x0f)
		goto WAITRELEASE;
	
	switch(kbin)
		{
			case 0x11:i = 'F';break;
			case 0x12:i = 'E';break;
			case 0x14:i	= 'D';break;
			case 0x18:i = 'C';break;
			case 0x21:i = 'B';break;
			case 0x22:i = 'A';break;
			case 0x24:i	= '0';break;
			case 0x28:i = '9';break;	
			case 0x41:i = '8';break;
			case 0x42:i = '7';break;
			case 0x44:i	= '6';break;
			case 0x48:i = '5';break;		
			case 0x81:i = '4';break;
			case 0x82:i = '3';break;
			case 0x84:i	= '2';break;
			case 0x88:i = '1';break;
			default:
				goto START;
		}

	

	return i;

}




⌨️ 快捷键说明

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