ARM 实验报告
姓名: 学号: 专业: 学院: 指导老师:
一、GPIO输出与按键控制实验——按键控制流水灯实验 实验原内容:
通过数组认为定义流水灯花样; 一个按键控制一种流水灯花色;
实验电路图:
源程序:
#include \#include \
/* 名称:DelayNS() 功能:长软件延时 入口参数:dly 延时参数,值越大,延时越久**/
void DelayNS(uint32 dly) { uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);}
/** 函数名称:main() 函数功能:GPIO输出测试,花样流水灯。*/
const uint32 LED_TBL[8][10] = { 花样流水灯,注意调用时候用了取反操作 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // 全部点亮 {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xFF}, // 依次逐个点亮
{0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF}, // 依次逐个叠加 {0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0xFF}, // 依次逐个递减 {0x00, 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, 0xFF}, // 两个靠拢后分开 {0x00, 0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81, 0xFF}, // 从两边叠加后递减 {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xFF, 0xFF}, {0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF} };
/** 函数名称:keyscan() 函数功能:按键扫描,每按一次键对相应的LED进行取反*/ void keyscan(void) { uint32 i,j,k,m;
PINSEL0 = 0x00000000;
// 设置管脚连接GPIO IO0DIR = 0x000000ff; k=IO0PIN;
if((k&keycon)!=keycon)
{ for(j=0; j<50000; j++);//延时去抖 k=IO0PIN;
if((k&keycon)!=keycon) { i=(k&keycon)|(~keycon); i=~i; switch(i) { case KEY1 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[0][m]));DelayNS(3);IO0CLR = ((LED_TBL[0][m]));DelayNS(3);} break; case
KEY2 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[1][m]));DelayNS(3);IO0CLR = ((LED_TBL[1][m]));DelayNS(3);} break; case
KEY3 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[2][m]));DelayNS(3);IO0CLR = ((LED_TBL[2][m]));DelayNS(3);} break; case
KEY4 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[3][m]));DelayNS(3);IO0CLR = ((LED_TBL[3][m]));DelayNS(3);} break; case
KEY5 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[4][m]));DelayNS(3);IO0CLR = ((LED_TBL[4][m]));DelayNS(3);} break; case
KEY6 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[5][m]));DelayNS(3);IO0CLR = ((LED_TBL[5][m]));DelayNS(3);} beak; case
KEY7 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[6][m]));DelayNS(3);IO0CLR = ((LED_TBL[6][m]));DelayNS(3);} break;
case
KEY8 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[7][m]));DelayNS(3);IO0CLR = ((LED_TBL[7][m]));DelayNS(3);} break; } } while((k&keycon)!=keycon) k=IO0PIN; } }
/* 函数名称:main()
* 函数功能:每按一次键,对相应LED的状态取反*/
int main(void) {
TargetResetInit();
PINSEL0 =0x00000000; // 设置所
有管脚连接GPIO
PINSEL1 =0x00000000;
IO0DIR = 0x000000ff; // 设
置P0.0-P0.7为输出,其余为输入 IO0CLR = 0xffffffff; while(1)
{ keyscan(); }}
二、GPIO输出实验——流水灯实验 实验内容:
通过数组认为定义流水灯花样; 有六种花样的流水灯依次闪烁;
实验电路图:
源程序:
#include \
/** 函数名称:DelayNS()函数功能:长软件延时入口参数:dly 延时参数,值越大,延时越久*/
void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<50000; i++);} /** 函数名称:main() 函数功能:GPIO输出测试,花样流水灯。*/ const uint32 LED_TBL[] = { // 花样流水灯,注意调用时候用了取反操作 0x00, 0xFF, // 全部熄灭后,再全部点亮 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // 依次逐个点亮 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // 依次逐个叠加 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, // 依次逐个递减 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, // 两个靠拢后分开 0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81 };// 从两边叠加后递减 int main (void) { uint8 i;
PINSEL0 = 0x00000000; // 设置管脚连接GPIO IO0DIR = 0x000000ff; // 设置P0.0-P0.7控制口为输出 while (1) { for (i=0; i<42; i++) // 花样流水灯显示 { IO0SET = ~((LED_TBL[i]));DelayNS(3);IO0CLR = ((LED_TBL[i]));DelayNS(3); }}}
三、单路按键控制LED/蜂鸣器 实验内容:
按键key1一按,蜂鸣器响,LED灯亮;
实验电路图:
源程序:
#include \
#define BEEP 1<<7 //P0.7控制蜂鸣器,低电平蜂鸣 #define KEY1 1<<8
/* 函数名称:DelayNS() 函数功能:长软件延时* 入口参数:dly 延时参数,值越大,延时越久 出口参数:无*******/ void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<50000; i++); }
/** 函数名称:main()** 函数功能:用P0.7控制BEEP,让蜂鸣器蜂鸣*/ int main (void) { PINSEL0 = 0x00000000; // 设置引脚连接GPIO PINSEL1 = 0x00000000; IO0DIR = BEEP; // 设置BEEP控制口为输出 while (1) { if((IO0PIN & KEY1) == 0)IO0CLR = BEEP; else IO0SET = BEEP;}}