1. 程式人生 > >用開關控制LED(五)

用開關控制LED(五)

這個比較簡單,和之前說的控制LED沒有本質的差別。 我們看一下原理圖開關和LED的位置。
這裡開關並不是燈連一起的,我們只能檢測開關狀態然後控制燈。 裸機下不知道怎麼控制中斷暫存器,就先用GPIO的輸入功能先了。 我們把按鍵的gpio設定為輸入功能,led的gpio設定為輸出功能。 一個迴圈來檢測按鍵的狀態,如果按下就給燈的gpio輸出低電平,就點亮。反之就輸出高電平,燈滅了。 原理很簡單,我們這裡主要實現是 位控制。 我們的控制的原則是:不能破壞原來暫存器的狀態,設定暫存器。 這裡涉及到C語言的位操作,這裡主要看C語言的位操作。 這裡見我總結的C語言位運算,詳細見:http://blog.csdn.net/zmnqazqaz/article/details/51266616 下面是程式碼時間: ├── startc.S └── switch_led     ├── led_switch.c     └── Makefile  led_switch.c
#include "../../pub/include/bit.h"
#define P_GPFCON      ((volatile unsigned long *)0x56000050)
#define P_GPFDAT      ((volatile unsigned long *)0x56000054)
#define P_GPGCON      ((volatile unsigned long *)0x56000060)
#define P_GPGDAT      ((volatile unsigned long *)0x56000064)

int  main()
{


        //關閉LED
        setNbit(P_GPFDAT,2,4,0x7);//111
        //按鍵預設擡起
        SetBit(*P_GPFDAT,0);
        SetBit(*P_GPFDAT,2);
        SetBit(*P_GPGDAT,3);

        //1.config
        setNbit(P_GPFCON,2,4*2,0x1);
        setNbit(P_GPFCON,2,5*2,0x1);
        setNbit(P_GPFCON,2,6*2,0x1);

        setNbit(P_GPFCON,2,0*2,0x0);
        setNbit(P_GPFCON,2,2*2,0x0);
        setNbit(P_GPGCON,2,3*2,0x0);

 while(1)
        {
                if(GetBit(*P_GPFDAT,0)==0){
                        ClearBit(*P_GPFDAT,4);//LED1
                }else{
                        SetBit(*P_GPFDAT,4);
                }


                if(GetBit(*P_GPFDAT,2)==0){
                        ClearBit(*P_GPFDAT,5);//LED1
                }else{
                        SetBit(*P_GPFDAT,5);
                }


                if(GetBit(*P_GPGDAT,3)==0){
                        ClearBit(*P_GPFDAT,6);//LED1
                }else{
                        SetBit(*P_GPFDAT,6);
                }
        }
}


這裡首先將led的date暫存器預設值預設是低電平,一設定成輸出燈立刻點亮。  出現的現象就是燈一閃而過,然後可以正常控制了。 所以一開始吧data暫存器設定成高電平就好了。 下面是控制位的實現:
void setNbit(unsigned long *bits, int N, int start_bit, int value)
{
        int mask = 0, i = N;
        while (--i >= 0)
        {
                mask |= (0x1 << i);
        }
        *bits = *bits & (~(mask << start_bit)) | (value << start_bit);
}


void getNbit(unsigned long * bits, int N, int start_bit, int *value)
{
        int mask = 0, i = N;
        while (--i >= 0)
        {
                mask |= (0x1 << i);
        }
        *value = ( *bits >> start_bit) & mask;
}

#define GetBit(dat,i) (    (dat)&( 0x1<<(i)  )?1:0    )
#define SetBit(dat,i) (     (dat)|=( 0x1<<(i) )         )
#define ClearBit(dat,i) (   (dat)&=   ~(0x01<<(i))     )