Чт май 24, 2018 14:47:23
Чт май 24, 2018 14:55:14
По pdf на atmega88v - выход по порту 40mA max. При R4=680 - ток 7,4mA (max), что более чем с 5-ти кратным запасом. К тому же, возможно номинал R4 придётся увеличивать.clawham писал(а):...хоть там и потребление должно быть мизерное, но через транзистор спокойнее чтоль...
Чт май 24, 2018 15:25:11
Чт май 24, 2018 15:28:31
Чт май 24, 2018 15:30:28
Пн окт 08, 2018 11:50:05
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"
void strobe_lcd(void){
LCD_E_PORT|=LCD_E;
_delay_us(20);
LCD_E_PORT&=~LCD_E;
_delay_us(20);
//LCD_E_PORT|=LCD_E;
}
void send_byte(char byte){
byte&0x80?(LCD_DT7_PORT |= LCD_DT7):(LCD_DT7_PORT &= ~LCD_DT7);
byte&0x40?(LCD_DT6_PORT |= LCD_DT6):(LCD_DT6_PORT &= ~LCD_DT6);
byte&0x20?(LCD_DT5_PORT |= LCD_DT5):(LCD_DT5_PORT &= ~LCD_DT5);
byte&0x10?(LCD_DT4_PORT |= LCD_DT4):(LCD_DT4_PORT &= ~LCD_DT4);
strobe_lcd();
}
//Командуем
void lcd_cmd(char a){
LCD_RS_PORT&=~LCD_RS;
send_byte(a);
send_byte(a<<4);
}
//Данные
void lcd_data(char a){
LCD_RS_PORT|=LCD_RS;
send_byte(a);
send_byte(a<<4);
}
/*Подметаемся*/
void lcd_clear(void){
lcd_cmd(0x01);
_delay_ms(2);
}
/**INSTALL LCD**/
void init_lcd_ports(void){
LCD_RS_DDR|=LCD_RS;
LCD_E_DDR|=LCD_E;
LCD_DT7_DDR|=LCD_DT7;
LCD_DT6_DDR|=LCD_DT6;
LCD_DT5_DDR|=LCD_DT5;
LCD_DT4_DDR|=LCD_DT4;
LCD_RS_PORT&=~LCD_RS;
LCD_E_PORT&=~LCD_E;
LCD_DT7_PORT&=~LCD_DT7;
LCD_DT6_PORT&=~LCD_DT6;
LCD_DT5_PORT&=~LCD_DT5;
LCD_DT4_PORT&=~LCD_DT4;
}
//
void lcd_init(void){
init_lcd_ports();
_delay_ms(200);
LCD_RS_PORT&=~LCD_RS;
send_byte(0x30);
_delay_ms(6);
send_byte(0x30);
_delay_us(200);
send_byte(0x30);
_delay_ms(1);
send_byte(0x20); //4 бит
lcd_cmd(0x28); //4 бит
_delay_ms(1);
lcd_cmd(0x08);//отображение и курсоры выключены.
_delay_ms(1);
lcd_clear();
lcd_cmd(0x06);//режим увеличения счетчика
_delay_ms(1);
lcd_cmd(0x0C);//отображение включено, курсоры выключены.
_delay_ms(10);
}
int main(void){
lcd_init();
_delay_ms(200);
lcd_data(48);//"0"
while(1){ }
}
#define LCD_RS_DDR DDRB
#define LCD_RS_PORT PORTB
#define LCD_RS 1<<2
#define LCD_E_DDR DDRB
#define LCD_E_PORT PORTB
#define LCD_E 1<<1
#define LCD_DT7_DDR DDRD
#define LCD_DT7_PORT PORTD
#define LCD_DT7 1<<7
#define LCD_DT6_DDR DDRD
#define LCD_DT6_PORT PORTD
#define LCD_DT6 1<<6
#define LCD_DT5_DDR DDRD
#define LCD_DT5_PORT PORTD
#define LCD_DT5 1<<5
#define LCD_DT4_DDR DDRD
#define LCD_DT4_PORT PORTD
#define LCD_DT4 1<<4
#define LCD_RS_DDR DDRD
#define LCD_RS_PORT PORTD
#define LCD_RS 1<<5
#define LCD_E_DDR DDRD
#define LCD_E_PORT PORTD
#define LCD_E 1<<6
#define LCD_DT7_DDR DDRB
#define LCD_DT7_PORT PORTB
#define LCD_DT7 1<<2
#define LCD_DT6_DDR DDRB
#define LCD_DT6_PORT PORTB
#define LCD_DT6 1<<1
#define LCD_DT5_DDR DDRB
#define LCD_DT5_PORT PORTB
#define LCD_DT5 1<<0
#define LCD_DT4_DDR DDRD
#define LCD_DT4_PORT PORTD
#define LCD_DT4 1<<7
Пн окт 08, 2018 12:19:26
Пн окт 08, 2018 12:57:33
#define LCD_RS_DDR DDRB
#define LCD_RS_PORT PORTB
#define LCD_RS 1<<2
LCD_RS_PORT&=~LCD_RS;
PORTB&=~1<<2;
PORTB &= ((~1) << 2);
PORTB &= 0b11111000;
LCD_RS_PORT&=~LCD_RS;
#define LCD_RS (1<<2)
Пн окт 08, 2018 16:14:26
Пн дек 03, 2018 08:44:04
Пн дек 03, 2018 10:29:51
когда-то давно делал самhcm писал(а):под просто под avr-gcc не чего не могу найти
Вт июн 04, 2019 20:36:40
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <stdio.h>
#include "lcd.h"
unsigned char lines[8] =
{
0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, // Двойная черта высотой по 2 точки сверху и снизу.
};
int main(void)
{
DDRB = 128;
DDRC = 255;
DDRD = 255;
unsigned char i;
lcd_init(LCD_DISP_ON); // Дисплей включен, курсор выключен.
// Загружаем свои символы в CGRAM
lcd_command(0x40); // Переходим в CGRAM
for(i=0; i<8; i++)
{
lcd_data(lines[i]);
}
lcd_command(0x80); // Возвращаемся в DDRAM
while(1)
{
// Переходим на начальную позицию и вызываем записанный символ.
lcd_gotoxy(0, 0);
lcd_putc(0);
}
return 0;
}
Вт июн 04, 2019 20:49:30
Вт июн 04, 2019 21:37:00
Ср июн 05, 2019 07:59:51
// Загружаем свои символы в CGRAM
lcd_command(0x40); // Переходим в CGRAM
for(i=0; i<8; i++)
{
lcd_data(lines[i]);
}
// Переходим на начальную позицию и вызываем записанный символ.
lcd_gotoxy(0, 0);
lcd_putc(0);
while(1)
{
}
Ср июн 05, 2019 09:50:32
Ср июн 05, 2019 10:54:23
Ср июн 05, 2019 11:44:29
у Peter Fleury в библиотеке есть один баг, но с описанной проблемой он никак не связан. баг в том, что при вычислении адреса ячейки ОЗУ для дисплеев с числом строк больше 2 он использует не битовое ИЛИ, а обычное суммирование. Для двух строк выходит так, что переполнение при сложении не возникает, а для остальных получается так, что возникает перенос битов при суммировании... если заменить + на | - все начинает работать отлично.trengtor писал(а):Что-то, видимо, в библиотеке.
Ср июн 05, 2019 14:57:28
lcd_command((1<<LCD_DDRAM)+addressCounter);
Ср июн 05, 2019 14:58:34