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'а. В гугле искал, не помогло. Заранее спасибо за ответ.
Сейчас этот форум просматривают: Google [Bot] и гости: 17