[an error occurred while processing this directive]
Помогите советом! Я совсем запутался с этим LCD
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
миниатюрный аудио-видеорекордер mAVR

Отправлено gdi 19 июля 2002 г. 11:09

Я взял файл-пример работы с LCD для AVR 2313, но там было сделано для 8-ми проводного интерфейса, а мне надо тоже самое, только по 4-м линиям. Ну не хочет оно работать и всё тут. Может быть ткнёте меня носом что тут не так. Я понимаю, что прога тривиальная. У меня на "асме" всё работает, а на С в ImageCraft-e не хочет!

/*------------------------------------------------------------------ * PD4 (pin8) --> pin5 LCD ('WR).
* PD5 (pin9) --> pin4 LCD (RS).
* PD6 (pin11) --> pin6 LCD (E).
* Resonator frequency = 4 MHz
*------------------------------------------------------------------*/


#include

#pragma interrupt_handler timer:5

// simple helper macros'
#define LCD_E (1 << 5)
#define LCD_RS (1 << 4)
#define lcd_set_e() (PORTD |= LCD_E)
#define lcd_set_rs() (PORTD |= LCD_RS)
#define lcd_clear_e() (PORTD &= ~LCD_E)
#define lcd_clear_rs() (PORTD &= ~LCD_RS)

// short delay for lcd
void delay(int ticks)
{
while(ticks--);
}

// lcd strobe
void lcd_pulse(void)
{
lcd_set_e();
delay(4);
lcd_clear_e();
delay(4);
}

// medium delay (long for lcd, but much less than a second)
void lcd_wait(void)
{
delay(1000);
}

// send byte to lcd
void lcd_send_command(unsigned char data)
{
unsigned char temp;
lcd_wait();
temp = data;

data >>= 4;
data &=0x0F;
lcd_clear_rs();
PORTD = data;
lcd_pulse();

data = temp;
data &=0x0F;
lcd_clear_rs();
PORTD = data;
lcd_pulse();
}

// send byte to lcd
void lcd_send(unsigned char data)
{
unsigned char temp;
lcd_wait();
temp = data;

data >>= 4;
data &=0x0F;
lcd_set_rs();
PORTD = data;
lcd_pulse();

data = temp;
data &=0x0F;
lcd_set_rs();
PORTD = data;
lcd_pulse();
}

// clear screen
void clrscr(void)
{
lcd_clear_rs();
lcd_send_command(0x01);
lcd_wait();
}

// init display
void initgraph(void)
{
//DDRB = 0xFF;
DDRD = 0xFF;//|= (LCD_E | LCD_RS | LCD_RW);
lcd_clear_rs();
lcd_send_command(0x20);
lcd_send_command(0x0C);
lcd_send_command(0x20);
lcd_send_command(0x01);
}

// goto lcd memory address
void gotoz(unsigned char z)
{
lcd_clear_rs();
lcd_send_command(z | 0x80);
}
#define gotoxy(x,y) gotoz((x)|((y)<<6))

// output single character
void putchar(char c)
{
lcd_set_rs();
lcd_send(c);
}

// output string
void outtext(char* text)
{
unsigned char i;
for(i = 0; text[i] && i < 16; i++)
putchar(text[i]);
}

unsigned char hour = 0, minute = 0, second = 0;

// call one time per second
void timer(void)
{
unsigned char i;

// first, output current time
clrscr();
gotoxy(0,0);
putchar('0'+hour/10);
putchar('0'+hour%10);
putchar(':');
putchar('0'+minute/10);
putchar('0'+minute%10);
putchar(':');
putchar('0'+second/10);
putchar('0'+second%10);
// then increment counter
second++;
if(second == 60)
{
second = 0;
minute++;
if(minute == 60)
{
minute = 0;
hour++;
if(hour == 24)
{
hour = 0;
}
}
}
}

// 'main' is declared as 'int' to be compliant with ANSI-C
int main(void)
{
TIMSK = (1<<6); // set OCIE1A
TCCR1A = 0;
TCCR1B = 0x0C; // CTC1, CK/256
OCR1H = 0x3D; // 4000000/256=15625=0x3D09
OCR1L = 0x09;
TCNT1H = TCNT1L = 0;
initgraph();
timer();
SREG = 0x80; // SEI
return 0;
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru