单片机
返回首页

JZ2440开发笔记(5)——通过按键点亮LED

2020-02-21 来源:eefocus

  在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函数,同时进行相应的硬件配置

.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;

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章