按键 led灯实验

来源:互联网 发布:手机数据作图软件 编辑:程序博客网 时间:2024/04/28 03:33

汇编代码部分:

AREA Init,CODE,READONLY
ENTRY
IMPORT Main
ldr r13,=0x1000
b Main
END

c语言部分:

#include <stdio.h>


#define GPBCON(*(volatile unsigned *)0x56000010)
#define GPBDAT (*(volatile unsigned *)0x56000014)
#define GPBUP (*(volatile unsigned *)0x56000018)


#define GPFCON(*(volatile unsigned *)0x56000050)
#define GPFDAT (*(volatile unsigned *)0x56000054)
#define GPFUP (*(volatile unsigned *)0x56000058)


int key1(void)
{
    if ((GPFDAT &= 1)==0)
    return 1;
    else
    return 0;
}


int key2(void)
{
    if ((GPFDAT &= 4)==0)
    return 1;
    else
    return 0;
}


int key3(void)
{
    if ((GPFDAT &= 8)==0)
    return 1;
    else
    return 0;
}


int key4(void)
{
    if ((GPFDAT &= 16)==0)
    return 1;
    else
    return 0;
}


void led1_on(void)
{
GPBDAT &=~(1<<5);
}
void led2_on(void)
{
GPBDAT &=~(1<<6);
}
void led3_on(void)
{
GPBDAT &=~(1<<8);
}
void led4_on(void)
{
GPBDAT &=~(1<<10);
}
void led1_off(void)
{
GPBDAT |=(1<<5);
}
void led2_off(void)
{
GPBDAT |=(1<<6);
}
void led3_off(void)
{
GPBDAT |=(1<<8);
}
void led4_off(void)
{
GPBDAT |=(1<<10);
}


void delay(int time)
{
int i,j;
for (i=0;i<time;i++)
{
for(j=0;j<0xfff;j++);
}
}


int Main(void)
{
GPFUP &=~((1<<0)|(1<<2)|(1<<3)|(1<<4));
GPFCON &=~((3<<0)|(3<<4)|(3<<6)|(3<<8));
GPBCON &=~((3<<5)|(3<<6)|(3<<8)|(3<<10));
GPBCON |=(1<<10)|(1<<12)|(1<<16)|(1<<20);
while(1)
{
if(key1())
led1_on();
else
led1_off();
if(key2())
led2_on();
else
led2_off();
if(key3())
led3_on();
else
led3_off();
if(key4())
led4_on();
else
led4_off();
}
return 0;
}

在实验过程中的错误是:led3 led4一直保持亮的状态,不论按键是不是按下,均保持亮的状态

debug:首先想到的是按键不起作用了,通过查看对应的内存发现确实按键按下后,对应的地址的数值为发生任何变化。

不起作用的原因是:其对应的I/O口的CON寄存器是否设置为输入入状态.结果发现GPFCON &=~((3<<0)|(3<<2)|(3<<3)|(3<<4))了 应该改成GPFCON &=~((3<<0)|(3<<4)|(3<<6)|(3<<8))。最后实验调试成功!!!


原创粉丝点击