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

📄 key2.c

📁 单片机4×8矩阵键盘的源程序
💻 C
字号:
/*********************************************************************************************/
/*公司名称:四川大学制造学院*/
/*模 块 名:键盘调试程序*/
/*创 建 人:陈朝泽,任德均 日期:2008年8月21日*/
/*功能描述:*/
/*其他说明:1、当操作P4-P7口时,请别忘了用SFRPAGE寄存器设置为F页。
			2、行线为输入,列线为输出。逐列输出低电平,检测输入口电平情况。
			   只要P2口高4位不全为1,则该列有键按下。
			3、横线输入P2经过74LS14N反相后进入MCU,端口为高,则MCU处低;
			   列线输出端P7从MCU出来后经过74LS14N和ULN2003两次反相,端口处电平状态与MCU处一致。*/
/*********************************************************************************************/
 #include "C8051F120.h"
 #define uchar unsigned char
 //#include <intrins.h>		//added

 #define KEYP_H P2  //定义 P2口(高4位)为4×6矩阵键盘的行线输入(通过上拉电阻接+24V)
 #define KEYP_L P7  //定义 P7口(低6位)为4×6矩阵键盘的列线输出

 sbit led1=P5^0;	//测试用
 sbit led2=P5^1;
 sbit led3=P5^2;
 sbit led4=P5^3;
 sbit led5=P5^4;
 sbit led6=P5^5;
 sbit led7=P5^6;
 sbit led8=P5^7;

 uchar key;

 void Reset_Sources_Init()
{
    WDTCN     = 0xDE;
    WDTCN     = 0xAD;
}

void Port_IO_Init()
{
    SFRPAGE   = CONFIG_PAGE;
    P3MDOUT   = 0xFF;
    P4MDOUT   = 0xFF;
    P5MDOUT   = 0xFF;
    P6MDOUT   = 0xFF;
    P7MDOUT   = 0xFF;
    XBR0      = 0x04;
    XBR2      = 0x44;
}

void Oscillator_Init()
{  
	int i = 0;
    SFRPAGE   = CONFIG_PAGE;
    OSCXCN    = 0x67;
    for (i = 0; i < 3000; i++);  		// Wait 5ms for initialization
    while ((OSCXCN & 0x80) == 0);
    CLKSEL    = 0x01;  	
}
void Init_Device(void)
{
    Reset_Sources_Init();
    Port_IO_Init();
    Oscillator_Init();
}

 void delay(long t)
{   
	for(;t>=0;t--);
}

uchar keyscan(void)
{
	uchar scancode,tmpcode,mcode;
	P7 = 0x00;							//P7口发全0列扫描码
	delay(300);
	mcode = P2;
	if((mcode&0xF0) != 0x00)				//若有键按下
	{
		delay(3000);
		mcode = P2;					//延时去抖动
		if((mcode&0xF0) != 0x00)			//延时后再判断一次
		{
			scancode = 0xFE;
			while (scancode != 0xFF)	//逐列扫描
			{
				P7 = scancode;			//输出列扫描码11111110,将之取反,高位为按键所在列
				delay(300);
				mcode = P2;
				if(((mcode&0xF0) != 0x00))	//本列有键按下
				{
					//P5 = 0x00;		//测试用		
					tmpcode = mcode&0xF0;			//检测哪行的电平被拉低,为1的那1行有键按下
					/*
					while (1)			//松手检测
					{	
						mcode = P2;
						if((mcode&0xF0) == 0x00)
						break;	
					}
					*/
					if(scancode==0xDF&&tmpcode==0x10)
						return 0x31;
					else 
						return ((~scancode) + tmpcode);		//返回特征值
				
				}
				else 
				{
					scancode = (scancode<<1)|0x01;		//向高位移动	
				}
			}		
		}
	}
	return 0;	 	
}

void main()
{
	Init_Device();
	while(1)
	{
		key = keyscan();
		switch(key)
		{
			case 0x11:
				led7 = 0;
				break;
			case 0x21:
				led8 = 0;
				break;
			case 0x41:
				led3 = 0;
				break;
			case 0x81:
				led4 = 0;
				break;
			default:
				led7 = 1;
		}
	}
}

⌨️ 快捷键说明

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