회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
676 Analog & Mixed-Signal 설계 회로를 잘보고싶습니다.3 피츠 330 2016.12.16
675 Sensor 설계 혹시 이런 스위치 IC 아시는분 추천 부탁드립니다.3 용장군 231 2016.12.14
674 Sensor 설계 pads 품 추가하는법미뭔가요?2 깅동 103 2016.11.13
673 전기전자 아무거나 AC 아답터 개발6 젠틀호홍 225 2016.11.11
672 Analog & Mixed-Signal 설계 HOTpcb설계 교육같은게 있을까요?2 준02 1074 2016.11.07
671 Analog & Mixed-Signal 설계 휴학중인 공익입니다.1 teang199995 143 2016.09.28
670 전기전자 아무거나 푸시풀 회로에 대해서 질문합니다2 lmqwlkeqwwe 264 2016.08.26
669 Sensor 설계 TI 사 OMAP 관련 질문이 있어요 급합니다.1 킹또 126 2016.08.13
668 전기전자 아무거나 전자공학 독학에 관해서 질문합니다2 미술쟁이 351 2016.05.19
667 Analog & Mixed-Signal 설계 전원부 DC register 값 알아내기1 micl**** 243 2016.03.25
666 Analog & Mixed-Signal 설계 혹시 프로테우스 풀버전 가지고계신분 있으신가요??1 검거당함 398 2016.02.28
665 Analog & Mixed-Signal 설계 LED 조명용 12V 30W급 SMPS 설계 도움이 필요합니다.1 테미 316 2016.02.16
664 Sensor 설계 C2G6DFP 이 부품 Datasheet가 안나오는데1 기다려줄래 132 2015.12.21
663 Analog & Mixed-Signal 설계 라인트레이서 회로도 안정도 검사1 자일리 239 2015.11.02
662 드론/로봇/라인트레이서 가감속 질문 드립니다.1 짱광 255 2015.10.08
661 Analog & Mixed-Signal 설계 HOTQ8 SpeedUp TR 회로 해석 부탁드려도 될까요?2 H2히로 429 2015.09.30
660 Analog & Mixed-Signal 설계 HOT트랜스를 사용하지 않은 AC-DC 컨버터 회로를 설계하고 있는대 도움 좀 주세요1 hertz 805 2015.08.04
659 전기전자 아무거나 PSCAD 책 없을까요??2 김용득 393 2015.07.22
658 전기전자 아무거나 VGA to HDMI 회로 설계에 대하여2 장예규 383 2015.04.09
657 전기전자 아무거나 항공전자 질문오요1 sstdssz@naver.com 171 2015.04.03
Prev 1 2 3 4 5 6 7 8 9 10 ... 39 Next
  • 햇빛이 비치는 동안에 건초를 만들자.
    - 세르반테스
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.