• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

ATmega8 и LCD

  • Автор темы Автор темы WOLF007
  • Дата начала Дата начала

WOLF007

Ученик
Почётный участник
Регистрация
24 Фев 2009
Сообщения
806
Реакции
10
Баллы
0
ATmega8 и LCD

Решил попробовать разобраться как сей девайс работает источник тут
код
Код:
/****Тестовая программа для LCD****/
 
#include <io.h>
#include <delay.h>   //используем стандартную процедуру задержки
 
#define RS PC0          //RS подключаем к PC0 микроконтроллера
#define EN PC2          //EN подключаем к PC2 микроконтроллера
 
/***Функция записи команды в LCD***/
 
void lcd_com(unsigned char p) //'p' байт команды
{
PORTC &= ~(1<<RS);   // RS = 0
PORTC |= (1<<EN);    // EN = 1 (начало записи команды в LCD)
PORTD = p;             // вывод команды на шину DB0-7 LCD
delay_us(100);        // длительность сигнала EN
PORTC &= ~(1 << EN);   // EN = 0 (конец записи команды в LCD)
delay_us(100);        // пауза для выполнения команды
}
 
/***Функция записи данных в LCD***/
 
void lcd_dat(unsigned char p)  //'p' байт команды
{
PORTC |= (1 << RS)|(1 << EN);  //RS = 1, EN = 1 (начало записи команды в LCD)
PORTD = p;                     //вывод команды на шину DB0-7 LCD
delay_us(100);                // длительность сигнала EN
PORTC &= ~(1 << EN);           // EN = 0 (конец записи команды в LCD)
delay_us(100);                // пауза для выполнения команды
}
 
/***Функция инициализации LCD***/
 
void lcd_init(void)
{
lcd_com(0x08);          // полное выключение дисплея
lcd_com(0x38);           // 8 бит 2 строки
delay_us(100);
lcd_com(0x38);           // 8 бит 2 строки
delay_us(100);
lcd_com(0x38);           // 8 бит 2 строки
lcd_com(0x38);
lcd_com(0x01);           // очистка дисплея
delay_us(100);
lcd_com(0x06);           // сдвиг курсора вправо
lcd_com(0x0D);           // включение дисплея, мигающий курсор
}
 
/***Основная программа***/
 
int main (void)
{
DDRC |= (1 << PC2)|(1 << PC1)|(1 << PC0); // PC0-3 выходы
PORTC = 0x00;                      // лог. 0 на выходе
DDRD = 0xff;                       // PD0-7 выходы
PORTB = 0x00;
 
lcd_init();      // инициализация дисплея
lcd_dat('H');    // выводим символы на экран
lcd_dat('e');
lcd_dat('l');
lcd_dat('l');
lcd_dat('o');
lcd_dat(' ');
lcd_dat('w');
lcd_dat('o');
lcd_dat('r');
lcd_dat('l');
lcd_dat('d');
lcd_dat('!');
}
при компиляции в CodeVisionAvr ругается
Error: C:\Users\dog\Desktop\test\test_cld.c(13): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(14): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(15): undefined symbol 'PORTD'
Error: C:\Users\dog\Desktop\test\test_cld.c(17): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(25): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(26): undefined symbol 'PORTD'
Error: C:\Users\dog\Desktop\test\test_cld.c(28): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(51): the 'main' function must return 'void' type
Error: C:\Users\dog\Desktop\test\test_cld.c(54): undefined symbol 'PORTC'
Error: C:\Users\dog\Desktop\test\test_cld.c(55): undefined symbol 'DDRD'
 
Ну что, разобрался?
 
разобрался. Больше читать маны надо=)
 
В чем был косяк?
 
Ну один из косяков это то, что функция main объявлена как int но ничего не вернула. т.е. в конец функции ндо было вставить
Код:
return 0;
к примеру
 
А почему компилятор на порт C ругается?
 
Немножко апнем темку
подключение
Микросхема | Дисплей
PB0 -> RS
PB1 -> RW
PB2 -> E
PB4 -> D4
PB5 -> D5
PB6 -> D6
PB7 -> D7
Код:
#include <mega8.h>
#include <delay.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
////////////////////////////////////////////////////////////////////////////////////
short int i;

void main(void)
{
PORTB=0x00;
DDRB=0xFF; 


lcd_init(16);  //initialization
// Global enable interrupts
#asm("cli") //delay   
	
	lcd_gotoxy(0,0); //тут мы шагаем на первую строку к первому символу
  	lcd_putsf("Технический");
  	lcd_putsf("        OTDEL"); 
}
 
Последнее редактирование:
Добавлю адреса портов
/********
По поводу портов описаны они в даташите к atmega8
укажу здесь список портов и их 16-тиричный адрес
PORTB = 0x18;
PORTC = 0x15;
PORTD = 0x12;
 
Назад
Сверху