汇编代码部分:
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))。最后实验调试成功!!!