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

📄 keyscan.c

📁 51单片机用c语言实例 包括ad
💻 C
字号:
/******************************************************/
/*    文件名: KeyScan.c                               */
/*    功能描述: 控制8255完成键盘扫描及数码显示实验    */
/******************************************************/

#include "Absacc.h"

#define C8255_A     XBYTE[0x7F00]	//8255端口地址定义
#define C8255_B     XBYTE[0x7F01]
#define C8255_C     XBYTE[0x7F02]
#define C8255_CON   XBYTE[0x7F03]
//数码管显示编码
unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
					 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
//显示缓冲
unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

unsigned char key_down;
unsigned char key_value;
unsigned char key_count;

void delay(unsigned int time)
{
	unsigned int i;
	for(i=0; i<time; i++);
}

void keyscan()					//按键扫描函数
{
	unsigned char cc;
	C8255_A = 0x00;				//X1~X4置0
	cc = C8255_C;				//得到Y1~Y4的值
	key_down = (~cc) & 0x0f;
}

void display()					//显示函数
{
	unsigned char i, j = 0xDF;
	for(i=0; i<6; i++)
	{
		C8255_A = 0xFF;
		C8255_B = a[b[i]];		//查表输出显示
		C8255_A = j;
		delay(0x100);
		j = (j>>1)|(j<<7);
	}
}

void clear()					//清屏
{
	C8255_B = 0x00;
}

void writebuffer()
{
	b[key_count] = key_value;
	key_count--;
	if(key_count == -1)
		key_count = 5;
	display();
	clear();
	keyscan();
	while(key_down)				//键盘消抖
	{
		display();
		clear();
		keyscan();
	}
}

void getkey()					//得到按键值
{
	unsigned char value;
	unsigned char i, j = 0xFE;

	for(i=0; i<4; i++)
	{
		C8255_A = j;
		value = C8255_C;

		if(!(value & 0x01))		//行1
		{
			key_value = i + 0;
			writebuffer();
			return;
		}

		if(!(value & 0x02))		//行2
		{
			key_value = i + 4;
			writebuffer();
			return;
		}

		if(!(value & 0x04))		//行3
		{
			key_value = i + 8;
			writebuffer();
			return;
		}

		if(!(value & 0x08))		//行4
		{
			key_value = i + 12;
			writebuffer();
			return;
		}

		j <<= 1;
	}
}

void main()
{
	C8255_CON = 0x81;			//8255初始化

	key_count = 5;

	while(1)
	{
		display();				//显示
		clear();				//清屏
		keyscan();				//按键扫描
		if(key_down)			//判是否有键按下
		{
			display();
			delay(0x80);
			clear();
			keyscan();
			if(key_down)
			{
				getkey();		//得到按键值
			}
		}
	}
}

⌨️ 快捷键说明

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