ARM9裸机之GPIO

      转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/20845823

    这两天屌丝博主一直在看GPIO(其实就是I、O口),学过单片机的都知道。这个GPIO是最简单的程序了,我学习的时候俗称点灯。学单片机大多数都从点灯开始的。好了闲话少说开始正题。

    学裸机程序是离不开手册的,所以想写好程序一定要仔细看手册。下面我将设计一个用按键控制LED二进制加减的程序来和小伙伴们交流GPIO。从原理图中能够看出LED是低电平被点亮的,高电平则熄灭。按键呢?按键则是按下去是低电平,没有按下是高电平。原理图介绍完了,然后咱们来说说如何控制他们。I O嘛,当然就是输入输出喽。

假如我想叫LED1量我只需要将该管脚的寄存器设置为输出,然后给他的另一个寄存器一个低电平就OK了。。这里面涉及到两个寄存器。一个是GPBCON这个是控制管脚的状态的,输出为(01)。还有一个是GPBDAT这个是给管脚低电平和高电平的寄存器。这两个就可以决定灯是否亮。按键和这个道理是一样的。

上面的这些都是编写程序的基础。

    现在简单说下程序的思路。程序进入主函数后,进行初始化,将小灯全部熄灭,然后配置IO引脚,先初始化,然后再设置LED引脚为输出。键盘引脚为输入。进入循环如果按下K3小灯则以二进制形式加一。按下K4则减1。

#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))

#define	GPB5_msk	(3<<(5*2))
#define	GPB6_msk	(3<<(6*2))
#define	GPB7_msk	(3<<(7*2))
#define	GPB8_msk	(3<<(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))

#define GPG0_msk    (3<<(0*2))
#define GPG3_msk    (3<<(3*2))
#define GPG5_msk    (3<<(5*2))
#define GPG6_msk    (3<<(6*2))
void  wait(volatile unsigned long dly)
{
	for(; dly > 0; dly--);
}


int main()
{
              //将四个灯初始化全为灭
        GPBDAT = 0x1e0;//111100000
        unsigned long dwDat;
        unsigned long i=1;
        // LED1,LED2,LED3,LED4对应的4根引脚设为输出
        GPBCON &= ~(GPB5_msk | GPB6_msk | GPB7_msk | GPB8_msk);
        GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out;

        // K1,K2,K3,K4对应的4根引脚设为输入
        GPGCON &= ~(GPG5_msk | GPG6_msk);
        GPGCON |=  GPG5_in | GPG6_in;


        while(1)
            {
                        dwDat = GPGDAT;             // 读取GPF管脚电平状态

                        if ((dwDat & (1<<5))==0)          // K3按下了
                               wait(3000000);             //延时消抖动
                                 if ((dwDat & (1<<5))==0)
                                 {

                                        GPBDAT = GPBDAT-32; //减去32就是为了叫第六位(LED1)为0,点亮                                                              第一个小灯

                                        i=i+1;
                                        if(i==15)
                                        {
                                           GPBDAT = 0x1e0;
                                        }
                                 }


                        if ((dwDat & (1<<6))==0)       // K4按下
                               wait(3000000);
                                if ((dwDat & (1<<6))==0)
                                {
                                     GPBDAT = GPBDAT+32;
                                    i=i-1;
                                    if(i==0)
                                    {
                                        i=15;
                                    }
                                }


		     }
    return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若云流风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值