BASIC4MCU | 질문게시판 | ATMEGA128A 세그먼트 떨림 문제 질문입니다.
페이지 정보
작성자 besure 작성일2022-11-28 13:46 조회1,511회 댓글2건본문
9초가 지나면 세그먼트가 심하게 떨리는 증상이 있는데 어떻게 하면 개선할 수 있을까요?
#include <io.h>
#include <mega128.h>
#define SW0 PINE.4
#define ON 0
#define OFF 1
#define ENABLE PORTA.2
#define FUNCSET 0X28
#define ENTMODE 0X06
#define ALLCLR 0X01
#define DISPON 0x0c
#define LINE2 0xc0
#include <delay.h>
void Seg2_out(void);
flash char seg_pat[10]= {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //0,1,2,3,4,5,6,7,8,9 세그먼트 출력
typedef unsigned char u_c;
typedef unsigned char u_char;
void LCD_init(void);
void Busy(void);
void Command(u_char);
void Data(u_char);
u_c i=0, N1000=0, N100=0, N10=0, N1=0;
u_c k = 0;
void Seg2_out(void) //두자리 정수 출력
{
PORTG =0b00000100; // 7-Segment DIG3 ON(PG2=1)
PORTD =((seg_pat[N10] & 0x0F) << 4);
// A, B, C, D 표시
PORTB = (seg_pat[N10] & 0x70 );
// E, F, G 표시
delay_ms(5);
PORTG = 0b00000010; // 7-Seg DIG2 ON(PG1=1), 100자리 표시
PORTD = ((seg_pat[N100] & 0x0F) << 4); // A, B, C, D 표시
PORTB = (seg_pat[N100] & 0x70 ); // E, F, G 표시
delay_ms(5);
PORTG = 0b00000001; // 7-Seg DIG1 ON(PG0=1), 1000자리 표시
PORTD = ((seg_pat[N1000] & 0x0F) << 4); // A, B, C, D 표시
PORTB = (seg_pat[N1000] & 0x70 ); // E, F, G 표시
delay_ms(5);
PORTG = 0b00001000; // 맨 우측 7-Segment DIG4 ON(PG3=1)
PORTD = ((seg_pat[N1] & 0x0F) << 4);
// A, B, C, D 표시
PORTB = (seg_pat[N1] & 0x70 );
// E, F, G 표시
delay_ms(5); //0.01초 딜레이
}
void Busy(void)
{
delay_ms(2);
}
void LCD_String (char flash *str)
{
char flash *pStr=0;
pStr=str;
while(*pStr)Data(*pStr++);
}
void LCD_init(void)
{
DDRA=0xFF;
PORTA=0x00;
Command(0x20);
delay_ms(15);
Command(FUNCSET);
Command(DISPON);
Command(ALLCLR);
Command(ENTMODE);
}
void Command(u_char byte)
{
Busy();
PORTA= 0x00;
PORTA |= (byte & 0xf0);
delay_us(1); ENABLE=1;
delay_us(1); ENABLE=0;
PORTA=0x00;
PORTA |= (byte <<4);
delay_us(1); ENABLE=1;
delay_us(1); ENABLE=0;
}
void Data(u_char byte)
{
Busy();
PORTA=0x01;
PORTA |= (byte & 0xf0);
delay_us(1); ENABLE=1;
delay_us(1); ENABLE=0;
PORTA=0x01;
PORTA |= (byte <<4);
delay_us(1); ENABLE=1;
delay_us(1); ENABLE=0;
}
void main(void)
{
unsigned char led;
DDRC = 0xFF; // 포트C 출력 설정
DDRE = 0x0; // 포트E 입력 설정
PORTC = 0xFF; // LED 모두 off
DDRB = 0xF0; // 포트 B 상위 4비트 출력 설정, (세그먼트)
DDRD = 0xF0; // 포트 D 상위 4비트 출력 설정
DDRG = 0x0F; // 포트 G 하위 4비트 출력 설정
PORTB = 0x0; // E, F, G, DP off
PORTD = 0x0; // A, B, C, D off
while(1)
{
Seg2_out();
if(SW0 == ON)
{
PORTC = 0x00;
delay_ms(1);
for( i = 0; i< 9999; i++)
{
if( SW0 == OFF )
{
SW0 = 1;
break;
}
N1 = i%10;
N10 = i/10;
N100 = i/100;
N1000 = i/1000;
for( k=0; k<40; k++)
{
Seg2_out();
if( i>= 9)
{
LCD_init();
LCD_String(" CAUTION");
Command(LINE2);
LCD_String(" WARNING");
if( k/10 == 1 || k/10 == 3)
{
led = 0b01010101;
PORTC = led;
delay_ms(5);
}
else
{
led = 0b10101010;
PORTC = led;
delay_ms(5);
}
}
}
}
N1 = 0;
N10 = 0;
N100 = 0;
N1000 = 0;
SW0 = OFF;
}
else PORTC = 0xFF; // SW1 OFF -> LED 모두 OFF
}
}
댓글 2
조회수 1,511master님의 댓글
master 작성일
if(i>= 9){
LCD_init(); LCD_String(" CAUTION"); Command(LINE2); LCD_String(" WARNING");
if( k/10 == 1 || k/10 == 3){ led = 0b01010101; PORTC = led; delay_ms(5); }
else { led = 0b10101010; PORTC = led; delay_ms(5); }
}
3개의 라인 모두 시간이 많이 걸리는 코드입니다.
master님의 댓글
master 작성일
if(i>= 9){
LCD_init(); LCD_String(" CAUTION"); Command(LINE2); LCD_String(" WARNING");
if( k/10 == 1 || k/10 == 3){ led = 0b01010101; PORTC = }
else { led = 0b10101010; PORTC = }
}
딜레이만 빼도 조금 낫겠죠