Сейчас сделаю так чтоб писал так как надо в определенную клетку и опубликую здесь. Другим начинающим пригодится)
Сейчас сделаю так чтоб писал так как надо в определенную клетку и опубликую здесь. Другим начинающим пригодится)
Потом можно с загружаемыми шрифтами потренироваться..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));
}