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

📄 key_scan.c

📁 8155键盘扫 8155键盘扫
💻 C
字号:
#include<reg52.h>	  //PB段码,PA位控
#include <absacc.h>
#include <string.h>
#include <intrins.h>
#include <ctype.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

/* 定义8155的I/O端口地址 */
#define COM8155 XBYTE[0xf000]                  /* 8155命令口地址 */
#define PA8155  XBYTE[0xf001]                   /* 8155的PA口地址 */
#define PB8155  XBYTE[0xf002]                   /* 8155的PB口地址 */
#define PC8155  XBYTE[0xf003]                   /* 8155的PC口地址 */

uchar key_scan(void);
void delay(uchar ms);
void proc_key(uchar key);
uchar key;

void main()
{
 

 while(1)
{

 COM8155=0x03 ;	//给8155送命令,PA,PB口都为输出,PC口为输入.
 key = key_scan();
 // while ((PC8155&0xcf)!=0xcf) ;  //松键后执行下面程序,会出现数码管按下不亮.
 proc_key(key);	//键盘功能

   }
}
//键处理子程序
/*0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,*/
/*0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E, */
void proc_key(uchar key)
{
 switch(key)
 {
  case 0x11:PB8155=0xfc;PA8155=0xf0;delay(10);break;   //数码显示0 
  case 0x12:PB8155=0x60;PA8155=0xf0;delay(10);break;   //数码显示1  
  case 0x14:PB8155=0xda;PA8155=0xf0;delay(10);break;   //数码显示2
  case 0x18:PB8155=0xf2;PA8155=0xf0;delay(10);break;   //数码显示3  
  case 0x21:PB8155=0x66;PA8155=0xf0;delay(10);break;   //数码显示4
  case 0x22:PB8155=0xb6;PA8155=0xf0;delay(10);break;   //数码显示5
  case 0x24:PB8155=0xbe;PA8155=0xf0;delay(10);break;   //数码显示6
  case 0x28:PB8155=0xe0;PA8155=0xf0;delay(10);break;   //数码显示7
  case 0x41:PB8155=0xfe;PA8155=0xf0;delay(10);break;   //数码显示8
  case 0x42:PB8155=0xf6;PA8155=0xf0;delay(10);break;   //数码显示9 
  case 0x44:PB8155=0xEE;PA8155=0xf0;delay(10);break;   //数码显示a 
  case 0x48:PB8155=0x3E;PA8155=0xf0;delay(10);break;   //数码显示b
  case 0x81:PB8155=0x9c;PA8155=0xf0;delay(10);break;   //数码显示c
  case 0x82:PB8155=0x7a;PA8155=0xf0;delay(10);break;   //数码显示d
  case 0x84:PB8155=0x9E;PA8155=0xf0;delay(10);break;   //数码显示e
  case 0x88:PB8155=0x8E;PA8155=0xf0;delay(10);break;   //数码显示f
  default: break;
 }
}
  
 /* 键扫描函数 */
uchar key_scan(void)
{
	uchar scancode,tmpcode;
	PB8155 = 0xf0;		 // 在列行没有接高电平发全0列扫描码
	 PA8155=0xff;		//关闭显示	 					
	if ((PC8155&0xcf)!=0xcf)	// 若哪行有0代表有键按下,PC口"1100,****"PC口7,6位没有用默认为高电平,5,4位不用时为0.
	{
		delay(1);							// 延时去抖动
		if ((PC8155&0xcf)!=0xcf)				// 延时后再判断一次,去除抖动影响
		{
			scancode = 0xfe;	//从第一列开始发0
			while((scancode&0x10)!=0)		// 逐行扫描
			{
				PB8155 = scancode;				// 输出列扫描码
				if ((PC8155&0xcf)!=0xcf)		// 本行有键按下
				{
					tmpcode = (PC8155<<4)|0x0f;
				 
					/* 返回特征字节码,为1的位即对应于行和列 */
					return((~scancode)+(~tmpcode));
				}
				else scancode = (scancode<<1)|0x01;		// 行扫描码左移一位
			}
		}
	}
	return(key);						// 无键按下,返回值为原来key值(这是松开键让它一直执行子程序), 如返回值为0(是按一下才执行键功能程序,松开就不执行);	
} 


//延时子程序ms级
void delay(uchar ms)
 {
   uchar i;
   while(ms--)
   {
     for(i=0;i<150;i++)
     {;}
   }//--焦建国制作
 }

⌨️ 快捷键说明

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