나만의 소스를 만들어 보았다.
다른 인터넷에 있는 소스와 별로 다른 것은 없지만
그래도 내가 알아보기 쉽도록 소스를 수정하고
다시 만들어 보았다.
#include <avr/io.h>
#include <stdio.h>
/***** 포트가 바뀔 경우 여기에서 수정 ******/
//LCD의 4,5,6번의 포트
#define LCD_PORT_CONTROL PORTA
#define LCD_DDR_CONTROL DDRA
//LCD의 7~14번의 포트
#define LCD_PORT_DATA PORTB
#define LCD_DDR_DATA DDRB
/***** Delay 함수 ******/
//delay 함수로 #include<avr/delay.h> 보다 나은것 같음
//이 소스는 윤덕용 선생님의 책을 인용한 것임
void Delay_us(int time_us)
{
int volatile i;
for(i=0; i<time_us; i++){ // 4 cycle +
asm volatile("PUSH R0"); // 2 cycle +
asm volatile("POP R0"); // 2 cycle + = 8 cycle = 1us for 8Mhz
asm volatile("PUSH R0"); // 2 cycle +
asm volatile("POP R0"); // 2 cycle + = 12 cycle for 11.0592MHZ
asm volatile("PUSH R0"); // 2 cycle +
asm volatile("POP R0"); // 2 cycle = 16 cycle = 1us for 16MHz
}
}
void Delay_ms(int time_ms)
{
int volatile i;
for(i=0; i<time_ms; i++)
Delay_us(1000);
}
/***** AVR 초기화 및 LCD에 대한 초기화 *****/
void Init(void)
{
LCD_DDR_DATA=0xff;
LCD_DDR_CONTROL=0x07;
Delay_ms(50);
Command(0x38); // function set(데이터 선을 8 bit 다 사용, 2줄표시 , 5x7 dot 사용)
Command(0x0C); // display control(표시(display) 켬, 커서(cursor) 끔)
Command(0x06); // entry mode set(CGRAM이나 DDRAM을 써넣거나 읽을 때
// 어드레스를 1증가 시키고 커서를 우로 이동, 시프트는 안함
Command(0x01); // clear display
Delay_ms(2);
}
/***** LCD 명령어 레지스터에 쓰는 함수 *****/
void Command(unsigned char command)
{
LCD_PORT_CONTROL = 0x00; // E = 0, R/W=0, Rs = 0
LCD_PORT_DATA = command; // 명령어 출력
LCD_PORT_CONTROL = 0x04; // E = 1 , R/W=0, Rs = 0(LCD 동작)
Delay_us(1);
LCD_PORT_CONTROL = 0x00; // E = 0, R/W=0, Rs = 0
Delay_us(50);
}
/***** LCD 데이터 레지스터에 쓰는 함수 *****/
void Data(unsigned char data)
{
LCD_PORT_CONTROL = 0x01; // E = 0, R/W=0, Rs = 1
LCD_PORT_DATA = data; // 데이터 내용 출력
LCD_PORT_CONTROL = 0x05; // E = 1, R/W=0, Rs = 1(LCD 동작)
Delay_us(1);
LCD_PORT_CONTROL = 0x01; // E = 0, R/W=0, Rs = 1
Delay_us(50);
}
/***** LCD에 글자 출력 함수 *****/
void String( unsigned char *string)
{
while(*string != '\0')
{
Data(*string);
string++;
}
}
/***** 글자 고정 출력 MAIN *****/
int main(void)
{
Init();
while(1)
{
Command(0x80); // 첫줄 사용
String(" PURESTARMAN ");
Delay_ms(1000);
Command(0xC0); // 두번째 줄 사용
String(" 2009/07/15 ");
Delay_ms(2000);
}
}
/***** 글자 깜빡 출력 MAIN *****/
int main(void)
{
Init();
while(1)
{
Command(0x80); // 첫줄 사용
String(" PURESTARMAN ");
Command(0xC0); // 두번째 줄 사용
String(" 2009/07/15 ");
Delay_ms(1000);
Command(0x01);
Delay_ms(1000);
}
}
/***** 글자 시프트 출력 MAIN *****/
int main(void)
{
unsigned char i;
Init();
while(1)
{
Command(0x80);
String("PURESTARMAN LOVE!!HAVE GOOD TIME");
Command(0xC0);
String("HAVE GOOD TIME!!PURESTARMAN LOVE");
Delay_ms(1000);
for(i=0; i<16; i++)
{ // 왼쪽 시프트
Command(0x18);
Delay_ms(300);
}
Delay_ms(1000);
for(i=0; i<16; i++)
{ // 오른쪽시프트
Command(0x1C);
Delay_ms(300);
}
Delay_ms(1000);
}
}
/***** 글자 재 출력 MAIN *****/
int main(void)
{
unsigned char i, j;
char temp[16];
Init();
while(1)
{
Command(0x80);
String(" GU GU DAN ");
for(i=2; i<=9; i++)
{
for(j=1; j<=9; j++)
{
sprintf( temp, " %d * %d = %2d ", i, j, i*j );
Command(0xC0);
String(temp);
Delay_ms(500);
}
}
}
}
'AVR' 카테고리의 다른 글
타이머 / 카운터 0 일반모드(이론) (0) | 2009.07.25 |
---|---|
TEXT LCD 제어 실습(외부 인터럽트) (0) | 2009.07.21 |
TEXT LCD 제어 이론 (0) | 2009.07.17 |
외부 인터럽트를 이용한 LED 켜고 끄기(실습) (0) | 2009.07.03 |
외부 인터럽트를 이용한 LED 켜고 끄기(이론) (0) | 2009.07.03 |