点亮LED灯

论坛 期权论坛 脚本     
匿名技术用户   2020-12-29 14:20   32   0

实验一:点亮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;

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP