|  | roboforum.ruТехнический форум по робототехнике. |  | 

EdGull писал(а):фусибиты перевел на кварц?

EdGull писал(а):та проишка тоже на 12мгц ?


//****************************************************************************************************
//************************************    my_lcd.c    ************************************************
//****************************************************************************************************
//************************************   Месяц А.     ************************************************
//****************************************************************************************************
//1.Скопировать этот файл в папку с проектом и подключить при помощи " #include <my_lcd.c> "
//2.Подключить порты к LCD и сконфигурировать их на выход.
#include <io.h>
#include <delay.h>
//****************************************************************************************************
//****************************  Настройка подключения LCD  *******************************************
//****************************************************************************************************
#define COLUMNS 16  //количество символов в строке
#define EN PORTB.2
#define RS PORTB.0
#define LCD_PD4 PORTB.4
#define LCD_PD5 PORTB.5
#define LCD_PD6 PORTC.1
#define LCD_PD7 PORTC.0
//****************************************************************************************************
//****************************************************************************************************
//****************************************************************************************************
#define COMAND   0   // Команда
#define DATA   1   // Данные
#define lcd_delay 1 //При необходимости, подстроить
#pragma used+
//функции
void lcd_write(unsigned char data, unsigned char mode);
void lcd_init(void);
void lcd_putchar(unsigned char data);              // отображение 1 символа в позиции (последняя + 1)
void lcd_gotoxy(unsigned char x, unsigned char y); // задание позиции 1 символа x - символ =0..39 y - строка =0..3
void lcd_clear(void);                              // очистка LCD
void lcd_puts(char *str);                          // вывод символа расположенного в SRAM на LCD
void lcd_putsf(char flash *str);                   // вывод символа расположенного в FLASH на LCD
void lcd_cursor_on(void);
void lcd_cursor_off(void);
void lcd_clear_string(unsigned char y,unsigned char from,unsigned char to);// очистка нужного количества символов в строке
//****************************************************************************************************
flash unsigned char base_y[4]={0x80,0xc0,0x80+COLUMNS,0xc0+COLUMNS};// стартовые значения 1 и 2 строки
unsigned char lcd_x, lcd_y;              // переменные для хранения последней позиции символа
//****************************************************************************************************
void lcd_write(unsigned char data, unsigned char mode){
if (mode)RS = 1;else RS = 0;   //выбор режима 1-data 0-comand
delay_us(lcd_delay);
// старший нибл
if (data & (1<<7)) LCD_PD7=1; else LCD_PD7=0;
if (data & (1<<6)) LCD_PD6=1; else LCD_PD6=0;
if (data & (1<<5)) LCD_PD5=1; else LCD_PD5=0;
if (data & (1<<4)) LCD_PD4=1; else LCD_PD4=0;
EN = 1;
delay_us(lcd_delay);
EN = 0;
delay_us(lcd_delay);
//младший нибл
if (data & (1<<3)) LCD_PD7=1; else LCD_PD7=0;
if (data & (1<<2)) LCD_PD6=1; else LCD_PD6=0;
if (data & (1<<1)) LCD_PD5=1; else LCD_PD5=0;
if (data & (1<<0)) LCD_PD4=1; else LCD_PD4=0;
EN = 1;
delay_us(lcd_delay);
EN = 0;
delay_us(lcd_delay);
LCD_PD7=1; LCD_PD6=1; LCD_PD5=1; LCD_PD4=1;
delay_ms(lcd_delay);
}//lcd_write()
//****************************************************************************************************
void lcd_init(){
RS=0;
EN=0;
delay_ms(200);
lcd_write(0x33, COMAND);
delay_ms(5);
lcd_write(0x32, COMAND);
lcd_write(0x28, COMAND); // 4 бит, 2 строки
lcd_write(0x08, COMAND); // полное выключение дисплея
lcd_write(0x01, COMAND); // очистка дисплея
lcd_write(0x06, COMAND); // сдвиг курсора вправо
lcd_write(0x0C, COMAND); // включение дисплея, выключение курсора
lcd_clear();
}//lcd_init();
//****************************************************************************************************
void lcd_gotoxy(unsigned char x, unsigned char y){
if (y<=3)lcd_write((base_y[y]+lcd_x),COMAND);
else lcd_write((base_y[0]+lcd_x),COMAND);
lcd_x=x;
lcd_y=y;
}//lcd_gotoxy()
//****************************************************************************************************
// очистка дисплея LCD
void lcd_clear(void){
lcd_write(2,COMAND);   // cursor home
lcd_write(0x0c,COMAND); // cursor off
lcd_write(1,COMAND);   // clear
lcd_x=lcd_y=0;
}//lcd_clear()
//****************************************************************************************************
// очистка нужного количества символов в строке
void lcd_clear_string(unsigned char y,unsigned char from,unsigned char to){
while(from <= to){
        lcd_gotoxy(from++,y);
        lcd_putchar(' ');
};//while
}//lcd_clear_string()
//****************************************************************************************************
void lcd_cursor_on(){
lcd_write(0x0d,COMAND);
}//lcd_cursor_on()
//****************************************************************************************************
void lcd_cursor_off(){
lcd_write(0x0c,COMAND);
}//lcd_cursor_off()
//****************************************************************************************************
void lcd_putchar(unsigned char data){
if (lcd_x>(COLUMNS-1)){
        if (++lcd_y>3)lcd_y=0;
        lcd_x=0;
};//if
lcd_gotoxy(lcd_x,lcd_y);
lcd_write(data, DATA);
lcd_x++;
}//lcd_putchar();
//****************************************************************************************************
// вывод символа расположенного в SRAM на LCD
void lcd_puts(char *str){
while(*str)lcd_putchar(*str++);// передача символа
}//lcd_puts()
//****************************************************************************************************
// вывод символа расположенного в FLASH на LCD
void lcd_putsf(char flash *str){
while(*str)lcd_putchar(*str++);// передача символа
}//lcd_putsf()
//****************************************************************************************************
#pragma used-


Master писал(а):А может стоит взять Mega16 и закрыть вопрос с недостатком ног?


Shaab писал(а):Нужно подлключить LCD на HD44780 (4 строки, 40 символов) к 8й меге по 4х-битному интерфейсу. Стандартные заготовки расчитаны на использование или фиксированных пинов или пинов в произвольном порядке, но в пределах одного порта. А у меня по схеме линии контроля висят на порту С, а данные на порту D (схема изменению не подлежит). Если можно, то подскажите как реализовать задуманное для Bascom'а. В гугле искал, не помогло. Заранее спасибо за ответ.

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0