零基础入门二
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;
}
}
}
}


