BASIC4MCU | 질문게시판 | fnd 딜레이
페이지 정보
작성자 슬레이브 작성일2020-12-08 22:20 조회4,696회 댓글3건본문
#include <mega128.h>
#include <delay.h>
u_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= 0xF0;
DDRD= 0xF0;
DDRG= 0x0F;
PORTB= 0x0;
PORTD= 0x0;
while(1){
Seg4_out(num);
num++; delay_ms(1000);
if(num>9999) num= 0; }
void Seg4_out(int num) {
int I, s1, s10, s100, s1000, buf;
s1000= num/1000;
buf= num%1000;
s100= buf/100;
buf= buf%100;
s10= buf/10;
buf= buf%10;
for(i= 0; i<2;i++) {
PORTG = 0b00001000;
PORTD = ((seg_pat[s1] &0x0F)<<4) | (PORTD & 0x0F);
PORTB = (seg_pat[s1] &0x70) | (PORTB & 0x0F);
delay_ms(5);
PORTG = 0b00000100;
PORTD = ((seg_pat[s10] &0x0F)<<4) | (PORTD & 0x0F);
PORTB = (seg_pat[s10] &0x70) | (PORTB & 0x0F);
delay_ms(5);
PORTG = 0b00000010;
PORTD = ((seg_pat[s100] &0x0F)<<4) | (PORTD & 0x0F);
PORTB = (seg_pat[s100] &0x70) | (PORTB & 0x0F);
delay_ms(5);
PORTG = 0b00000001;
PORTD = ((seg_pat[s1000] &0x0F)<<4) | (PORTD & 0x0F);
PORTB = (seg_pat[s1000] &0x70) | (PORTB & 0x0F);
delay_ms(5);
}
}
fnd 0~9999까지 표시하는 프로그램인데요
1초마다 1씩 증가하게 하려면 while 문에 delay_ms(1000); 해주면 될까요?
추가적으로 for 문은 왜 해주는 건지 알려주실 수 있을까요?
댓글 3
조회수 4,696master님의 댓글
master 작성일
while(1){
Seg4_out(num);
num++;
if(num>9999) num= 0;
delay_ms(1000);
}
여기서 딜레이를 사용하면 안됩니다.
마지막(4번째 출력한) 세그먼트가 1초동안 켜져있고, 나머지 3개는 커져있게 됩니다.
딜레이를 제거하고
Seg4_out(num);
이 함수의 실행 시간이 1초가 되어야 합니다.
master님의 댓글
master 작성일
Seg4_out()함수 안에 for문이 있고
for문 안에는 5ms 딜레이가 4개 있어서 루프 1회는 20ms 딜레이입니다.
for(i=0;i<50;i++){
루프 횟수를 50으로 변경하면 1초동안 루프를 실행하게 됩니다.
master님의 댓글
master 작성일
#include <mega128.h>
#include <delay.h>
//
u_char seg_pat[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
//
void Seg4_out(int n){
int i,s4,s3,s2,s1;
s1=n/1000%10; s2=n/100%10; s3=n/10%10; s4=n%10;
for(i=0;i<50;i++){
PORTG=8; PORTD=(seg_pat[s4]<<4)|(PORTD&0x0F); PORTB=(seg_pat[s4]&0x70)|(PORTB&0x0F); delay_ms(5);
PORTG=4; PORTD=(seg_pat[s3]<<4)|(PORTD&0x0F); PORTB=(seg_pat[s3]&0x70)|(PORTB&0x0F); delay_ms(5);
PORTG=2; PORTD=(seg_pat[s2]<<4)|(PORTD&0x0F); PORTB=(seg_pat[s2]&0x70)|(PORTB&0x0F); delay_ms(5);
PORTG=1; PORTD=(seg_pat[s1]<<4)|(PORTD&0x0F); PORTB=(seg_pat[s1]&0x70)|(PORTB&0x0F); delay_ms(5);
}
}
//
void main(void) {
int num=0;
DDRB=0xF0; DDRD=0xF0; DDRG=0x0F;
while(1){
Seg4_out(num);
if(++num>9999)num=0;
}
}