회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
5604 Analog & Mixed-Signal 설계 회로를 잘보고싶습니다.3 피츠 317 2016.12.16
5603 PADS Pads Layout에서 VCC, GND2 노웨이 319 2016.12.15
5602 PADS Molex 5267-02 Library 1 노웨이 218 2016.12.15
5601 PADS 하드웨어키를 이용한 PADS9.2설치법질문드립니다.1 장동휘 152 2016.12.14
마이크로프로세서 avr studio 소스를 codevision avr소스로 바꿔주시면 감사하겠습니다.1 xoxokgs 358 2016.12.14
5599 Sensor 설계 혹시 이런 스위치 IC 아시는분 추천 부탁드립니다.3 용장군 211 2016.12.14
5598 PADS PADS Layout 문의2 노웨이 114 2016.12.13
5597 마이크로프로세서 리눅스 공부 할려니 막막하네요5 초보초보왕초보왕 187 2016.12.12
5596 마이크로프로세서 pic16f877a 초음파센서 거리측정 어셈블리어 소스 부탁드립니다2 하하하하센서 203 2016.12.11
5595 Allegro & OrCAD OrCAD PCB Designer 질문있습니다.1 장동휘 165 2016.12.09
5594 마이크로프로세서 혹시 mplab을 이용해서 초음파센서 작동할수있나요???3 하하하하센서 226 2016.12.07
5593 마이크로프로세서 atmega128 관련 동호회 있을까요? 오징어를사랑한문어 260 2016.12.02
5592 마이크로프로세서 atmega128 키트에 관하여 오징어를사랑한문어 170 2016.12.02
5591 마이크로프로세서 atmega128 을 공부중입니다 질문 있습니다 오징어를사랑한문어 140 2016.12.02
5590 마이크로프로세서 HOTCodeVisionAVR을 이용한 ATmega128 소스1 xoxokgs 416 2016.11.30
5589 개발용역 대학생 간단한 matlab 개발의뢰 가능할까요1 A000 283 2016.11.29
5588 ECAD 아무거나 CAM 350 구합니다.3 나여규 279 2016.11.29
5587 Allegro & OrCAD 전자캐드 준비중인데요 DRC체크할때 워링 뜨는 이유를 알고 싶어요2 김타우 252 2016.11.23
5586 ECAD 아무거나 PADS/OrCad 라이센스 관련 질문 드립니다.1 리차드조 280 2016.11.17
5585 자유주제 전자과인데 진로 고민입니다...9 투빻 346 2016.11.16
Prev 1 ... 10 11 12 13 14 15 16 17 18 19 ... 295 Next
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.