회원가입 ID/PW 찾기
AA

#include <stdlib.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
//------------------------------------------------------------------
//bit제어를위해 설정
#define sbit(x,y) (x |= (1<<y))
#define cbit(x,y) (x &= ~(1<<y))
#define tbit(x,y) (x & (1<<y))
//------------------------------------------------------------------
volatile uint8_t msec,m00;
volatile int16_t seed;
volatile uint8_t key1,key1_temp,key_flag,start_flag;
volatile uint8_t key1_on,key1_up,key1_down;
volatile uint8_t data[128],data_count,data_count_end,key_data,timer;
//==================================================================
void port_init(void)
 {
 DDRC = 0xF0;     // PC7-PC4 = LED output
 PORTC = 0x00;
//
 DDRF = 0x00;     // PORTF = KEY input
 PORTF = 0xFF;
 }
//==================================================================
void timer_init(void)
 {
 TCCR0 = 0x0C;                  // 1/64
 ASSR = 0x00;                    
 OCR0 = 249;                    // 16MHz/64/(1+249) = 1ms
 TCNT0 = 0x00;                  

 TIMSK = 0b00000010;            // enable OC0 interrupt
 TIFR = 0x00;                        
 }
//------------------------------------------------------------------
prog_int8_t data_table[4] = {0x10,0x20,0x40,0x80};
//==================================================================
void keyread(void)
 {
 unsigned char i,j;
//
 key1=~PINF&0xf0;      //값을 읽어와 필요부분만 유효화한다.
//------------------------------------------------------------------
 if(key1_temp==key1)   //2회 동일값이면
  {
//---------------------------------------------키를 누를때 1회 on
  i=key1_on;        //이전값
  j=key1_temp;      //현재값
  j=(i^j)&j;       //새로운값만 유효
  key1_down=j;
//---------------------------------------------키를 눌렀다 뗄때 1회ON   
  j=key1_temp;      //현재값
  j=(i^j)&i;        //off된 이전값만 유효 
  key1_up=j;
//---------------------------------------------키가눌려져 있는 동안 on
  key1_on=key1_temp; //현재값
  }
//---------------------------------------------이전 값과 일치하지 않으면
    else key1_temp=key1;
 }
//==================================================================
//10ms 마다 이함수로 진입
//------------------------------------------------------------------
void plc(void)
 {
 uint8_t i;
//------------------------------------------------------------------
 if(data_count_end>100) start_flag=0;//최대 100회 반복
//start
 if(start_flag==0)
  {
  srand(seed);
  data_count=0;
  data_count_end=0;
  start_flag=1;
  key1_down=0;
  for(i=0;i<100;i++)//난수 100개를 저장
   {
   data[i] = rand()%4;
   }
  }
//data 표시
 if(start_flag==1)//
  {
  timer++;
  if(timer<50)
   {
   m00=pgm_read_byte(&data_table[data[data_count_end]]);
   }
  else
   {
   timer=0;
   m00=0;
   start_flag=2;    
   }
  }
//key 변환  
 if(start_flag==2)//
  {

  if(key1_down>0)
   {
   if(tbit(key1_down,4))    key_data=0;
   else if(tbit(key1_down,5)) key_data=1; 
   else if(tbit(key1_down,6)) key_data=2; 
   else       key_data=3; 
   start_flag=3;
   }
  }
//check
 if(start_flag==3)//
  {
  if(key_data==data[data_count])
   {
   data_count++;
   start_flag=2;
   if(data_count>data_count_end)
    {
    start_flag=1;
    data_count=0;
    data_count_end++;
    }
  
   }
  else
   {
   start_flag=4;
   }
  } 
//error
 if(start_flag==4)//
  {
  timer++;
  if(timer<100)
   {
   m00=0xff;
   }
  else if(timer<150)
   {
   timer=0;
   m00=0x00;
   start_flag=0;    
   }
  } 
//------------------------------------------------------------------- 
//out
 PORTC=(PORTC&0x0f)|m00;
//
 key1_down=0;key1_up=0;
 }
//---------------------------------------------------------------------
ISR(TIMER0_COMP_vect)    // OC0 interrupt function
 {
 sei();       //인터럽트 허용

 msec++;
 if(msec==10)//10ms
  {
  msec=0;
  seed++;      //난수의 씨앗 
  keyread();
  plc();      // 10ms를 초과하지말것.(가능하면 5ms이내로할것.)
  }
 }
//=======================================================================
int
main (void)
{
 port_init();
 timer_init();
 sei();
 while(1)
 {

 }
}
 

 

 

댓글 1
  • No Profile

    이런 작업은 직접하시는게 좋을 듯 합니다



     



    컴파일러에 따라 달라지는 아래 구문과 DDR Port정도만. 변경해주시면됩니다.



     



    #include <stdlib.h>

    #include <avr/interrupt.h>

    #include <avr/io.h>

    #include <avr/pgmspace.h>

    //-------------------



     

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
118 ECAD 아무거나 HOT알티움 부품라이브러리에서 부품 수정 후 pcb, 회로도에 적용 관련 질문 드립니다 프리왁 631 2019.07.17
117 ECAD 아무거나 HOTvia hole 개수와 전류 상관 관계1 one 575 2017.10.10
116 ECAD 아무거나 HOT임피던스 PCB 제작에 대해 질문 드립니다.4 당근1 428 2017.08.22
115 ECAD 아무거나 스루홀 설계에 대한 질문입니다1 황소61 149 2017.06.15
114 ECAD 아무거나 고수님들 캠350으로 자료여는 방법 좀 알려 주세요...2 박진영 325 2017.06.13
113 ECAD 아무거나 HOTCam350 올리면 안되죠?1 어린왕자.. 626 2017.02.14
112 ECAD 아무거나 자동차용 제품 Artwork해보신분1 어린왕자.. 146 2017.02.14
111 ECAD 아무거나 HOTPCB 아트워크 알바 비용3 수정해골 826 2016.12.31
110 ECAD 아무거나 CAM 350 구합니다.3 나여규 288 2016.11.29
109 ECAD 아무거나 PADS/OrCad 라이센스 관련 질문 드립니다.1 리차드조 288 2016.11.17
108 ECAD 아무거나 HOTPADS 크랙5 시간좀내봐 1437 2016.08.12
107 ECAD 아무거나 PADS 한글버전3 시간좀내봐 366 2016.08.11
106 ECAD 아무거나 HOTcam350 crack 파일 있으시분!! 도와주십쇼~~~3 홍대용 2125 2016.06.09
105 ECAD 아무거나 HOTMENTOR BOARD STATION ARC 값 질문입니다..1 micl**** 481 2016.04.22
104 ECAD 아무거나 대전류 패턴 설계시...2 우워워웡 287 2016.03.24
103 ECAD 아무거나 PADS 설치중에 하히후헤호 244 2015.10.28
102 ECAD 아무거나 HOTcadstar 사용하시는분 계신가요?6 연꼬 945 2015.08.10
101 ECAD 아무거나 pads2007 라이브러리 문의 드립니다.1 chumdan 165 2015.07.16
100 ECAD 아무거나 HOTpads9.5설치시 오류1 공기 491 2015.06.27
99 ECAD 아무거나 pads 설치 시 오류 문의드립니다!1 jongoo 213 2015.06.20
  • 천재는 노력하는 사람을 이길 수 없고 노력하는 사람은 즐기는 사람을 이길 수 없다.
    - 롤프 메르쿨레
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.