Witam.
Posiadam wyświetlacz lcd 2x16 którego nie idzie wysterować dostępnymi komendami w Bascomie. Znalazłem jednak na elektrodzie kod w C który poprawnie go obsługuje
Czy da się jakoś wkomponować ten kod do bascoma? Czy bascom łyka kod w c?
Autor tego tematu https://www.elektroda.pl/rtvforum/topic736279.html pisze że kompilował kod c w basomie avr demo ale jak to zrobić ?
Posiadam wyświetlacz lcd 2x16 którego nie idzie wysterować dostępnymi komendami w Bascomie. Znalazłem jednak na elektrodzie kod w C który poprawnie go obsługuje
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#define F_CPU 4000000
#define DDR_DB4 DDRD
#define PORT_DB4 PORTD
#define DB4 PD2
#define DDR_DB5 DDRD
#define PORT_DB5 PORTD
#define DB5 PD3
#define DDR_DB6 DDRD
#define PORT_DB6 PORTD
#define DB6 PD4
#define DDR_DB7 DDRD
#define PORT_DB7 PORTD
#define DB7 PD5
#define DDR_RS DDRD
#define PORT_RS PORTD
#define RS PD0
#define DDR_E DDRD
#define PORT_E PORTD
#define E PD1
#define SET_DB4 PORT_DB4 |= _BV(DB4)
#define CLR_DB4 PORT_DB4 &= ~_BV(DB4)
#define SET_DB5 PORT_DB5 |= _BV(DB5)
#define CLR_DB5 PORT_DB5 &= ~_BV(DB5)
#define SET_DB6 PORT_DB6 |= _BV(DB6)
#define CLR_DB6 PORT_DB6 &= ~_BV(DB6)
#define SET_DB7 PORT_DB7 |= _BV(DB7)
#define CLR_DB7 PORT_DB7 &= ~_BV(DB7)
#define SET_E PORT_E |= _BV(E)
#define CLR_E PORT_E &= ~_BV(E)
#define SET_RS PORT_RS |= _BV(RS)
#define CLR_RS PORT_RS &= ~_BV(RS)
#define LCD_X 16
#define LCD_Y 2
void _delay_loop_1(uint8_t __count)
{
__asm__ volatile (
"1: dec %0" "\n\t"
"brne 1b"
: "=r" (__count)
: "0" (__count)
);
}
void _delay_loop_2(uint16_t __count)
{
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__count)
: "0" (__count)
);
}
static __inline__ void _delay_ms(double __ms)
{
uint16_t __ticks;
double __tmp = ((F_CPU) / 4e3) * __ms;
if (__tmp < 1.0)
__ticks = 1;
else if (__tmp > 65535)
__ticks = 0;
else
__ticks = (uint16_t)__tmp;
_delay_loop_2(__ticks);
}
void out_nibble(char x)
{
CLR_DB4;
CLR_DB5;
CLR_DB6;
CLR_DB7;
if(x & _BV(0)) SET_DB4;
if(x & _BV(1)) SET_DB5;
if(x & _BV(2)) SET_DB6;
if(x & _BV(3)) SET_DB7;
}
void write_to_lcd(char x)
{
SET_E;
out_nibble(x >> 4);
CLR_E;
SET_E;
out_nibble(x);
CLR_E;
_delay_ms(1);
}
void write_command(char x)
{
CLR_RS;
write_to_lcd(x);
}
void write_char(char x)
{
SET_RS;
write_to_lcd(x);
}
void write_text(char * s)
{
while(*s)
{
write_char(*s);
s++;
}
}
void lcd_init(void)
{
char i;
DDR_DB4 |= _BV(DB4);
DDR_DB5 |= _BV(DB5);
DDR_DB6 |= _BV(DB6);
DDR_DB7 |= _BV(DB7);
DDR_E |= _BV(E);
DDR_RS |= _BV(RS);
_delay_ms(15);
CLR_E;
CLR_RS;
for(i = 0; i < 3; i++)
{
SET_E;
out_nibble(0x03);
CLR_E;
_delay_ms(5);
}
SET_E;
out_nibble(0x02);
CLR_E;
_delay_ms(1);
write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7
write_command(0x08); // wyłącz LCD, kursor i miganie
write_command(0x01); // czyść LCD
write_command(0x06); // bez przesuwania w prawo
write_command(0x0C); // włącz LCD, bez kursora i mrugania
}
void LCD_xy(uint8_t x, uint8_t y)
{
switch(y)
{
case 1: y=0x40; break;
case 2: y=0x14; break;
}
write_command(0x80+y+x);
}
void LCD_clr(void)
{
write_command(0x01);
_delay_ms(1);
LCD_xy(0,0);
}
a potem w programik:
Kod:
int main(void)
{
lcd_init();
LCD_clr();
write_text("Hello");
return(0);
}
Czy da się jakoś wkomponować ten kod do bascoma? Czy bascom łyka kod w c?
Autor tego tematu https://www.elektroda.pl/rtvforum/topic736279.html pisze że kompilował kod c w basomie avr demo ale jak to zrobić ?
