二、mini2440_bsp_key

一、芯片手册

1、板子原理图

 2、GPIO使用

(1)GPxCON

3、GPxDAT 

 二、实现分析

1、初始化led,key

led:            GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out;
key:            GPGCON |= GPG0_in | GPG3_in | GPG5_in | GPG6_in;

2、根据key的电平,设置led电平

dwDat = GPGDAT;             // 读取GPF管脚电平状态
        
if (dwDat & (1<<0))        // K1没有按下
    GPBDAT |= (1<<5);       // LED1熄灭
else    
    GPBDAT &= ~(1<<5);      // LED1点亮
                
if (dwDat & (1<<3))         // K2没有按下
    GPBDAT |= (1<<6);       // LED2熄灭
else    
    GPBDAT &= ~(1<<6);      // LED2点亮
    
if (dwDat & (1<<5)) 	   // K3没有按下
    GPBDAT |= (1<<7);		// LED3熄灭
else	
    GPBDAT &= ~(1<<7);		// LED3点亮
				
if (dwDat & (1<<6)) 		// K4没有按下
	GPBDAT |= (1<<8);		// LED4熄灭
else	
	GPBDAT &= ~(1<<8);		// LED4点亮

三、实现

1、伪代码

1、关闭看门狗
2、初始化led,key
3、根据key的电平设置led

2、启动实现(start.S)

.text
.global _start
_start:
            ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
            mov     r1, #0x0                     
            str     r1, [r0]            @ 写入0,禁止WATCHDOG,否则CPU会不断重启
            
            ldr     sp, =1024*4         @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
                                        @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
            bl      main                @ 调用C程序中的main函数

3、c语言读取key设置led

#define GPGCON      (*(volatile unsigned long *)0x56000060)
#define GPGDAT      (*(volatile unsigned long *)0x56000064)

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

/*
 * LED1,LED2,LED4对应GPB5、GPB6、GPB7、GPB8
 */
#define	GPB5_out	(1<<(5*2))
#define	GPB6_out	(1<<(6*2))
#define	GPB7_out	(1<<(7*2))
#define	GPB8_out	(1<<(8*2))

/*
 * K1,K2,K3,K4对应GPG0,GPG3,GPG5,GPG6
 */
#define GPG0_in     (0<<(0*2))
#define GPG3_in     (0<<(3*2))
#define GPG5_in     (0<<(5*2))
#define GPG6_in     (0<<(6*2))


int main()
{	
    unsigned long dwDat;
    // LED1,LED2,LED3,LED4对应的4根引脚设为输出
    GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out;
        
    // K1,K2,K3,K4对应的4根引脚设为输入
    GPGCON |= GPG0_in | GPG3_in | GPG5_in | GPG6_in;
	
	while(1){
        //若Kn为0(表示按下),则令LEDn为0(表示点亮)
        dwDat = GPGDAT;             // 读取GPF管脚电平状态
        
        if (dwDat & (1<<0))        // K1没有按下
            GPBDAT |= (1<<5);       // LED1熄灭
        else    
            GPBDAT &= ~(1<<5);      // LED1点亮
                
        if (dwDat & (1<<3))         // K2没有按下
            GPBDAT |= (1<<6);       // LED2熄灭
        else    
            GPBDAT &= ~(1<<6);      // LED2点亮
    
		if (dwDat & (1<<5)) 	   // K3没有按下
			GPBDAT |= (1<<7);		// LED3熄灭
		else	
			GPBDAT &= ~(1<<7);		// LED3点亮
				
		if (dwDat & (1<<6)) 		// K4没有按下
			GPBDAT |= (1<<8);		// LED4熄灭
		else	
			GPBDAT &= ~(1<<8);		// LED4点亮
    }
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值