사용부품
[링크 : http://www.us-technology.co.kr/product/product_main.asp?mode=101&smode=9] v3.0 보드
[링크 : http://devicemart.co.kr/goods/view.php?seq=1075057 ] LC1628 (동일 부품 아닐수도 있음)
참고소스
[링크 : http://www.avrprojects.net/attachments/lcdinterface.c]
참고 데이터시트
[링크 : http://www.ganasys.co.kr/kor/support_board2/pds_file/LC1628-BMDWH6Rev1.0.pdf]
lc1628.h
/******************************************************* LC1628 definition *******************************************************/ /***************** position *****************/ #define CLCD_RS 0x01 #define CLCD_RW 0x02 #define CLCD_E 0x04 #define CLCD_DA 0xF0 /***************** command *****************/ /* RS R/W = 0x00 */ #define CMD_CLS 0x01 // Clear Display #define CMD_RTH 0x02 // Return HOME #define CMD_MOD 0x04 // Entry Mode Set #define MOD_INC 0x02 #define MOD_DEC 0x00 #define MOD_SHL 0x01 #define MOD_SHR 0x00 #define CMD_DIS 0x08 // Display on/off #define DIS_ON 0x04 #define DIS_CUR 0x02 #define DIS_BLK 0x01 #define CMD_CUR 0x10 // Cursor or Display Shift #define CUR_CUR 0x08 #define CUR_ALL 0x00 #define CUR_LEF 0x04 #define CUR_RIG 0x00 #define CMD_FNC 0x20 // Function Set #define FNC_DL8 0x10 #define FNC_DL4 0x00 #define FNC_DN2 0x08 #define FNC_DN1 0x00 #define FNC_H10 0x04 #define FNC_H07 0x00 #define CMD_CGA 0x40 // Set CGRAM Address #define CRA_ADR 0x3F #define CMD_DDA 0x80 // Set DDRAM Address
lc1628.c
#include < stdio.h >
#include < avr/io.h >
#include < util/delay.h >
#include "lc1628.h"
#define DEFAULT_DLY 20
static int uart_putchar(char c, FILE *stream)
{
if (c == '\n') uart_putchar('\r', stream);
loop_until_bit_is_set(UCSR0A, UDRE);
UDR0 = c;
return 0;
}
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
/*************************************************/
void ls1628_write_cmd(char cmd)
{
/**************************************/
// set RS & R/W
PORTC = 0x00;
// set E clock to high
_delay_us(DEFAULT_DLY); // 40ns delay
PORTC |= CLCD_E;
// data set - high nibble
PORTC |= (cmd & 0xF0);
_delay_us(DEFAULT_DLY); // 80ns delay
// set E clock to low
PORTC &= (~CLCD_E);
_delay_us(DEFAULT_DLY); // 10ns delay
// release RW
PORTC &= (~CLCD_RW);
/**************************************/
// set RS & R/W
PORTC = 0x00;
// set E clock to high
_delay_us(DEFAULT_DLY); // 40ns delay
PORTC |= CLCD_E;
// data set - low nibble
PORTC |= ((cmd & 0x0F) << 4);
_delay_us(DEFAULT_DLY); // 80ns delay
// set E clock to low
PORTC &= (~CLCD_E);
_delay_us(DEFAULT_DLY); // 10ns delay
// release RW
PORTC &= (~CLCD_RW);
}
void ls1628_write_char(char data)
{
/**************************************/
// set RS & R/W
PORTC = CLCD_RS;
// set E clock to high
_delay_us(DEFAULT_DLY); // 40ns delay
PORTC |= CLCD_E;
// data set - high nibble
PORTC |= (data & 0xF0);
_delay_us(DEFAULT_DLY); // 80ns delay
// set E clock to low
PORTC &= (~CLCD_E);
_delay_us(DEFAULT_DLY); // 10ns delay
// release RW
PORTC &= (~CLCD_RW);
/**************************************/
// set RS & R/W
PORTC = CLCD_RS;
// set E clock to high
_delay_us(DEFAULT_DLY); // 40ns delay
PORTC |= CLCD_E;
// data set - low nibble
PORTC |= ((data & 0x0F) << 4);
_delay_us(DEFAULT_DLY); // 80ns delay
// set E clock to low
PORTC &= (~CLCD_E);
_delay_us(DEFAULT_DLY); // 10ns delay
// release RW
PORTC &= (~CLCD_RW);
}
/*************************************************/
void ls1628_cmd_clear()
{
ls1628_write_cmd(CMD_CLS);
}
void li1628_cmd_setpos(char y, char x)
{
// y must 0(1st line) or 1(2nd line)
ls1628_write_cmd(CMD_DDA | (y * 0x40 + x));
}
void ls1628_write_string(char *data)
{
int idx = 0;
while(data[idx] != 0x00)
ls1628_write_char(data[idx++]);
}
/*************************************************/
void init_clcd(void)
{
_delay_ms(50);
ls1628_write_cmd(CMD_FNC | FNC_DL4 | FNC_DN2 | FNC_H07); // fuction set
PORTC = CLCD_E; // unknown
_delay_us(80); // 39 us wait
ls1628_write_cmd(CMD_DIS | DIS_ON | DIS_CUR | DIS_BLK); // disp on/off control
_delay_us(80); // 39 us wait
ls1628_write_cmd(CMD_CLS); // disp clear
_delay_ms(2); // 1.53ms wait
ls1628_write_cmd(CMD_MOD | MOD_INC | MOD_SHR); // entry mode set CMD_MOD
_delay_us(80);
ls1628_write_cmd(CMD_DDA);
_delay_us(80);
}
void init_uart0(void)
{
/* UART0 115200-N-8-1 */
UBRR0H = 0;
UBRR0L = 8; // 115k with U2X = 0
UCSR0A = 0x00; // U2X = 0;
UCSR0B = 0xD8;
UCSR0C = 0x06; //Asyncronous - no parity - 1bits(stop) - 8bits(data)
stdout = &mystdout;
printf("\n\n\n\n\n");
}
void init_atmega(void)
{
DDRC = 0xFF;
PORTC = 0xFF;
SFIOR = SFIOR | 0x04;
init_uart0();
}
int main(void)
{
init_atmega();
init_clcd();
li1628_cmd_setpos(0,3);
ls1628_write_string("Hello World");
li1628_cmd_setpos(1,0);
ls1628_write_string("ATmega128 CLCD");
return 0;
}'embeded > AVR (ATmega,ATtiny)' 카테고리의 다른 글
| ATmega8 로 ES-311(HS-311) 서보 제어하기 (2) | 2013.12.29 |
|---|---|
| ATtiny2313 / ATmega8 인공호흡! (0) | 2013.12.27 |
| ATmega128 + LC1628 제어하기 2 (0) | 2013.12.24 |
| ATmega128 + LC1628 제어하기 1 (0) | 2013.12.24 |
| lc1628 예제 소스 (0) | 2013.12.20 |