7.零基础入门二

零基础入门二

KEY原理图(按键按下,引脚电平是0)

1.独立按键

按键读取在P3_4到P3_7


2.矩阵键盘

先选择行,再选择列

模块化函数

1.按键读取函数

独立键盘

unsigned char Key_Read()
{
	unsigned char temp=0;
	if(P3_4 ==0) temp=1;
	if(P3_5 ==0) temp=2;
	if(P3_6 ==0) temp=3;
	if(P3_7 ==0) temp=4;
	return temp;
}

矩阵键盘

unsigned char Key_Read()
{
	unsigned char temp=0;
	P3_0=0;P3_1=1;P3_2=1;P3_3=1;
	if(P3_4 ==0) temp=1;
	if(P3_5 ==0) temp=2;
	if(P3_6 ==0) temp=3;
	if(P3_7 ==0) temp=4;
	P3_0=1;P3_1=0;P3_2=1;P3_3=1;
	if(P3_4 ==0) temp=5;
	if(P3_5 ==0) temp=6;
	if(P3_6 ==0) temp=7;
	if(P3_7 ==0) temp=8;
	P3_0=1;P3_1=1;P3_2=0;P3_3=1;
	if(P3_4 ==0) temp=9;
	if(P3_5 ==0) temp=10;
	if(P3_6 ==0) temp=11;
	if(P3_7 ==0) temp=12;
	P3_0=1;P3_1=1;P3_2=1;P3_3=0;
	if(P3_4 ==0) temp=13;
	if(P3_5 ==0) temp=14;
	if(P3_6 ==0) temp=15;
	if(P3_7 ==0) temp=16;
	return temp;
}

按键读取

Key_Val=Key_Read();//读取键码值
Key_Down=Key_Val&(Key_Val^Key_Old);//检测下降沿
Key_Up=~Key_Val&(Key_Val^Key_Old);//检测上升沿
Key_Old=Key_Val;//扫描辅助变量

彩灯控制系统

例子一

#include <REGX52.H>
#include <Seg.h>
#include <Key.h>
#include <intrins.h>

unsigned char Seg_Pos;
unsigned char Seg_Buf[]={10,10,10,10,10,10};
unsigned int time=500;
unsigned char Key_Val,Key_Down,Key_Old,Key_Up;
bit System_Flag=1;
unsigned char mode=1;
unsigned char ucLed=0xfe;
unsigned char Seg_34[]={0x7e,0xbd,0xdb,0xe7};
unsigned int Seg_34_Flag=1;

void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}
void Timer0Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
}
void Timer0Server() interrupt 1
{
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	if(++Seg_Pos == 6) Seg_Pos = 0;
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
}

void main()
{
	Seg_Disp();
	//Timer0Init();
	while(1)
	{
		Key_Read();
		Key_Val=Key_Read();
		Key_Down=Key_Val&(Key_Val^Key_Old);
		Key_Up=~Key_Val&(Key_Val^Key_Old);
		switch(Key_Down)
		{
			case 1:
				System_Flag=1;
			break;
			case 2:
				System_Flag=0;
			break;
			case 3:
				mode++;
				if(mode==5) mode=1;
			break;
			case 4:
				mode--;
				if(mode==0) mode=4;
			break;
		}
		if(System_Flag==1)
		{
			//Seg_Disp(1,mode);
			//Seg_Disp(3,8);
			switch(mode)
			{
				case 1:
					P1=ucLed;
					Delay(time);
					ucLed=_crol_(ucLed,1);
				break;
				case 2:
					P1=ucLed;
					Delay(time);
					ucLed=_cror_(ucLed,1);
				break;
				case 3:
					P1=Seg_34[Seg_34_Flag-1];
					Delay(time);
					Seg_34_Flag++;
					if(Seg_34_Flag==5)Seg_34_Flag=1;
				break;
				case 4:
					P1=Seg_34[Seg_34_Flag-1];
					Delay(time);
					Seg_34_Flag--;
					if(Seg_34_Flag==0)Seg_34_Flag=4;
				break;
			}
		}
		if(System_Flag==0)
		{
			//Seg_Disp(3,9);
			P1=ucLed;
			Delay(time);
		}
	}
}

例子二

#include <REGX52.H>
#include <intrins.h>
#include <Delay.h>
#include <Key_Read.h>

//变量声明区域
unsigned char Led_Mode=0;//流水灯显示模式
unsigned char ucLed=0xfe;//1111 1110
unsigned char ucLed_34_Date[4]={0x7e,0xbd,0xdb,0xe7};
unsigned char ucLed_34_Date_Index;//用于改变数组的变量
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
unsigned char Time=500;
bit System_Flag=1;//流转状态标识位 0-停止 1-启动


void main()
{
	while(1)
	{
		Key_Read();
		Key_Val=Key_Read();//读取键码值
		Key_Down=Key_Val&(Key_Val^Key_Old);//检测下降沿
		Key_Up=~Key_Val&(Key_Val^Key_Old);//检测上升沿
		Key_Old=Key_Val;//扫描辅助变量
		
		switch(Key_Down)
		{
			case 1:
				System_Flag=1;
			break;
			case 2:
				System_Flag=0;
			break;
			case 3:
				Led_Mode++;
				if(Led_Mode==4)Led_Mode=0;
			break;
			case 4:
				Led_Mode--;
				if(Led_Mode==255)Led_Mode=3;//unsigned char类型变量 0-1=255
			break;	
		}

		if(System_Flag==1)
		{
			switch(Led_Mode)
			{
				case 0:
					ucLed=_crol_(ucLed,1);
					P1=ucLed;
					Delay(Time);
				break;
				case 1:
					ucLed=_cror_(ucLed,1);
					P1=ucLed;
					Delay(Time);
				break;
				case 2:
					P1=ucLed_34_Date[ucLed_34_Date_Index];
					Delay(Time);
					ucLed_34_Date_Index++;
				if(ucLed_34_Date_Index==4)ucLed_34_Date_Index=0;
				break;
				case 3:
					P1=ucLed_34_Date[ucLed_34_Date_Index];
					Delay(Time);
					ucLed_34_Date_Index--;
				if(ucLed_34_Date_Index==255)ucLed_34_Date_Index=4;
				break;
			}
		}
	}
}