В общем ситуация такая, всю жизнь сидел на CodeVision, а тут решил перейти на IAR. А там как оказалось нет библиотеки для ЖК, ну я взял и попытался написать простенькую прогу которая выводит букву А на экран ( 20 * 4 ), ну и нифига у меня не работает
У кого есть библиотечка выложите пожалуйста
Ну или ткините кто нибудь в ошибку (если вся программа не есть ошибка).
Код
#include <delay.h>
#include <iom128.h>
#include <intrinsics.h>
void DB_SET_RESET (int DB7, int DB6, int DB5, int DB4);
void LCD_PORT_INIT (void);
void LCD_INIT (void);
void LCD_PRINT (void);
void LCD_CLEAR (void);
int main( void )
{
delay_s(2); //Пауза
DDRB |= (1<<4);
PORTB |= (1<<4); // Зажгли светодиод
LCD_PORT_INIT(); //Установили порт С на выход
LCD_CLEAR(); //Очистка экрана
LCD_PRINT(); //Выводим букву А
for(;;);
return 0;
}
void DB_SET_RESET (int DB7, int DB6, int DB5, int DB4)
{
if (DB7)
PORTC |= (1<<7); // DB7 = 1
else
PORTC &= 0x7F; // DB7 = 0
if (DB6)
PORTC |= (1<<6); // DB6 = 1
else
PORTC &= 0xBF; // DB6 = 0
if (DB5)
PORTC |= (1<<5); // DB5 = 1
else
PORTC &= 0xDF; // DB5 = 0
if (DB4)
PORTC |= (1<<4); // DB4 = 1
else
PORTC &= 0xEF; // DB4 = 0
}
void LCD_PORT_INIT (void)
{
/* Инициализация портов для LCD */
DDRC |= (1<<0); // RS
DDRC |= (1<<1); // RW
DDRC |= (1<<2); // EN
DDRC |= (1<<4); // DB4
DDRC |= (1<<5); // DB5
DDRC |= (1<<6); // DB6
DDRC |= (1<<7); // DB7
}
void LCD_INIT (void)
{
PORTC = 0x30; // RS=0,R/W=0,E=0, DB7=0, DB6=0, DB5=1, DB4=1
delay_ms(5);
PORTC = 0x30; // RS=0,R/W=0,E=0, DB7=0, DB6=0, DB5=1, DB4=1
delay_us(100);
PORTC = 0x30; // RS=0,R/W=0,E=0, DB7=0, DB6=0, DB5=1, DB4=1
delay_us(100);
DB_SET_RESET(0,0,1,0); // Установка 4 битного режима DB7=0, DB6=0, DB5=1, DB4=0
delay_ms(2);
DB_SET_RESET(0,0,1,0); //Установка параметров DB7=0, DB6=0, DB5=1, DB4=0
delay_ms(2);
DB_SET_RESET(1,0,0,0); //DB7=1, DB6=0, DB5=0, DB4=0
delay_ms(2);
DB_SET_RESET(0,0,0,0); //Включение дисплея DB7=0, DB6=0, DB5=0, DB4=0
delay_ms(2);
DB_SET_RESET(1,0,0,0); //DB7=1, DB6=0, DB5=0, DB4=0
delay_ms(2);
DB_SET_RESET(0,0,0,0); //Очистка дисплея DB7=0, DB6=0, DB5=0, DB4=0
delay_ms(2);
DB_SET_RESET(0,0,0,1); //DB7=0, DB6=0, DB5=, DB4=1
delay_ms(2);
DB_SET_RESET(0,0,0,0); //Установка режима ввода данных DB7=0,DB6=0,DB5=1,DB4=0
delay_ms(2);
DB_SET_RESET(0,1,1,0); //DB7=0, DB6=1, DB5=1, DB4=0
delay_ms(2);
}
void LCD_PRINT (void)
{
/* Установка адреса 0 */
PORTC &= 0xFE; // RS = 0
PORTC &= 0xFD; // R/W = 0
PORTC |= (1<<2); // E = 1
PORTC |= (1<<7); // DB7 = 1
DB_SET_RESET(1,0,0,0);
PORTC &= 0xFB; // E = 0
delay_us(50);
PORTC |= (1<<2); // E = 1
DB_SET_RESET(0,0,0,0); // DB7=0, DB6 = 0, DB5 = 0, DB4 = 0
PORTC &= 0xFB; // E = 0
delay_us(50);
/* Вывод буквы A */
PORTC |= (1<<0); // RS = 1
PORTC |= (1<<2); // E = 1
DB_SET_RESET(0,1,0,0);
PORTC &= 0xFB; // E = 0
delay_us(40);
PORTC |= (1<<2); // E = 1
DB_SET_RESET(0,0,0,1);
PORTC &= 0xFB; // E = 0
delay_us(50);
}
void LCD_CLEAR(void)
{
PORTC &= 0xFE; // RS = 0
PORTC &= 0xFD; // R/W = 0
PORTC |= (1<<2); // E = 1
DB_SET_RESET(0,0,0,0);
PORTC &= 0xFB; // E = 0
delay_ms(2);
PORTC |= (1<<2); // E = 1
DB_SET_RESET(0,0,0,1);
PORTC &= 0xFB; // E = 0
delay_ms(2);
}
Сообщение отредактировал Dars - Feb 5 2006, 19:58