C언어로 라즈베리파이4 레지스터 접근하여 LED점멸시키기
를 해봤는데
이번에는 버튼을추가해서 버튼을 누르면 LED가 켜지고 손을 떼면 LED가 꺼지게 됩니다.
지난번 글에서 해놓았던 GPIO18번에는 LED가 연결되어 있습니다.
GPIO17번으로부터 값을 가져오기 떄문에 17번비트의 값이 1인지 여부만 알면 됩니다.
버튼을 누르게 되면 5V가 핀으로 입력되어서 해당핀에대응되는 비트는 1로 변경되기 때문입니다.
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#define GPIO_BASE 0x3F200000
#define GPFSEL1 0x04
#define GPLEV0 0x34
#define GPSET0 0x1C
#define GPCLR0 0x28
int main()
{
int fd = open( "/dev/gpiomem", O_RDWR|O_SYNC );
if ( fd < 0 ){
printf( "can't open /dev/gpiomem \n" );
exit(-1);
}
char *gpio_memory_map = (char *)mmap( 0, 4096, PROT_READ|PROT_WRITE,
MAP_SHARED, fd, GPIO_BASE );
if ( gpio_memory_map == MAP_FAILED )
{
printf( " Error : mmap \n" );
exit(-1);
}
volatile unsigned int* gpio = (volatile unsigned int*)gpio_memory_map;
gpio[GPFSEL1/4] |= (1<<24);
while(1)
{
int input = gpio[GPLEV0/4] & (0x01<<17);
if ( input > 0 )
gpio[GPSET0/4] |= (1<<18);
else
gpio[GPCLR0/4] |= (1<<18);
}
munmap( gpio_memory_map, 4096);
return 0;
}
컴파일할때는
pi@raspberrypi:~$ g++ btn.c -o btn
실행은
pi@raspberrypi:~$ sudo ./btn
으로 실행하시면 버튼을 누르고 있을때 led가 켜지고 손을떼면 led가 꺼지는 것을 확인할 수 있습니다
'라즈베리파이' 카테고리의 다른 글
라즈베리파이 GPIO를 사용한 주차장차단바 (텀프로젝트, TermProject) (0) | 2020.12.18 |
---|---|
C언어로 라즈베리파이4 GPIO 레지스터 접근하여 LED점멸시키기 (0) | 2020.11.03 |
Win32 Disk Imager로 SD카드에 라즈비안 설치하기 (0) | 2020.08.27 |
라즈비안 이전버전 다운로드하기 (0) | 2020.08.27 |