用開關控制LED(五)
阿新 • • 發佈:2019-02-20
這個比較簡單,和之前說的控制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
這裡首先將led的date暫存器預設值預設是低電平,一設定成輸出燈立刻點亮。 出現的現象就是燈一閃而過,然後可以正常控制了。 所以一開始吧data暫存器設定成高電平就好了。 下面是控制位的實現:
這裡開關並不是燈連一起的,我們只能檢測開關狀態然後控制燈。 裸機下不知道怎麼控制中斷暫存器,就先用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)) )