Здравствуйте, уважаемые форумчане!
Столкнулся с такой проблеммой:
написал программу, запустил на железе - заработала.
Сделал модель в Proteus - не работает вывод на дисплей, хотя остальная часть программы работает - есть адекватная реакция на нажатие кнопок (загорается светодиод).
Привожу выжимки работающей части моей программы(все лишнее, не связанное с выводом на дисплей удалил и скомпилил в WinAVR). Залил в МК - все заработало, но как-то не очень стабильно - то курсор моргает, хотя не должен, то вторая строка не выводится(редко, но бывает).
У меня есть подозрения, что дело в задержках - хотя все делал по даташитам. Может кто наступал на подобные грабли. Несколько веток читал на подобные темы - не помогло. Самое главное: почему не эмулируется в протеусе, хотя программу, написанную мной на асме, отлично эмулирует.
В прикрепленном файле программа на Си и модель для протеуса.
lcd_16x2.rar ( 47.84 килобайт )
Кол-во скачиваний: 389Жду конструктивной критики. Спасибо
Моя урезанная программа вывода на дисплей:
Код
#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define cbi(reg, bit) (reg&=~(1<<bit))
#define sbi(reg, bit) (reg|= (1<<bit))
#define LCDPORT PORTC
#define LCDDDR DDRC
#define RS 0
#define E 1
#define Rising 1
#define Falling 0
#define RS_0 cbi(LCDPORT,RS)
#define RS_1 sbi(LCDPORT,RS)
#define E_0 cbi(LCDPORT,E)
#define E_1 sbi(LCDPORT,E)
void ClearLcd(void);
void lcddata(unsigned char temp);
void lcdcmd(unsigned char temp);
void ShowStr(unsigned char *s);
unsigned int T1=0, T2=0, PreviousTime;
unsigned char z=0, Edge, Button=0, n=0;
double axel;
char buffer[15];
char hi[]="*************";
char hi2[]="++++++++++++++";
void lcdcmd(unsigned char temp){
LCDPORT = (temp & 0xF0);
RS_0; // command
E_1;
_delay_us(2);
E_0;
LCDPORT = ((temp & 0x0F) << 4);
RS_0; // command
E_1;
_delay_us(2);
E_0;
_delay_us(50);
}
void lcddata(unsigned char temp){
LCDPORT = (temp & 0xF0);
RS_1; // data
E_1;
_delay_us(2);
E_0;
LCDPORT = ((temp & 0x0F) << 4);
RS_1; // data
E_1;
_delay_us(2);
E_0;
_delay_us(50);
}
void lcdinit(void){
PORTC = 0x00;
DDRC = 0b11110011; // output
_delay_ms(50);
E_0;
RS_0;
lcdcmd(0x30);
_delay_ms(6);
lcdcmd(0x30);
_delay_ms(1); // !!! возможно эти задержки лишниие
lcdcmd(0x30);
_delay_ms(1);
lcdcmd(0x28); // 4 bit, 2 lines, 5*7 font
_delay_ms(1);
// !!! иногда курсор все-таки отображается, хотя не должен
lcdcmd(0x0C); // cursor OFF, display ON
_delay_ms(5);
lcdcmd(0x02); // Home
_delay_ms(2);
lcdcmd(0x06); // -> inc
_delay_ms(1);
ClearLcd();
}
void ClearLcd(void){
lcdcmd(0x01); // clear LCD
_delay_ms(3); // max 1.53mS
}
void ShowStr(unsigned char *s){
while(*s != 0) lcddata(*s++);
}
int main (void) {
lcdinit();
ClearLcd();
ShowStr(hi);
lcdcmd(0xC0);
_delay_ms(1);
ShowStr(hi2);
while(1);
}