FND 여러개 작동
- FND(S0~S5)에 숫자 출력
- FND_SEL 포트의 S0~S5 핀에 LOW신호를 출력하여 FND를 선택
- FND_DB 포트의 해당하는 LED segment(A~H)에 HIGH 신호를 출력하여 ON/OFF
< FND1.c >
// GPIO Acccess Liabrary
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
// 각 FND와 연결된 라즈베리파이 핀(S0, S1, …, S5) => FND_SEL port
const int FndSelectPin[6] = { 4, 17, 18, 27, 22, 23 };
// FND의 LED와 연결된 라즈베리파이 핀(A, B, …, H) => FND_DB
const int FndPin[8] = { 6, 12, 13, 16, 19, 20, 26, 21 };
// FND에 출력되는 0~9 까지의 비트값 배열
const int FndFont[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67 };
// 초기화 함수, WiringPi 라이브러리 초기화, Select 핀 및 LED 핀 초기화를 담당)
void Init(){
int i;
if(wiringPiSetupGpio()==-1){
printf("Wiringpi Error!");
exit(-1);
}
for(i=0; i<6; i++){
pinMode(FndSelectPin[i], OUTPUT);
digitalWrite(FndSelectPin[i], HIGH); // FND_SEL은 LOW가 Select하는 것임을 주의!
}
for( i = 0; i < 8; i++ ) {
pinMode( FndPin[i], OUTPUT ); // LED 핀을 출력으로 설정
digitalWrite( FndPin[i], LOW ); // LED 핀을 OFF
}
}
// FND 출력함수 => 해당하는 position에 숫자 출력
void FndDisplay(int position, num){
int i, j;
int flag = 0; // FNDpin[i]을 ON/OFF하기 위한 flag
int shift = 0x01; // FndFont와 And연산하여 출력할 LED 상태 결정
for(i=0; i<8; i++){
flag = (FndFont[num] & shift); // 만약 i=0, FndFont[0]=0x3F이라 하면, (0b00111111 & 0b00000001)이 된다.
digitalWrite(FndPin[i], flag); // FndPin[i]를 flag(0또는1)로 ON.OFF
shift << =1; // 왼쪽으로 1비트 shift한다. 0b00000001 -> 0b00000010
}
digitalWrite(FndSelectPin[position], LOW); // position으로 받은 FND를 선택
}
int main( int argc, char **argv ) {
// FND_SEL과 출력할 숫자를 입력
if( argc != 3) {
printf( “Usage: %s [ position ] [ number ] ”, arvg[ 0 ] );
exit( -1 );
}
Init();
// argv[1] = position, argv[2] = number, argv는 문자 스트링이므로 정수로 변환
// int atoi( const char *string )
FndDisplay( atoi( argv[1] ), atoi( argv[2] ) );
return 0;
}
gcc -o FND1 FND1.c
./FND1 3 5
글자 출력 및 shift 하기
- 'HELLO'를 FND에 출력
- 0.5초 간격으로 왼쪽으로 shift하고, 다시 오른쪽부터 나타남이 반복되게 동작
// GPIO Acccess Liabrary
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
// 각 FND와 연결된 라즈베리파이 핀(S0, S1, …, S) => FND_SEL port
const int FndSelectPin[6] = { 4, 17, 18, 27, 22, 23 };
// FND의 LED와 연결된 라즈베리파이 핀(A, B, …, H) => FND_DB
const int FndPin[8] = { 6, 12, 13, 16, 19, 20, 26, 21 };
// FND에 출력되는 0~9 까지의 비트값 배열
const int FndFont[5] = { 0x76, 0x79, 0x38, 0x38, 0x3F}; // H, E, L, L, O
// 초기화 함수, WiringPi 라이브러리 초기화, Select 핀 및 LED 핀 초기화를 담당)
void Init(){
int i;
if(wiringPiSetupGpio()==-1){
printf("Wiringpi Error!");
exit(-1);
}
for(i=0; i<6; i++){
pinMode(FndSelectPin[i], OUTPUT);
digitalWrite(FndSelectPin[i], HIGH); // FND_SEL은 LOW가 Select하는 것임을 주의!
}
for( i = 0; i < 8; i++ ) {
pinMode( FndPin[i], OUTPUT ); // LED 핀을 출력으로 설정
digitalWrite( FndPin[i], LOW ); // LED 핀을 OFF
}
}
// FND를 선택하는 함수, S0 ~ S4 중 파라미터(position)에 해당하는 FND 선택
void FndSelect (int position) {
int i;
for( i = 0; i < 5; i++ ) {
if( i == position ) {
digitalWrite( FndSelectPin[ i ], LOW ); // 선택된 FND의 Select 핀 ON
}
else {
digitalWrite( FndSelectPin[ i ], HIGH ); // 선택되지 않은 FND의 Select 핀 OFF
}
}
}
// FND 출력함수 => 해당하는 position에 숫자 출력
void FndDisplay(int position, int num){
int i, j;
int flag = 0; // FNDpin[i]을 ON/OFF하기 위한 flag
int shift = 0x01; // FndFont와 And연산하여 출력할 LED 상태 결정
for(i=0; i<8; i++){
flag = (FndFont[num] & shift); // 만약 i=0, FndFont[0]=0x3F이라 하면, (0b00111111 & 0b00000001)이 된다.
digitalWrite(FndPin[i], flag); // FndPin[i]를 flag(0또는1)로 ON.OFF
shift << =1; // 왼쪽으로 1비트 shift한다. 0b00000001 -> 0b00000010
}
FndSelect(position); // position으로 받은 FND를 선택
}
int main() {
int pos;
int i = 0;
int data[5] = {0, 1, 2, 3, 4}; // HELLO
Init();
unsigned int time = millis(); // 출력을 계속 유지시키기 위함
while(1){
for(pos=0; pos<5; pos++){
FndDisplay((pos+i)%5, data[pos]); // circular 하기 위함
delay(1);
}
if(millis()-time > 500){ // 500ms 지나야 i가 바뀌면서 Pos에 i가 더해짐.
i = (i+1) % 5;
time = millis();
}
return 0;
}
}
타이머 설정
- 0.01초 단위로 timer 출력
< FND3.c >
// GPIO Acccess Liabrary
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
// 각 FND와 연결된 라즈베리파이 핀(S0, S1, …, S) => FND_SEL port
const int FndSelectPin[6] = { 4, 17, 18, 27, 22, 23 };
// FND의 LED와 연결된 라즈베리파이 핀(A, B, …, H) => FND_DB
const int FndPin[8] = { 6, 12, 13, 16, 19, 20, 26, 21 };
// FND에 출력되는 0~9 까지의 비트값 배열
const int FndFont[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67 };
// 초기화 함수, WiringPi 라이브러리 초기화, Select 핀 및 LED 핀 초기화를 담당)
void Init(){
int i;
if(wiringPiSetupGpio()==-1){
printf("Wiringpi Error!");
exit(-1);
}
for(i=0; i<6; i++){
pinMode(FndSelectPin[i], OUTPUT);
digitalWrite(FndSelectPin[i], HIGH); // FND_SEL은 LOW가 Select하는 것임을 주의!
}
for( i = 0; i < 8; i++ ) {
pinMode( FndPin[i], OUTPUT ); // LED 핀을 출력으로 설정
digitalWrite( FndPin[i], LOW ); // LED 핀을 OFF
}
}
// FND를 선택하는 함수, S0 ~ S4 중 파라미터(position)에 해당하는 FND 선택
void FndSelect (int position) {
int i;
for( i = 0; i < 5; i++ ) {
if( i == position ) {
digitalWrite( FndSelectPin[ i ], LOW ); // 선택된 FND의 Select 핀 ON
}
else {
digitalWrite( FndSelectPin[ i ], HIGH ); // 선택되지 않은 FND의 Select 핀 OFF
}
}
}
// FND 출력함수 => 해당하는 position에 숫자 출력
void FndDisplay(int position, int num){
int i, j;
int flag = 0; // FNDpin[i]을 ON/OFF하기 위한 flag
int shift = 0x01; // FndFont와 And연산하여 출력할 LED 상태 결정
for(i=0; i<8; i++){
flag = (FndFont[num] & shift); // 만약 i=0, FndFont[0]=0x3F이라 하면, (0b00111111 & 0b00000001)이 된다.
// 3번째 FND에 '.'을 표시
if(position==3 & i==7)
flag = (flag | 0x80);
digitalWrite(FndPin[i], flag); // FndPin[i]를 flag(0또는1)로 ON.OFF
shift << =1; // 왼쪽으로 1비트 shift한다. 0b00000001 -> 0b00000010
}
FndSelect(position); // position으로 받은 FND를 선택
}
int main() {
int pos;
int i = 0;
int j = 0;
Init();
unsigned int time = millis(); // 출력을 계속 유지시키기 위함
while(1){
int data[6] = {0, 0, 0, 0, 0, 0}; // 초기에 표시될 숫자
j = i;
// 각각의 자릿수 계산
data[5] = j % 10; // 1의 자리
j = j / 10;
data[4] = j % 10; // 10의 자리
j = j / 10;
data[3] = j % 10; // 100의 자리
j = j / 10;
data[2] = j % 10;
j = j / 10;
data[1] = j % 10;
j = j / 10;
data[1] = j % 10;
for(pos=0; pos<6; pos++){
FndDisplay(pos, data[pos]);
delay(1);
}
// 0.01초 단위로 동작
if(millis()-time > 100){
time = millis();
i += 1;
}
}
return 0;
}