GPIO实验内容
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GPIO实验内容:(GPIO设置见课件5-7,5-9)
1.2.10_GPIO OUT1
2.2.11_GPIO OUT2
3.2.12_GPIO INPUT
4.输入输出综合实验(查询方式,1S由软件延时控制):要求:每按一次KEY键,同时要求LED1~LED8循环点亮。
1)初始状态或按下KEY键(松开后保持),同时点亮间隔的
两只LED灯,每隔1秒右循环显示,移到LED8后回到
LED1。
LED1LED8
2)按下KEY键(松开后保持),开始点亮LED1灯,隔1秒
后点亮LED1、2,再隔1秒点亮123,1234全亮后再隔
1秒熄灭1234且点亮5678,后又678,再后78、再8后
回到只有LED1灯亮再次循环。
LED1LED8
LED1LED8
—程序—
/**************************************************************************** * 文件名:main0.c
* 功能:LED显示控制。
* 通过GPIO控制8个LED点亮,通过开关控制其点亮方式
****************************************************************************/ #include "config.h"
#define LED1 1<<16 // P0.16
#define LED2 1<<17 // P0.17
#define LED3 1<<18 // P0.18
#define LED4 1<<19 // P0.19
#define LED5 1<<20 // P0.20
#define LED6 1<<21 // P0.21
#define LED7 1<<22 // P0.22
#define LED8 1<<23 // P0.23
#define LEDCON 0x00ff0000 //配置LED及KEY控制I/O方向
#define KEY0x00008000 //P0.15控制亮灯方式
const uint32 DISP_TAB[8] = { 0xff01ffff, 0xff02ffff, 0xff04ffff, 0xff08ffff,
0xff10ffff, 0xff20ffff, 0xff40ffff, 0xff80ffff};
//全局变量定义
uint8 i;
/**************************************************************************** * 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/ void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<5000; i++);
}
}
/****************************************************************************** *名称:main1()
*功能:执行第一种亮灯方式,开关按下结束。
******************************************************************************/ void main1(void)
{ int j=0;
while(1)
{
for(i=0; i<6; i++)
{
IOCLR = DISP_TAB[i] | DISP_TAB[i+2]; // 输出LED显示数据
DelayNS(100); // 延时
IOSET = 0xffffffff;
if((IOPIN&KEY)==0){j=1; break;} //开关按下,熄灭所有的LED,按键标志置1并跳出循环体
}
if(j==1) break; //按键标志为1时,返回主函数}
}
/****************************************************************************** *名称:main2()
*功能:执行第二种亮灯方式,开关按下结束。
******************************************************************************/ void main2(void)
{ int j=0;
while(1)
{
IOCLR=0;
for(i=0; i<8 ;i++)
{
if(i<4)
{
IOCLR = IOCLR|DISP_TAB[i] ; // 依次点亮LED1-LED4
DelayNS(100); // 延时
if(i==3)
{
IOSET = 0xff0fffff; // 熄灭LED1-LED4
IOCLR = 0xfff0ffff; // 点亮LED5-LED8
DelayNS(100); // 延时
}
}
else
{
IOSET = IOSET|DISP_TAB[i] ; // 依次熄灭LED5-LED8
DelayNS(100); // 延时
}
if((IOPIN&KEY)==0)
{
IOSET = 0xffffffff; //开关按下,熄灭所有的LED
j=1; break; //并且将按键标志置1,跳出循环体
}
}
if(j==1) break; //按键标志为1时,返回主函数
}
}
/**************************************************************************** * 名称:main()
* 功能:根据表DISP_TAB来控制LED显示。
****************************************************************************/ int main(void)
{
PINSEL0=0x00000000; //设置P0.15-P0.23引脚功能为GPIO
PINSEL1=0x00000000;
IODIR = LEDCON; //设置P0.15为输入,P0.15-P0.23为输出
IOSET = 0xffffffff;
while(1)
{
main1();
main2();
}
return(0);
}
分析
第一种点亮方式:
{
for(i=0; i<6; i++)
{
IOCLR = DISP_TAB[i] | DISP_TAB[i+2]; // 输出LED显示数据
DelayNS(100); // 延时
IOSET = 0xffffffff;
}
}
第二种点亮方式:
{
IOCLR=0;
for(i=0; i<8 ;i++)
{
if(i<4)
{
IOCLR = IOCLR|DISP_TAB[i] ; // 依次点亮LED1-LED4
DelayNS(100); // 延时
if(i==3)
{
IOSET = 0xff0fffff; // 熄灭LED1-LED4
IOCLR = 0xfff0ffff; // 点亮LED5-LED8
DelayNS(100); // 延时
}
}
else
{
IOSET = IOSET|DISP_TAB[i] ; // 依次熄灭LED5-LED8
DelayNS(100); // 延时
}
}
}
为了让开关控制LED点亮方式,必须让上述两种点亮方式分别位于两个死循环中,然后在死循环中判断开关是否按下。
若已按下,那么熄灭当前所有的LED,按键标志置1并跳出该次循环,再退出当前死循环返回到主函数中。