本实验是用两个按键分别控制小灯的亮灭。在这个实验里用到的寄存器分别是P0,P1,P0SEL,P0DIR,P1DIR和P0INP。
P0/P1:P0/P1口寄存器;
P0SEL:P0功能选择寄存器,主要是选择相应位的功能(0,普通I/O;1,外设功能)。
P0DIR/P1DIR:P0/P1口方向选择寄存器,主要是选择相应位的方向(0,输入;1,输出)。
P0INP:P0口输入模式寄存器,(0,上拉;1,下拉)。
两个LED灯的管脚分别为P1_0和P1_1,其中,功能选择(P0SEL)定义为普通IO输出;方向选择P0DIR定义为输出
K键对应的是P0_5,CANCEL键对应的是P0_4,UP/DOWN/LEFT/RIGHT键对应的是P0_6
设置这几个按键的管脚的步骤分别是:功能选择(P0SEL),方向选择(P0DIR),输入模式选择(P0INP)。源代码见下:
按下确定按钮LED灯亮,再按一下灯灭,取消按钮也是一样的效果。
#define K1 P0_4 //按键引脚定义,以便控制红灯
#define K2 P0_5
void InitKey(void) //按键引脚初始化
{
P0SEL &= ~0X30;
P0DIR &= ~0X30;
P0INP |= 0x30; //三态
}
uchar KeyScan(void) //按键扫描函数
{
if(K1 == 0) //低电平有效
{
Delay(100); //检测到按键
if(K1 == 0)
{
while(!K1); //直到松开按键
return(1);
}
}
if(K2 == 0)
{
Delay(100);
if(K2 == 0)
{
while(!K2);
return(2);
}
}
return(0);
}
void Initial(void)//LED引脚初始化
{
P1DIR |= 0x03; //P10、P11定义为输出
RLED = 1;
YLED = 1; //LED
}
void main(void)
{
Initial(); //调用初始化函数
InitKey();
RLED = OFF; //LED1
YLED = OFF; //LED2
while(1)
{
Keyvalue = KeyScan();
if(Keyvalue == 1)
{
RLED = !RLED; //red
Keyvalue = 0; //清除键值
}
if(Keyvalue == 2)
{
YLED = !YLED; //green
Keyvalue = 0;
}
}
}
来源:https://www.cnblogs.com/LakeFollow/archive/2012/07/06/2579179.html