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

📄 82c55.c

📁 82c55接口驱动_键盘扫描程序... ...
💻 C
字号:
//82C55接口键盘扫描程序
#include "Globle.h"
#include "My8051.h"
#include "Cabe.h"
#include <absacc.h>

#define PA8255  XBYTE[0x0ff0]
#define PB8255  XBYTE[0x0ff1]
#define PC8255  XBYTE[0x0ff2]
#define COM8255 XBYTE[0x0ff3]

#define ENABLE			0
#define DISABLE			1
#define CS_82C55		P15
//Byte keydata;

void WatchDog1(void)
{
	P43 = 1;
	_nop_();
	_nop_();
	P43 = 0;
}

void Delayx10ms(Word count)		
{
	Word i,j;
	while(count-- != 0)
	{
		for(i=0;i<10;i++)
			for(j=0;j<72;j++)
			;
	}
}

void BeepGetkey(Word count,Byte soundlong,Byte tone)//count发出BEEP的个数,soundlong 声音的长短,tone声音的高低
{
	Word i,j,k,spFreq;
//	P15 = 0;
//	COM8255 = 0x8A;
//	PA8255 = 0X20;		//设PA6口为高输出(背景灯亮)
	spFreq = (1000/tone)/2;
	for(i=0;i<count;i++)
	{
		for(j=0;j<soundlong;j++)
		{
			for(k=0;k<spFreq;k++)
			;
			  PA8255 = 0X40;		//设PA6口为高输出(背景灯亮
			for(k=0;k<spFreq;k++)
			  PA8255 = 0;			//设PA6口为高输出(背景灯亮)
			;
		}  
		Delayx10ms(12);	
	}
//	P15 = 1;
}


Byte KeyInput82C55(void)
{
	Byte sccode,recode,Key,keytem,keytem2,keytem3;
	P15 = 0;
	PC8255 = 0xf0;							//发全"0"行扫描码,列线输入
	keytem = PC8255;
	if((PC8255&0xf0)!=0xf0)					//若有键按下
	{
		Delayx10ms(1);	 					// 消拌
		if((PC8255&0xf0)!=0xf0)				//单片机将得到的信号取反,PC6-PC4中的"1"的位便是键所在的列.
		{
			keytem2 = PC8255&0xf0;
			sccode = 0xfe;					//逐行扫描初值
//			keytem2 = sccode;
			while((sccode&0x10) != 0)		//扫描完退出
			{
	 			keytem3 = sccode&0x0f;
				PC8255 = sccode;			//输出行扫描码
				Delayx10ms(1);
				keytem = PC8255&0xf0;
				if(keytem != 0xf0)			//本行有键按下
				{
					recode = keytem;
					Key = (sccode & 0x0f) | recode;
					while((PC8255&0xf0)!=0xf0){};//防重读
					P15 = 1;
					return(Key);				//返回特征吗
				}
				else
				{				
					sccode = (sccode<<1) | 0x01;//行扫描码左移一位
				}
			}
		}
	}
	P15 = 1;
	return(0);							//无键按下返回为0
}

void dodey(void)
{
	Byte temkey;
//	Byte keydata;
	keydata = 0;
	temkey = KeyInput82C55();
//	if(temkey!=0)
//	{
		switch(temkey)
		{
			case 0xD7 : keydata = 0x30; break; //  定义0号键
			case 0xEE : keydata = 0x31; break; //  定义1号键
			case 0xDE : keydata = 0x32; break; //  定义2号键
			case 0xBE : keydata = 0x33; break; //  定义3号键
			case 0xED : keydata = 0x34; break; //  定义4号键
			case 0xDD : keydata = 0x35; break; //  定义5号键
			case 0xBD : keydata = 0x36; break; //  定义6号键
			case 0xEB : keydata = 0x37; break; //  定义7号键
			case 0xDB : keydata = 0x38; break; //  定义8号键
			case 0xBB : keydata = 0x39; break; //  定义9号键
			case 0xE7 : keydata = 0x2A; break; //  定义*号键
			case 0xB7 : keydata = 0x23; break; //  定义#号键
			default:
		  	break;
		}
//	}    
}

Byte Getkey(void)
{
	Byte idata byKey;
	dodey();
//	KeyInput82C55();
	if(keydata != 0)
	{
		byKey = keydata;	//防重读
      //  Delayx10ms(3);	 	// 消拌
//	    g_byShortTime = 10;
		return(byKey);
//		P15 = 0;
/*
	    BeepGetkey(1,6,8);	
//		P15 = 1;
		while(1)
		{
//			dodey();
			KeyInput82C55();
			if(keydata != byKey)
			{
				return(byKey);
			}	
		}
*/
//	}

//}

/*
Byte KeyInput82C55(void)
{
	Byte idata sccode,Key = 0;
	CS_82C55 = ENABLE;						//设PC0-3为输出,PC4-7为输入;PA为输出口;PB为输入口
	PC8255 = 0xfe;							//发全"0"行扫描码,列线输入	
	sccode = PC8255 & 0xf0;
	switch(sccode)
	{
		case 0xE0:   keydata = 0x31; break;
		case 0xd0:   keydata = 0x32; break;
		case 0xb0:   keydata = 0x33; break;
		default:  break;
	}
//	Delayx10ms(10);	
	PC8255 = 0xFd;							//发全"0"行扫描码,列线输入
	_nop_();
	sccode = PC8255 & 0xf0;
	switch(sccode)
	{
		case 0xE0:   keydata = 0x34; ;
		case 0xd0:   keydata = 0x35; ;
		case 0xb0:   keydata = 0x36; ;
		default:  break;
	}
//	Delayx10ms(10);	
	PC8255 = 0xFb;							//发全"0"行扫描码,列线输入
	_nop_();
	sccode = PC8255 & 0xf0;
	switch(sccode)
	{
		case 0xE0:   keydata = 0x37; break;
		case 0xd0:   keydata = 0x38; break;
		case 0xb0:   keydata = 0x39; break;
		default:  break;
	}
//	Delayx10ms(10);	
	PC8255 = 0xF7;							//发全"0"行扫描码,列线输入
	_nop_();
	sccode = PC8255 & 0xf0;
	switch(sccode)
	{
		case 0xE0:   keydata = 0x2A; break;
		case 0xd0:   keydata = 0x30; break;
		case 0xb0:   keydata = 0x23; break;
		default:  break;
	}
	CS_82C55 = DISABLE;
	return(0);							//无键按下返回为0
}
*/


/*得到键值*/
/*
Byte Getkey(void)
{
	Byte idata byKey;
	KeyInput82C55();
	if(keydata != 0)
	{
		byKey = keydata;	//防重读
        Delayx10ms(30);	 	// 消拌
//	    g_byShortTime = 10;
//		P14 = 0;
//		CountT2 = 100;

	    BeepGetkey(1,6,8);	
		while(1)
		{
			KeyInput82C55();
			if(keydata != byKey)
			{
				return(byKey);
			}	
		}

	}
}

⌨️ 快捷键说明

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