BASIC4MCU | 질문게시판 | 답변 : atmega128 lcd led 동시 제어
페이지 정보
작성자 master 작성일2023-10-09 15:55 조회1,518회 댓글0건본문
#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
//
int num1=0,num2=0,led=0,mode=0;
//
void Busy(void){ delay_ms(2); }
//
void Command(char byte){
Busy();
PORTC=byte&0xF0; PORTC&=0xFE; PORTC&=0xFD; PORTC|=0x04; delay_us(1); PORTC&=0xFB;
PORTC=byte<<0x4; PORTC&=0xFE; PORTC&=0xFD; PORTC|=0x04; delay_us(1); PORTC&=0xFB;
}
//
void Data(char byte){
Busy();
PORTC=byte&0xF0; PORTC|=0x01; PORTC&=0xFD; PORTC|=0x04; delay_us(1); PORTC&=0xFB;
PORTC=byte<<0x4; PORTC|=0x01; PORTC&=0xFD; PORTC|=0x04; delay_us(1); PORTC&=0xFB;
}
//
void LCD_String(char flash str[]){
char flash *pStr=0;
pStr=&str[0];
while(*pStr)Data(*pStr++);
}
//
void LCD_init(void){
DDRC=0xFF;
PORTC&=0xFB;
//
delay_ms(15);
Command(0x20); delay_ms(5); Command(0x20); delay_us(100); Command(0x20);
Command(0x28); // function set
Command(0x06); // entry mode set
Command(0x01); // all clear
Command(0x0c); // display on
}
//
void num_display(){
Command(HOME);
LCD_String("Num1:"); Data(0x30+num1);
LCD_String(" Num2:"); Data(0x30+num2);
Command(LINE2);
// 2. num1,num2 크기 비교 후 결과에 따라 LCD에 문구 출력
if(num1> num2){ mode=1; LCD_String("Num1 is win!"); }
if(num1==num2){ mode=3; LCD_String("It is draw! "); }
if(num1< num2){ mode=2; LCD_String("Num2 is win!"); }
}
// 1. PD2,3에 연결된 외부 인터럽트(스위치)신호를 통해 랜덤한 숫자 두 개 생성
interrupt [EXT_INT2] void external_int2(void){ num1=(char)(rand()&7); num_display(); delay_ms(1); }
interrupt [EXT_INT3] void external_int3(void){ num2=(char)(rand()&7); num_display(); delay_ms(1); }
//
void main(void){
DDRE=0xFF;
LCD_init();
EICRA=0xAA; EIMSK=0x0C; SREG=0x80;
while(1){
// 3. num1,num2 크기 비교 후
if(mode==1){ // num1>num2 : led 좌방향 스위칭
PORTE=1<<led; if(++led>7)led=0;
}
if(mode==3){ // num1==num2 : led 전체 점멸
if(led){ led=0; PORTE=0x00; }
else { led=7; PORTE=0xFF; }
}
if(mode==2){ // num1<num2 : led 우방향 스위칭
PORTE=1<<led; if(--led<0)led=7;
}
delay_ms(500);
}
}
댓글 0
조회수 1,518등록된 댓글이 없습니다.