BASIC4MCU | 질문게시판 | avr atmega128
페이지 정보
작성자 또잉 작성일2018-12-08 21:25 조회6,739회 댓글0건본문
#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[12],data_rand[6],count;
volatile uint16_t 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};
//------------------------------------------------------------------
prog_int8_t bcd_table[90] =
{
0xA0,0x10, 0xA0,0x20, 0xA0,0x30, 0xA0,0x40, 0xA0,0x50,//1,2,3,4,5
0xA0,0x60, 0xA0,0x70, 0xA0,0x80, 0xA0,0x90, 0x10,0xA0,//6,7,8,9,100x10,0x10, 0x10,0x20, 0x10,0x30, 0x10,0x40, 0x10,0x50,//11,12,13,14,15
0x10,0x60, 0x10,0x70, 0x10,0x80, 0x10,0x90, 0x20,0xA0,//16,17,18,19,200x20,0x10, 0x20,0x20, 0x20,0x30, 0x20,0x40, 0x20,0x50,//21,22,23,24,25
0x20,0x60, 0x20,0x70, 0x20,0x80, 0x20,0x90, 0x30,0xA0,//26,27,28,29,300x30,0x10, 0x30,0x20, 0x30,0x30, 0x30,0x40, 0x30,0x50,//31,32,33,34,35
0x30,0x60, 0x30,0x70, 0x30,0x80, 0x30,0x90, 0x40,0xA0,//36,37,38,39,400x40,0x10, 0x40,0x20, 0x40,0x30, 0x40,0x40, 0x40,0x50,//41,42,43,44,45
};
//==================================================================
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;
}
//==================================================================
//롯또번호 발생 주 프로그램.
//------------------------------------------------------------------
void plc(void)
{
uint8_t i,j,k;
//start
if(tbit(key1_down,7)&&(start_flag==0))
{
start_flag=1;
srand(seed);
}
//led를 무작위로 10초동안 깜박임.
if(start_flag==1)
{
i=rand()%4;
m00=pgm_read_byte(&data_table[i]);
timer++;
if(timer>1000)
{
timer=0;
start_flag=2;
}
}
//롯또 번호 추출.
if(start_flag==2)
{
for(i=0;i<6;i++)data_rand[i]=45;//data 초기화
for(i=0;i<6;i++)
{
here:
j=rand()%45;
for(k=0;k<6;k++){if(data_rand[k]==j)goto here;}//중복검사
data_rand[i]=j;
}
for(i=0;i<6;i++)//표시할 data로 전환.
{
data[i*2]=pgm_read_byte(&bcd_table[data_rand[i]*2]);
data[i*2+1]=pgm_read_byte(&bcd_table[data_rand[i]*2+1]);
}
count=0;
start_flag=3;
}
//롯또 번호 표시.
if(start_flag==3)
{
if(tbit(key1_down,6)) start_flag=0; //reset
if(tbit(key1_down,5)){if(count<11)count++;} //다음 data
if(tbit(key1_down,4)){if(count>0) count--;} //이전 data
m00=data[count];}
//-------------------------------------------------------------------
//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 마다 호출
}
}
//=======================================================================
int
main (void)
{
port_init();
timer_init();
sei();
while(1)
{}
}
avr인데 atmega128 형식으로 바꾸고 싶습니다. ㅠㅠ 어떻게 하는지 몰라서 도움 받고 싶습니다.
댓글 0
조회수 6,739등록된 댓글이 없습니다.