SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проблема

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

Прогресс ощутимый! он уже пишет у меня. пока только отдельные буквы, но пишет! И это потрясающе! :)))

Сейчас сделаю так чтоб писал так как надо в определенную клетку и опубликую здесь. Другим начинающим пригодится)
Реклама
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение МитяРа »

Vlad0o писал(а):Сейчас сделаю так чтоб писал так как надо в определенную клетку
Потом можно с загружаемыми шрифтами потренироваться..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Реклама
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

И это можно будет попробовать. надо дальше развиваться
Vlad0o
Открыл глаза
Сообщения: 67
Зарегистрирован: Вт июл 19, 2011 19:09:46

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Vlad0o »

Код: Выделить всё

#include <C8051F310.H>

// Pin Declarations
//----------------------
#define LCD_DATA P3 // data port (P3^1;P3^2;P3^3;P3^4)


sbit LCD_RS = P1^3;
sbit LCD_E = P1^4;

sbit DB4 = P3^1;
sbit DB5 = P3^2;
sbit DB6 = P3^3;
sbit DB7 = P3^4;

volatile unsigned long tmpCnt;


void lcd_init(void); //LCD init
  void OSCILLATOR_Init (void); 
void PORT_Init (void);


void lcd_write(unsigned char);
void Delay(unsigned int); 
void lcd_CMD(unsigned char);

void lcd_string(const char *c);
void GotoXY(unsigned char x,unsigned char y);

//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------

void main (void)
{
PCA0MD &= ~0x40;// WDTE = 0 (clear watchdog timer
// enable)						
OSCILLATOR_Init (); 
PORT_Init ();

lcd_init(); //initialize lcd



LCD_RS = 1;	 


while(1)
{
GotoXY(2,2);
lcd_string("I work");
GotoXY(1,1);
lcd_string("FINE");
}
}


void OSCILLATOR_Init (void)
{
OSCICN |= 0x03; // Configure internal oscillator for
}

void PORT_Init (void)
{

P1MDOUT = 0x18; //P1.4, P1.3 
P1SKIP = 0x18; //P1.4, P1.3 
P3MDOUT = 0x1E; // P3.1, P3.2, P3.3, P3.4

XBR0 = 0x09; //sysclk

XBR1 = 0x40; // Enable crossbar and enable
// weak pull-ups
}


void Delay (unsigned int ms)
{
unsigned long tmp;
tmp = ((unsigned long) ms) * 5;
for (tmpCnt = 0; tmpCnt<tmp; tmpCnt++);
}


 

void lcd_write(unsigned char c)
{


	LCD_DATA = (c & 0xF0)>> 3; // send higher-order nibble

	LCD_E = 1;
	Delay(5);
	LCD_E = 0; // Write data to display 
	 
 	LCD_DATA = (c & 0x0F) << 1; //send lower-order nibble

	LCD_E = 1;
	Delay(5);
	LCD_E = 0; // Write data to display 

}



void lcd_init(void)	 //лучше не трогать. хорошо ж работает)))
{

		DB4 = 0;
		DB5 = 0;
		DB6 = 0;
		DB7 = 0;
		LCD_RS = 0;	// write control bytes
		LCD_E = 0;
	
Delay(2000);
// power on delay 15ms
Delay(2000);

//Set LCD_DATA to high nibble of Software Reset 
//LCD_DATA = (LCD_DATA&0x0F)|0x30; 
DB4 = 1;
DB5 = 1;
DB6 = 0;
DB7 = 0;
LCD_E = 1; 
Delay(50); // Wait 5ms 
LCD_E = 0; // Write data to display 

Delay(1000); // Wait 5ms 

LCD_E = 1;
Delay(50);
LCD_E = 0; // Write data to display again (SW Reset) 
Delay(1000); // Wait 5ms 

LCD_E = 1;
Delay(50);
LCD_E = 0; // Write data to display again (SW Reset) 
Delay(1000); // Wait 5ms 

// Set LCD_DATA to high nibble of Function Set (4Bit) 
//LCD_DATA = (LCD_DATA&0x0F)|0x20; 
DB4 = 0;
DB5 = 1;
DB6 = 0;
DB7 = 0;

LCD_E = 1;
Delay(50);
LCD_E = 0; // Write data to display 
Delay(500); 
		   

	lcd_write(0x28);
	Delay(500);
	lcd_write(0x08);
	Delay(500);
	lcd_write(0x01);
	Delay(1000);
	lcd_write(0x0C);
	Delay(1000);
	//lcd_write(0x06);
	lcd_write(0x06);
	Delay(1000);
	
}

void lcd_string(const char *a)		//отправка слова
{

while (*a) 
	{
		lcd_write(*a++);
	}
}

 
void lcd_CMD(unsigned char c)		//отправка команды
{

	 LCD_RS = 0;
	LCD_DATA = (c & 0xF0)>> 3; // send higher-order nibble

	LCD_E = 1;
	Delay(5);
	LCD_E = 0; // Write data to display 
	 
 	LCD_DATA = (c & 0x0F) << 1; //send lower-order nibble

	LCD_E = 1;
	Delay(5);
	LCD_E = 0; // Write data to display 

	LCD_RS = 1;

}
void GotoXY(unsigned char x,unsigned char y) //установка курсора в нужное место
{
lcd_CMD((0x7f+y)|((x>>1)<<6));
}




void GotoXY(unsigned char x,unsigned char y) - работает немного странно. скопировал с китайского проекта и пока не разбирался. просто вставил как есть)


а все остальное работает шикарно! буду дальше пилить)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: SiLabs c8051f314 + LCD DV16210 Не могу понять в чем проб

Сообщение Ser60 »

Я не советую брать куски кода откуда попало. Команды установки курсора в позицию (х,у) зависят от числа символов отображаемых в строке дисплея (включая скроллинг) и в том проекте это число может отличаться от Вашего случая. Соответственно, оффсет позиции курсора в памяти для экранной позиции (х,у) Все команды поддерживаемые Вашим LCD описаны в его даташите, следует лишь включить мозг.
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»