728x90

일단

첨부한 파일에 보면 test kit 제작 회로가 있다. 25pin을 다 사용하는 것이 아니라 GND포함 12pin만을 사용한다. 제어신호 3개와 LED 8개로 연결되 었다.

이를 기반으로 LED 신호 예제

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
 int fd;
 int lp;

 unsigned char buff[128]; //실제 사용하는 buff는 char 하나만 사용

 fd = open("/dev/port", O_RDWR);
 if(fd < 0 )
 {
  perror("/dev/port open error");
  return 1;
 }
 for(lp = 0; lp < 10; lp++)
 {
  lseek(fd, 0x378, SEEK_SET);
 buff[0] = 0xff;         //점등할 LED, data를 입력할 때 bit로 계산하면 쉽게 알아볼 수 있다. 
  write(fd, buff, 1);
  sleep(1);
  lseek(fd, 0x378, SEEK_SET);       //병렬포트의 물리적 주소가 0x378
  buff[0] = 0x00;
  write(fd, buff, 1);
  sleep(1);
 }
 close(fd);
 return 0;
}

switch 제어 예제
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <linux/lp.h>


int main(int argc, char **argv)
{
 int fd;
 int prnstate;
 int lp;

 unsigned char buff[128];
 
 fd = open("/dev/lp0", O_RDWR | O_NDELAY);
 if(fd < 0)
 {
  perror("open error");
  return 1;
 }

 while(1)
 {
  ioctl(fd, LPGETSTATUS, &prnstate); // 상태값을 받아온다.
  if(!(prnstate & LP_PACK)) //1
  {
   printf("ON 1 \n");
  }
  if(!(prnstate & LP_POUTPA))//2
  {
   printf("ON 2 \n");
  }  
  if(!(prnstate & LP_PSELECD))//3
  {
   printf("ON 3 \n");
  }
  //13 pin <-> GND pin
  usleep(50000);
 }
 close(fd);
 return 0;
}

위의 두 예제를 활용하여 원형 큐 구현 예제
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/lp.h>
#include <stdio.h>

int main(int argc, char **argv)
{
 int fd;
 int fd_LED;
 int prnstate;
 int lp;
 unsigned char buff[128];
 
 int flag1 = 0;
 int flag2 = 0;
 int flag3 = 0; 

 int front = 0;
 int rear = 0;

 fd = open("/dev/lp0", O_RDWR | O_NDELAY);
 fd_LED = open("/dev/port", O_RDWR);

 if(fd <0)
 {
  perror("open error");
  return 1;
 }
 if(fd_LED <0)
 {
  perror("LED error");
  return 1;
 }
 while(1)
 {
  ioctl(fd, LPGETSTATUS, &prnstate);
  if(!(prnstate & LP_PACK)){
    flag1 = 1;
  }
  if(!(prnstate & LP_POUTPA)){
   flag2 = 1;
  }
  if(!(prnstate & LP_PSELECD)){
    flag3 = 1;
  }
  if((prnstate & LP_PSELECD) && (flag3 ==1))//reset
  {
   printf("reset\n");
   flag1 = 0;
   flag2 = 0;
   flag3 = 0;
   lseek(fd_LED, 0x378, SEEK_SET);
   buff[0] = 0x00;
   write(fd_LED, buff, 1);
   front = 0; rear = 0;
  }
  if((prnstate & LP_PACK) && (flag1 == 1)) //enqueue
  {
   printf("enqueue\n");
   flag1 = 0;
   flag2 = 0;
   flag3 = 0;
   if((front+1)%8 == rear)
   {
    printf("full\n");
    continue;
   }   
   lseek(fd_LED, 0x378, SEEK_SET);
   buff[0] = buff[0] | (0x01<<front);
   front = (front + 1)%8;
   write(fd_LED, buff,1);
  }
  if((prnstate & LP_PSELECD) && (flag2 == 1)) //dequeue
  {
   printf("dequeue\n");
   flag1 = 0;
   flag2 = 0;
   flag3 = 0;
   if(front == rear)
   {
    printf("empty\n");
    continue;
   }
   buff[0] = (buff[0]- (0x01<<rear));
   lseek(fd_LED, 0x378, SEEK_SET);
   write(fd_LED, buff,1);
   rear = (rear+1)%8;
   usleep(150000);
  }
  
 }
 return 0;
}

그런데 사용하는 flag들(LP_PSELECD, LP_PACK, LP_PSELECD)을 어떻게 찾는지 아직 잘 모르겠다. 다른 스위치를 추가로 더 넣으면 어떻게 되는거지? LED가 추가되면???

728x90

+ Recent posts