JZ2440开发笔记(5)——通过按键点亮LED
2014-02-21 15:01
447 查看
在JZ2440中,点亮LED就是给LED的控制位设置为输出,数据位设置为低电平,而通过按键点亮LED,就需要将按键对应的控制位设置为输出。
下面是JZ2440的3个LED电路图:
下面是JZ2440的3个按键的电路图
通过查找nLED_1,nLED_2,nLED_4对应的引脚,发现它们分别对应GPF4,GPF5,GPF6,如图:
通过查找EINT0,EINT2,EINT11对应的引脚,发现它们分别对应GPF0,GPF2,GPG3,如图:
由此,我们再去看2440的Datasheet,查看它们的控制位和数据位的信息,首先是GPF4,GPF5,GPF6的控制位信息,如图:
我们发现,当GPFCON寄存器的GPF4,GPF5,GPF6的控制位设置为01时,表示控制输出,这正是我们想要的。在看看它们的数据位是怎么设置的,如图:
由表格可知,当端口被配置为输出端口时,它的引脚状态和相应的位相同。也就是说,如果我想让LED1亮,那么我就要把它对应的GPF4配置为输出,然后将GPFDAT的第4位设置为0.
再看看按键对应的寄存器怎么配置,上面说到S2,S3,S4对应的控制寄存器相应的位是GPF0,GPF2和GPG3
由于按键是个输入设备,所以我们需要将GPF0,GPF2,GPG3的位设置为00。到此,LED和按键寄存器我们已经配置好了,下面看一下代码:
首先是一段汇编代码,由这段汇编代码引导到main函数,同时进行相应的硬件配置
下面是主程序
下面是JZ2440的3个LED电路图:
下面是JZ2440的3个按键的电路图
通过查找nLED_1,nLED_2,nLED_4对应的引脚,发现它们分别对应GPF4,GPF5,GPF6,如图:
通过查找EINT0,EINT2,EINT11对应的引脚,发现它们分别对应GPF0,GPF2,GPG3,如图:
由此,我们再去看2440的Datasheet,查看它们的控制位和数据位的信息,首先是GPF4,GPF5,GPF6的控制位信息,如图:
我们发现,当GPFCON寄存器的GPF4,GPF5,GPF6的控制位设置为01时,表示控制输出,这正是我们想要的。在看看它们的数据位是怎么设置的,如图:
由表格可知,当端口被配置为输出端口时,它的引脚状态和相应的位相同。也就是说,如果我想让LED1亮,那么我就要把它对应的GPF4配置为输出,然后将GPFDAT的第4位设置为0.
再看看按键对应的寄存器怎么配置,上面说到S2,S3,S4对应的控制寄存器相应的位是GPF0,GPF2和GPG3
由于按键是个输入设备,所以我们需要将GPF0,GPF2,GPG3的位设置为00。到此,LED和按键寄存器我们已经配置好了,下面看一下代码:
首先是一段汇编代码,由这段汇编代码引导到main函数,同时进行相应的硬件配置
.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函数 halt_loop: b halt_loop
下面是主程序
#define GPFCON (*(volatile unsigned long *)0x56000050) #define GPFDAT (*(volatile unsigned long *)0x56000054) #define GPGCON (*(volatile unsigned long *)0x56000060) #define GPGDAT (*(volatile unsigned long *)0x56000064) /* * LED1,LED2,LED4对应GPF4、GPF5、GPF6 */ #define GPF4_out (1<<(4*2)) #define GPF5_out (1<<(5*2)) #define GPF6_out (1<<(6*2)) #define GPF4_msk (3<<(4*2)) #define GPF5_msk (3<<(5*2)) #define GPF6_msk (3<<(6*2)) /* * S2,S3,S4对应GPF0、GPF2、GPG3 */ #define GPF0_msk (3<<(0*2)) #define GPF2_msk (3<<(2*2)) #define GPG3_msk (3<<(3*2)) int main() { unsigned long dwDat; // LED1,LED2,LED4对应的3根引脚设为输出,将这些位清零 //先把9,、9、10、11、12、13位清零,然后或操作设为输出01 GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk); GPFCON |= GPF4_out | GPF5_out | GPF6_out; // S2,S3对应的2根引脚设为输入 GPFCON &= ~(GPF0_msk | GPF2_msk); // S4对应的引脚设为输入 GPGCON &= ~GPG3_msk; while(1){ //若Kn为0(表示按下),则令LEDn为0(表示点亮) dwDat = GPFDAT; // 读取GPF管脚电平状态 if (dwDat & (1<<0)) // S2没有按下 GPFDAT |= (1<<4); // LED1熄灭 else GPFDAT &= ~(1<<4); // LED1点亮 if (dwDat & (1<<2)) // S3没有按下 GPFDAT |= (1<<5); // LED2熄灭 else GPFDAT &= ~(1<<5); // LED2点亮 dwDat = GPGDAT; // 读取GPG管脚电平状态 if (dwDat & (1<<3)) // S4没有按下 GPFDAT |= (1<<6); // LED3熄灭 else GPFDAT &= ~(1<<6); // LED3点亮 } return 0; }
相关文章推荐
- Linux驱动开发之S3C2440按键点亮LED
- jz2440裸板开发之GPIO:点亮一个led灯(1)
- Linux驱动开发之S3C2440按键点亮LED
- jz2440裸板开发之GPIO:用按键控制led
- Linux驱动开发之S3C2440按键点亮LED
- 【nRF51822蓝牙开发笔记】点亮LED灯
- JZ2440学习过程-----第一课 汇编点亮S3C2440A的LED1
- S3C2440按键查询方式点亮LED汇编程序
- JZ2440开发笔记(2)——minicom的安装和配置使用
- JZ2440开发笔记(6)——存储控制器
- Linux驱动开发--通过按键控制led灯
- ARM9/ARM11裸机开发笔记1之MDK开发环境和点亮LED
- 嵌入式驱动开发笔记(裸机程序篇)---点亮LED灯
- JZ2440开发笔记(7)——2440启动方式
- stm8单片机点亮LED中断定时串口读写功能测试笔记
- play framework如何进行模块化开发--学习笔记(借鉴同事、博客等资料自己试验通过!)
- (3)51单片机入门案列-一个按键实现点亮LED和开启蜂鸣器
- Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例
- jz2440裸板开发之:外部中断
- STM32学习笔记1:点亮第一盏LED灯