회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
276 구인구직 PCB Artwork 알바합니다 횸님 313 2025.03.06
275 구인구직 HOTPCB수리 아르바이트 하실분...1 비버 544 2025.02.18
274 구인구직 HOT유머 WEWW 592 2023.08.22
273 구인구직 HOT(주)엔슨 H/W, F/W 개발인원 채용 - 경북 경산1 천상락원 888 2023.01.09
272 구인구직 HOT[구인] (주)가스트론 전자설계(경력) 채용합니다. 박경원 1074 2018.09.20
271 구인구직 HOTPCB ARTWORK 프리랜서입니다.1 minepcb 1918 2018.07.29
270 구인구직 HOTPCB Artwork 알바 합니다. 고자라니 881 2018.05.14
269 구인구직 HOT구인 구직게시판이 언제부터 학원 광고판으로 변질되었습니까?2 블루핑 903 2017.08.18
268 구인구직 HOT불루투스 비콘 펌웨어1 07땜쟁이 779 2017.05.11
267 구인구직 HOTTI DSP CCS 사용가능 및 DSP 동적 시험 인력 모집 나비71548 717 2017.02.07
266 구인구직 HOT라즈베리 와 같은 싱글보드컴을 사용한 데이타 통신 기능 개발 개인 알바 하실분1 은꼬비 866 2017.01.20
265 구인구직 HOT소프트웨어 엔지니어- MFC, 비쥬얼스튜디오 프로그램가능자 나비71548 892 2016.08.22
264 구인구직 HOT[TheAlphaLabs] 하드웨어 엔지니어 구합니다 myyoui 826 2015.02.25
263 구인구직 HOTAnalog IC 설계자 긴급구인 질순없다,청춘 942 2014.10.01
262 구인구직 HOT[헤드헌팅]3D 프린터 SW드라이버 및 펌웨어 개발자 긴급구인 질순없다,청춘 1722 2014.07.17
261 구인구직 HOT웨이버스- SI사업 SW개발 경력자 모집 (~6/4 수) 쭈니닷 1847 2014.05.29
260 구인구직 HOT비아이매트릭스- [경력]JAVA,JSP 개발자 채용 (~5/30 금) 쭈니닷 1542 2014.05.22
259 구인구직 HOT요기요 - 스크럼마스터(Scrum Master) 채용 알지피코리아인사팀 1427 2014.05.21
258 구인구직 HOT[구인] 요기요-안드로이드 개발자 채용(경력직) 알지피코리아인사팀 1139 2014.05.20
257 구인구직 HOT소프트넷- 각 부문 신입 및 경력사원 모집 (~5/22 목) 쭈니닷 1521 2014.05.15
Prev 1 2 3 4 5 6 7 8 9 10 ... 14 Next
  • 분노는 바보들의 가슴 속에서만 살아간다.
    - 아인슈타인
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.