|
实验一:点亮LED1
在jz2440开发板中的LED1是通过上拉方式接入GPF4,要经过以下两种方式进行配置:
《1》将该GPIO配置为输出功能
《2》设置该GPIO输出为低电平
GPF4对应的是位是[9:8]:

有关GPF4的相关寄存器(GPFCON和GPFDAT)的地址:

汇编编写:

C语言编写:
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
int main()
{
GPFCON=0x00000100; //这样简单粗暴的赋值可能破坏其他引脚的功能
GPFDAT=0X00000000;
return 0;
}
在宏定义中关键字volatile的作用:防止编译器对代码进行优化。
实验二:轮流点亮三盏灯
LED1 ->GPF4(上拉方式)[9:8]
LED2 ->GPF5(上拉方式)[11:10]
LED3 ->GPF6(上拉方式)[13:12]
C语言编写:
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile undigned long *)0x56000054)
#define GPF4_OUT (1<<(4*2)) //[9:8]-->01
#define GPF5_OUT (1<<(5*2)) //[11:10]-->01
#define GPF6_OUT (1<<(6*2)) //[13:12]-->01
int main()
{
void Delay_ms(volatile int);
unsigned int i=1;
GPFCON |=GPF4_OUT | GPF5_OUT | GPF6_OUT; //将GPFCON配置为输出
while(1)
{
GPFDAT &= (~(i<<4)); //1,3,7
if(++i=8)
i=1;
Delay_ms(3000);
}
return 0;
}
void Delay_ms(volatile int ms) //延时函数
{
unsigned int i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
实验三:通过按键来控制LED灯
LED1 ->GPF4(上拉方式)[9:8]
LED2 ->GPF5(上拉方式)[11:10]
LED3 ->GPF6(上拉方式)[13:12]
KEY1 ->GPF0(上拉方式)[1:0](JZ2440GPIO引脚用于检测,从寄存器中读值,即作为输入)
KEY2 ->GPF2(上拉方式)[5:4]
KEY3 ->GPG3(上拉方式)[7:6]
有关GPG相关寄存器地址:

代码:
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPFDAT (*(volatile undigned long *)0x56000064)
#define GPF4_OUT (1<<(4*2))
#define GPF5_OUT (1<<(5*2))
#define GPF6_OUT (1<<(6*2))
#define GPF4_RESET (3<<(4*2))
#define GPF5_RESET (3<<(5*2))
#define GPF6_RESET (3<<(6*2))
#define GPF0_IN (3<<(2*0))
#define GPF2_IN (3<<(2*2))
#define GPG3_IN (3<<(3*2))
int main()
{
GPFCON & =~(GPF4_RESET | GPF5_RESET | GPF6_RESET);
GPFCON | =GPF4_OUT | GPF5_OUT |GPF6_OUT; //将GPF4,5,6设置为输出
GPFCON & = ~(GPF0_IN |GPF2_IN|GPG3_IN); //将GPF0,2和GPG3设置为输入
while(1)
{
if(GPFDAT &(1<<0)) //按键1未按下
GPFDAT |=(1<<4); //灯熄灭
else GPFDAT &=~(1<<4);
if(GPFDAT &(1<<2)) //按键2未按下 GPFDAT |=(1<<5); //灯熄灭 else GPFDAT &=~(1<<5); if(GPGDAT &(1<<3)) //按键3未按下
GPFDAT |=(1<<6); //灯熄灭 else GPFDAT &=~(1<<6);
} return 0;
}
|