隔了这么久才来写这篇,HW加班太多,没办法。
1、硬件电路图
本节实验很简单,按下S1,让LED1亮起来,再按下S1,让LED1灭掉,是不是很简单啊。
首先要做的是识别按键被按下,可以看到按键弹起来的时候P0.0经过一个R10电阻接到3.3V上,也就是P0.0引脚是高电平,按键按下的时候P0.0直接连到GND上,当然是低电平0了,所以只要当P0.0的电平状态从高跳变到低的时候就是按键被按下了,这个时候只要去改变P1.0来控制LED1亮灭即可,很简单吧。
2、相关寄存器
P0SEL | P0[7:0]功能设置寄存器,默认设置为普通I/O口 |
P0INP | P0[7:0]作为输入口时电路模式寄存器,可以设置为输入上下拉等 |
P0 | P0[7:0]可以位寻址的I/O寄存器 |
P0DIR | P0口输入输出设置寄存器 |
3、代码实现
定义按键口,然后是LED和按键的初始化,P1.0和P1.1设置为输出,P0.0和P0.1设置输入
#define CODE_KEY1 0x01
#define CODE_KEY2 0x02
void InitLed()
{
P1DIR |= 0x03;
LED1 = 0;
LED2 = 0;
}
void InitKey()
{
P0SEL &= ~0x03;
P0DIR &= ~0x03;
P0INP &= ~0x03;
}
扫描按键,读取键值
uchar KeyScan()
{
uchar code = 0x00;;
if(KEY1 == 0) {
Delayms(10);
if(KEY1 == 0) {
while(!KEY1);
code |= CODE_KEY1;
}
} else if(KEY2 == 0) {
Delayms(10);
if(KEY2 == 0) {
while(!KEY2);
code |= CODE_KEY2;
}
}
return code;
}
下面是全部代码,仅供参考。
#include <ioCC2540.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0
#define LED2 P1_1
#define KEY1 P0_0
#define KEY2 P0_1
#define CODE_KEY_NONE 0
#define CODE_KEY1 0x01
#define CODE_KEY2 0x02
void Delayms(uint);
void InitLed(void);
void InitKey();
uchar KeyScan();
void Delayms(uint ms)
{
uint i, j;
for(i = ms; i > 0; i--)
for(j = 587; j > 0; j--);
}
void InitLed()
{
P1DIR |= 0x03;
LED1 = 0;
LED2 = 0;
}
void InitKey()
{
P0SEL &= ~0x03;
P0DIR &= ~0x03;
P0INP &= ~0x03;
}
uchar KeyScan()
{
uchar code = 0x00;;
if(KEY1 == 0) {
Delayms(10);
if(KEY1 == 0) {
while(!KEY1);
code |= CODE_KEY1;
}
} else if(KEY2 == 0) {
Delayms(10);
if(KEY2 == 0) {
while(!KEY2);
code |= CODE_KEY2;
}
}
return code;
}
void main(void)
{
uchar code;
InitLed();
InitKey();
while(1) {
code = KeyScan();
if(code & CODE_KEY1) {
LED1 = !LED1;
} else if(code & CODE_KEY2) {
LED2 = !LED2;
}
}
}