회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
206 개발용역 [회로 제작] 아두이노 메가 회로 구현 의뢰합니다. 자나가기 269 2018.09.03
205 개발용역 개발 의뢰 드립니다. SMARFCO.LTD 329 2018.08.23
204 개발용역 안드로이드 셋톱박스 펌웨어 커스텀롬 올리실수 있는분 찾습니다.(개발및 테스트용) 띵스 184 2018.08.12
203 개발용역 대전 세종 수원에서 하드웨어/펌웨어/아두이노 기초에서 전문가 까지 제임스리 235 2018.07.29
202 개발용역 TLC 5946 PWM 드라이버 IC를 구동시킬수 있는 회로 설계 의뢰 해봅니다. 림빈별아빠 117 2018.07.19
201 개발용역 TI CC3200, CC2650을 활용한 BLE to WIFI gateway 개발의뢰드립니다.1 최진수 182 2018.06.21
200 개발용역 32진 카운터 설계 의뢰합니다 종수종수11 120 2018.06.08
199 개발용역 atmega128와 GPS를 이용한 스텝모터 제어 의뢰2 wjsrkdg**** 241 2018.06.07
198 개발용역 DC 모터 컨트롤러 김정출 267 2018.02.03
197 개발용역 [회사소개] 전자회로 & PCB설계, SI & PI분석, FPGA보드, 반도체 TEST보드 "엠테크"입니다. 김용철 226 2018.01.04
196 개발용역 펌웨어, PCB, 안드로이드 기간 2개월 ( 850만원) Boxbox 399 2017.12.13
195 개발용역 대학생 간단한 AVR 의뢰 김용성 211 2017.12.12
194 개발용역 PCB설계 및 제조에 대한 도움을 드립니다.^^ 맡기셔도 후회 없으실 거에요.^^1 PCBDN 235 2017.10.17
193 개발용역 IoT, 전자회로 & PCB설계, SI분석, FPGA보드, 반도체 TEST보드 나비71548 250 2017.09.29
192 개발용역 안녕하세요 하드웨어 개발 의뢰합니다 [ 무선마우스 원리 ]1 이성민 281 2017.09.12
191 개발용역 하드웨어 (FPGA 및 MCU 설계, 각종 Analog와 Digital 혼성회로, 고속 회로 및 Signal Processing) 등 하드웨어 전반에 걸쳐 설계 검증 및 제작 bobby 247 2017.04.04
190 개발용역 PCB설계, SI분석 & 반도체 TEST보드, FPGA보드 개발,제작 업체 "엠테크" 나비71548 240 2017.01.02
189 개발용역 대학생 간단한 matlab 개발의뢰 가능할까요1 A000 283 2016.11.29
188 개발용역 개발의뢰합니다. 맥스아빠 362 2016.11.02
187 개발용역 [회사소개]PCB설계, SI분석 & 반도체 TEST보드, FPGA보드 개발,제작 업체 "엠테크"입니다 나비71548 239 2016.10.10
Prev 1 2 3 4 5 6 7 8 9 10 ... 12 Next
  • 벗이 애꾸눈이라면 나는 벗을 옆얼굴로 바라본다.
    - 슈베르트
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.