BASIC4MCU | 질문게시판 | atmega128 lcd led 동시 제어
페이지 정보
작성자 ewaesdf 작성일2023-10-09 15:25 조회1,543회 댓글0건본문
1. PD2, 3에 연결된 외부 인터럽트(스위치) 신호를 통해 랜덤한 숫자 두 개 생성
2. num1, num2 크기 비교 후 결과에 따라 LCD에 문구 출력
3. num1, num2 크기 비교 후
num1>num2 : led 좌방향 스위칭
num1==num2 : led 전체 점멸
num1<num2 : led 우방향 스위칭
위 세가지가 지금 목표입니다.
1,2까진 별 문제 없이 성공했는데 3의 led가 도저히 작동을 안해서 어떻게 해야할지 모르겠습니다..
하단은 제가 2번까지 성공시킨 코드입니다. 어디에 뭘 넣어야 하나요?
#include <mega128.h>
#include <delay.h>
#include <stdlib.h>
#define LINE2 0xC0 // 2nd Line Move
#define HOME 0x02 // Cursor Home
#define RSHIFT 0x1C // Display Right Shift
#define LSHIFT 0x18 // Display Left Shift
#define DISPON 0x0c // Display On
#define DISPOFF 0x08 // Display Off
void LCD_init(void);
void LCD_String(char flash str[]);
void Busy(void);
void Command(unsigned char);
void Data(unsigned char);
void num_display(void);
int num1 = 0, num2 = 0;
void main(void)
{
DDRD = 0b00000000;
DDRE = 0xFF;
PORTE = led;
EIMSK = 0b00001100;
EICRA = 0b10100000;
SREG = 0b10000000;
LCD_init();
while(1) {
}
}
interrupt [EXT_INT2] void external_int2 (void)
{
num1 = (char)(rand()%8);
num_display();
delay_ms(1);
}
interrupt [EXT_INT3] void external_int3 (void)
{
num2 = (char)(rand()%8);
num_display();
delay_ms(1);
}
// LCD 초기화 함수
void LCD_init(void)
{
DDRC = 0xFF; // 포트 C 출력 설정
PORTC &= 0xFB; //E = 0;
// 충분한 지연시간을 통한 안정화 과정
delay_ms(15);
Command(0x20); // D5=1
delay_ms(5);
Command(0x20); // D5=1
delay_us(100);
Command(0x20); // D5=1
// 초기화 과정
Command(0x28); // function set
Command(0x06); // entry mode set
Command(0x01); // all clear
Command(0x0c); // display on
}
// 인스트럭션 쓰기 함수
void Command(unsigned char byte)
{
Busy();
// 인스트럭션 상위 바이트
PORTC = (byte & 0xF0); // 데이터
PORTC &= 0xFE; // RS = 0;
PORTC &= 0xFD; // RW = 0;
delay_us(1);
PORTC |= 0x04; // E = 1;
delay_us(1);
PORTC &= 0xFB; // E = 0;
// 인스트럭션 하위 바이트
PORTC = ((byte<<4) & 0xF0); // 데이터
PORTC &= 0xFE; // RS = 0;
PORTC &= 0xFD; // RW = 0;
delay_us(1);
PORTC |= 0x04; // E = 1;
delay_us(1);
PORTC &= 0xFB; // E = 0;
}
// 문자열 출력 함수
void LCD_String(char flash str[])
{
char flash *pStr=0;
pStr = &str[0];
while(*pStr) Data(*pStr++);
}
// char flash : pointer declaration for program memory
// char eeprom : pointer declaration for EEPROM
//데이터 쓰기 함수
void Data(unsigned char byte)
{
Busy();
// 데이터 상위 바이트
PORTC = (byte & 0xF0); // 데이터
PORTC |= 0x01; //RS = 1;
PORTC &= 0xFD; //RW = 0;
delay_us(1);
PORTC |= 0x04; //E = 1;
delay_us(1);
PORTC &= 0xFB; //E = 0;
// 데이터 하위 바이트
PORTC = ((byte<<4) & 0xF0); // 데이터
PORTC |= 0x01; //RS = 1;
PORTC &= 0xFD; //RW = 0;
delay_us(1);
PORTC |= 0x04; //E = 1;
delay_us(1);
PORTC &= 0xFB; //E = 0;
}
// Busy Flag Check -> 일반적인 BF를 체크하는 것이 아니라
// 일정한 시간 지연을 이용한다.
void Busy(void)
{
delay_ms(2);
}
void num_display(void)
{
Command(HOME);
LCD_String("Num1:");
Data(0x30 + num1);
LCD_String(" Num2:");
Data(0x30 + num2);
Command(LINE2);
if(num1>num2)
LCD_String("Num1 is win!");
if(num1==num2)
LCD_String("It is draw!");
if(num1<num2)
LCD_String("Num2 is win!");
}
댓글 0
조회수 1,543등록된 댓글이 없습니다.