Lv. 42 (책임연구원) 18,025 납
64%
Exp. 18,188/18,490 | 64%
회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
1152 마이크로프로세서 코딩 질문입니다1 돼진이 375 2024.05.28
1151 마이크로프로세서 Dc모터 전원 연결해도 돌아가질 않습니다.2 전공하수 234 2023.05.08
1150 마이크로프로세서 혹 EZBL 접해 보신분 있으신가요?1 보라수정 226 2018.12.11
1149 마이크로프로세서 fnd 1234 켜지면 led 켜지는 코드1 이상원 267 2018.10.05
1148 마이크로프로세서 HOTSTM32F 개발환경을 소개합니다.4 om 1426 2018.05.13
1147 마이크로프로세서 비엔나 회로 질문1 수채화 262 2018.04.06
1146 Software & IDEs HOTAllegro OrCAD 16.6 파일 보내주실 수 있나요?2 jihE 476 2018.01.28
1145 마이크로프로세서 [news] ST마이크로일렉트로닉스, PC용 MCU 파인더 출시로 STM32 및 STM8 설계 리소스 접속 더욱 편리해져 아크마 214 2018.01.05
1144 마이크로프로세서 AT90CAN128 질문1 전문인을꿈꿔여 232 2017.09.07
1143 펌웨어 & 코딩언어 객체지향프로그래밍4 끼르 332 2017.06.19
1142 마이크로프로세서 통신관련질문1 hipertech 177 2017.06.12
1141 마이크로프로세서 디지털 시계 온도와 습도 정확도 조정을 하려면3 동안 311 2017.05.10
1140 마이크로프로세서 HOTPIC를 입문하면서 궁금한 사항5 pandaya 418 2017.04.30
1139 마이크로프로세서 HOT학교과제인데요 도무지모르겠습니다. AVR의길은 멀고도험한거같습니다.5 비언조키다 551 2017.04.24
1138 마이크로프로세서 도와주세요//MPLAP X IDE에서 내장함수 사용시 에러1 하늘색꿈 316 2017.02.21
1137 Software & IDEs 소스 분석툴 관련 질문드려요2 아톰신 160 2017.01.02
1136 Software & IDEs 리눅스 커널에 대해 공부하려고 하는데 서적 한부 추천 부탁드립니다.1 아톰신 157 2017.01.02
1135 마이크로프로세서 HOTKeil 8051 컴파일러 크랙을 부탁드려요 ! 지범이 447 2016.12.16
마이크로프로세서 avr studio 소스를 codevision avr소스로 바꿔주시면 감사하겠습니다.1 xoxokgs 386 2016.12.14
1133 마이크로프로세서 리눅스 공부 할려니 막막하네요5 초보초보왕초보왕 201 2016.12.12
Prev 1 2 3 4 5 6 7 8 9 10 ... 58 Next
  • 행복의 원칙은 첫째 어떤 일을 할 것, 둘째 어떤 사람을 사랑할 것, 세째 어떤 일에 희망을 가질 것이다.
    - 칸트
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.