ATmega128, FND 실습 - 0120
ATmega128, FND 실습
[ 간략 설명 ]
◈ ATmega128, FND 실습
◈ 0~99, 짝수, 홀수, +111 등의 표시
ATmega128, FND 실습
몇가지 예제~
/*
FND 제어실습 99진 UP 카운터
우측 2개의 7-segment 이용 0~99 짝수만 표시, even bit
*/
#include <mega128.h>
#include <delay.h>
char Seg_par[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
void Seg_out(int num);
void main(void)
{
int num = 0; // int num = 1 로 하면 홀수만 display
DDRB = 0xff;
DDRF = 0b11110000;
while(1){
Seg_out(num);
num += 2; // num = num +2 : 2씩 증가
if(num>99) num = 0;
}//end while
}//end main
void Seg_out(int num){
int i, N10, N1;
N10 = num/10; // 나누어 몫을 N10에 넣기
N1 = num%10;
for( i=0; i<50; i++){
PORTF = 0b11100000;
PORTB = Seg_par[N1];
delay_ms(10);
PORTF = 0b11010000;
PORTB = Seg_par[N10];
delay_ms(10);
}
}//end
/*
FND 제어실습 99진 UP 카운터
우측 2개의 7-segment 이용 0~9999 짝수만 표시, even bit
*/
#include <mega128.h>
#include <delay.h>
char Seg_par[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
void Seg_out(int num);
void main(void)
{
int num = 1; // int um = 1 로 하면 홀수만 display
DDRB = 0xff;
DDRF = 0b11110000;
while(1){
Seg_out(num);
num += 111; // num = num +111 : 111씩 증가
if(num>9999) num = 0;
}//end while
}//end main
void Seg_out(int num){
int i, N10, N1;
//add int
int buf, N100, N1000;
//add N
N1000 = num/1000;
buf = num%1000;
N100 = buf/100;
buf = buf%100;
N10 = buf/10;
buf = buf%10;
N1 = buf%10; // 나누어 몫을 N10에 넣기
for( i=0; i<25; i++){
PORTF = 0b11100000;
PORTB = Seg_par[N1];
delay_ms(5);
//PORTF = 0b11110000;
PORTF = 0b11010000;
PORTB = Seg_par[N10];
delay_ms(5);
//PORTF = 0b11110000;
//add code
PORTF = 0b10110000;
PORTB = Seg_par[N100];
delay_ms(5);
//PORTF = 0b11110000;
PORTF = 0b01110000;
PORTB = Seg_par[N1000];
delay_ms(5);
//PORTF = 0b11110000;
}
}//end
/* P.114
FND 제어 실습 99진 카운터
99 -> 00
*/
#include <mega128.h>
#include <delay.h>
void Segout(int);
char Seg[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
void main(void){
int num=99;
int i;
DDRF = 0xf0;
DDRB = 0xff;
DDRC = 0xff;
PORTB = 0x00;
PORTC = 0xff;
while(1){
Segout(num);
num--;
if(num<0){
for( i=0 ; i<5 ; i++){
PORTC = 0xff;
delay_ms(100);
PORTC = 0x00;
delay_ms(100);
PORTC = 0xff;
}//endfor
num = 99;
}//endif
}//endwhile
}//end main
void Segout(int num){
int N1, N10, i;
N1 = num%10;
N10 = num/10;
for( i=0; i<5; i++){
PORTF = 0b11100000;
PORTB = Seg[N1];
delay_ms(10);
PORTF = 0b11010000;
PORTB = Seg[N10];
delay_ms(10);
PORTB = 0x00;
}//
}//endSegout
/* P.115
FND 0 ~9999진 카운터
*/
#include <mega128.h>
#include <delay.h>
char Seg_pat[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
void Seg4_out(int);
void main(void)
{
int num = 0;
DDRB = 0xff; // 포트 B 출력 설정
DDRF = 0b11110000; //PF4 - PF7 출력설정
while(1){ // 0~9999 , 9999 ~0 카운터 방향 설정
Seg4_out(num);
num++;
if(num > 9999 ) num = 0;
}//endwhile
}//end main
// 네자리 정수 출력
void Seg4_out(int num){
int i, N1000, N100, N10, N1, Buf;
N1000 = num/1000; //1000자리 추출
Buf = num%1000;
N100 = Buf/100; //100자리 추출
Buf = Buf%100;
N10 = Buf/10; //10자리 추출
N1 = Buf%10; //1자리 추출
for( i=0; i<5 ; i++){
PORTF = 0b11100000; //맨 우측 7-Segment SEG1 ON (PF4=0)
PORTB = Seg_pat[N1]; //1자리 표시
delay_ms(5);
PORTF = 0b11110000;
PORTF = 0b11010000; //7-Segment SEG2 ON (PF5=0)
PORTB = Seg_pat[N10]; //10자리 표시
delay_ms(5);
PORTF = 0b11110000;
PORTF = 0b1011000; //7-Segment SEG3 ON (PF6=0)
PORTB = Seg_pat[N100]; //100자리 표시
delay_ms(5);
PORTF = 0b11110000;
PORTF = 0b01110000; //7-Segment SEG4 ON (PF7=0)
PORTB = Seg_pat[N1000]; //1000자리 표시
delay_ms(5);
PORTF = 0b11110000;
}//endfor
}//endSeg4_out
/* P.117
FND 제어실습 0000~9999진
- SW8 누르면 +1 증가, SW16누르면 -1 감소
*/
#include <mega128.h>
#include <delay.h>
char Seg_part[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x27, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 };
void Seg4_out(int);
int i, N1000, N100, N10, N1, Buf;
void main(void)
{
int num = 0;
int Sub, Add;
unsigned char Key;
DDRB = 0xff; // Port B 를 출력으로 설정
DDRE = 0b00000000;
DDRF = 0xf0;
while(1){
Add = num;
Seg4_out(num);
num++;
Sub = (num--);
if(num <0 ) num = 9999;
if( num>9999) num = 0;
Key = PINE & 0xf0; // Port E 읽어오기
switch(Key){
case 0b11100000: // SW8이 눌리면 LED 모두 ON
PORTB = num++;
break;
case 0b11010000: // SW14이 눌리면 LED 모두 ON
PORTB = num++;
break;
case 0b10110000: // SW15이 눌리면 LED 모두 ON
PORTB = num++;
break;
case 0b01110000: // SW16이 눌리면 LED 모두 ON
PORTB = --num;
break;
default: break; // 아무일도 하지 않음
}//endswitch
}//endwhile
}//end main
/* 네자리 정수 출력*/
void Seg4_out(int num){
N1000 = num/1000;
Buf = num%1000;
N100 = Buf/100;
Buf = Buf%100;
N10 = Buf/10;
N1 = Buf%10;
for( i=0; i<5; i++){ // i<5 에서 숫자가 낮을수록 SW 응답속도가 크다
PORTF = 0b11100000; //SEG2 [PF4=0]
PORTB = Seg_part[N1];
delay_ms(6);
PORTF = 0b11110000;
PORTF = 0b11010000; //SEG2 [PF5 =0 ]
PORTB = Seg_part[N10];
delay_ms(6);
PORTF = 0b11110000;
PORTF = 0b10110000; //SEG2 [PF6 =0 ]
PORTB = Seg_part[N100];
delay_ms(6);
PORTF = 0b11110000;
PORTF = 0b01110000; //SEG2 [PF5 =0 ]
PORTB = Seg_part[N1000];
delay_ms(6);
PORTF = 0b11110000;
}//endfor
}//endSeg4_out
'Edu > 유비쿼터스설비제어과정' 카테고리의 다른 글
인터럽트, ATmega128 - 0127 (0) | 2011.01.27 |
---|---|
FND 시계제작, ATmega128 - 0126 (0) | 2011.01.27 |
이미터 접지 증폭회로, Emitter, PCB, Proteus - 0125 (0) | 2011.01.25 |
음악에 따라 연주하는 분수대 회로 설계 (미완성) - 0124 (0) | 2011.01.24 |
C언어 배열, Maxtrix - 0121 (0) | 2011.01.21 |
FND 7-segment 회로도 - 0119 (0) | 2011.01.19 |
CDS 이용한 작동 연습 - 0118 (0) | 2011.01.18 |
CDS회로 with Proteus - 0117 (0) | 2011.01.17 |
C언어 포인터 - 제곱근, 세제곱근 - 0114 (0) | 2011.01.14 |
ATmega128 SWITCH 제어 - 0113 (0) | 2011.01.13 |