artos5

Stm32F100 + Hd44780 = Глюк Библиотеки

45 сообщений в этой теме

artos5    286

Добрый день уважаемые! Уже второй день бьюсь над кодом... не получается решить проблему.

Проблема заключается в следующем:

Если в вечном цикле постоянно слать текст в контроллер , то на дисплее отображается полная фигня... отображается эта фигня во второй строке. Вот видео пример:

Но! Если в вечном цикле я отправляю в дисплей не постоянно данные , а только раз сразу после изменения - то индикатор отображает данные корректно....

Вот тут: http://easystm32.ru/...ary-for-hd44780

я взял за основу библиотеку.

Вот сами библиотеки:

#include "hd44780_driver.h"

void lcd_delay(void) {
volatile uint32_t tmpvar;
for (tmpvar=4000;tmpvar!=0;tmpvar--);
}

void lcd_init() {
LCD_PORT->CRH |= LCD_PORT_CRH_S;
LCD_PORT->CRL |= LCD_PORT_CRL_S;
LCD_PORT->CRH &= ~(LCD_PORT_CRH_C);
LCD_PORT->CRL &= ~(LCD_PORT_CRL_C);
lcd_delay();
lcd_delay();
lcd_delay();
lcd_delay();

lcd_set_4bit_mode();
lcd_set_state(LCD_ENABLE,CURSOR_ENABLE,NO_BLINK);
lcd_clear();
lcd_send(0x06,COMMAND);
}

void lcd_set_user_char(uint8_t char_num, uint8_t * char_data) {
uint8_t i;
lcd_send(((1<<6) | (char_num * 8) ), COMMAND);
for (i=0;i<=7;i++) {
lcd_send(char_data[i],DATA);
}
lcd_send((1<<7), COMMAND);
}

void lcd_set_xy(uint8_t x, uint8_t y) {
if (y==0) {
lcd_send( ((1<<7) | (x)),COMMAND);
} else {
lcd_send( ((3<<6) | (x)),COMMAND);
}
}


void lcd_out(char * txt) {
while(*txt) {
lcd_send(*txt,DATA);
txt++;
}
txt=0;
}

void lcd_clear(void) {
lcd_send(0x01,COMMAND);
}

void lcd_set_state(lcd_state state, cursor_state cur_state, cursor_mode cur_mode) {
if (state==LCD_DISABLE) {
lcd_send(0x08,COMMAND);
} else {
if (cur_state==CURSOR_DISABLE) {
if (cur_mode==NO_BLINK) {
lcd_send(0x0C,COMMAND);
} else {
lcd_send(0x0D,COMMAND);
}
} else {
if (cur_mode==NO_BLINK) {
lcd_send(0x0E,COMMAND);
} else {
lcd_send(0x0F,COMMAND);
}
}
}
}

void lcd_set_4bit_mode(void) {

LCD_PORT->BSRR=(LCD_DB7_BC | LCD_DB6_BC | LCD_DB5_BC | LCD_DB4_BC | LCD_CD_BC | LCD_EN_BC);
LCD_PORT->BSRR=(LCD_DB5_BS);

LCD_PORT->BSRR=LCD_EN_BS;
lcd_delay();
LCD_PORT->BSRR=LCD_EN_BC;
lcd_delay();

LCD_PORT->BSRR=(LCD_DB7_BC | LCD_DB6_BC | LCD_DB5_BC | LCD_DB4_BC | LCD_CD_BC | LCD_EN_BC);
LCD_PORT->BSRR=(LCD_DB5_BS);

LCD_PORT->BSRR=LCD_EN_BS;
lcd_delay();
LCD_PORT->BSRR=LCD_EN_BC;
lcd_delay();

LCD_PORT->BSRR=(LCD_DB7_BC | LCD_DB6_BC | LCD_DB5_BC | LCD_DB4_BC | LCD_CD_BC | LCD_EN_BC);
LCD_PORT->BSRR=(LCD_DB7_BS);

LCD_PORT->BSRR=LCD_EN_BS;
lcd_delay();
LCD_PORT->BSRR=LCD_EN_BC;
lcd_delay();

}

void lcd_send(uint8_t byte, dat_or_comm dc) {

LCD_PORT->BSRR=(LCD_DB7_BC | LCD_DB6_BC | LCD_DB5_BC | LCD_DB4_BC | LCD_CD_BC | LCD_EN_BC);

if (dc) {
LCD_PORT->BSRR=LCD_CD_BS;
}

if (byte & 0x10) {
LCD_PORT->BSRR=LCD_DB4_BS;
}
if (byte & 0x20) {
LCD_PORT->BSRR=LCD_DB5_BS;
}
if (byte & 0x40) {
LCD_PORT->BSRR=LCD_DB6_BS;
}
if (byte & 0x80) {
LCD_PORT->BSRR=LCD_DB7_BS;
}

LCD_PORT->BSRR=LCD_EN_BS;
lcd_delay();
LCD_PORT->BSRR=LCD_EN_BC;
lcd_delay();


LCD_PORT->BSRR=(LCD_DB7_BC | LCD_DB6_BC | LCD_DB5_BC | LCD_DB4_BC );

if (byte & 0x01) {
LCD_PORT->BSRR=LCD_DB4_BS;
}
if (byte & 0x02) {
LCD_PORT->BSRR=LCD_DB5_BS;
}
if (byte & 0x04) {
LCD_PORT->BSRR=LCD_DB6_BS;
}
if (byte & 0x08) {
LCD_PORT->BSRR=LCD_DB7_BS;
}

LCD_PORT->BSRR=LCD_EN_BS;
lcd_delay();
LCD_PORT->BSRR=LCD_EN_BC;
lcd_delay();


}

#include "stm32F10x.h"

/////should be defined by user /////
#define LCD_PORT GPIOA
#define LCD_CD 2
#define LCD_EN 1
#define LCD_DB4 4
#define LCD_DB5 5
#define LCD_DB6 6
#define LCD_DB7 7
///////////////////////////////////typedef enum {
COMMAND = 0,
DATA = !COMMAND
} dat_or_comm;
typedef enum {
LCD_DISABLE = 0,
LCD_ENABLE = !LCD_DISABLE
} lcd_state;typedef enum {
CURSOR_DISABLE = 0,
CURSOR_ENABLE = !CURSOR_DISABLE
} cursor_state;
typedef enum {
NO_BLINK = 0,
BLINK = !NO_BLINK
} cursor_mode;
#define LCD_EN_BS (1 << LCD_EN)
#define LCD_CD_BS (1 << LCD_CD)
#define LCD_DB4_BS (1 << LCD_DB4)
#define LCD_DB5_BS (1 << LCD_DB5)
#define LCD_DB6_BS (1 << LCD_DB6)
#define LCD_DB7_BS (1 << LCD_DB7)#define LCD_EN_BC (1 << (LCD_EN+16))
#define LCD_CD_BC (1 << (LCD_CD+16))
#define LCD_DB4_BC (1 << (LCD_DB4+16))
#define LCD_DB5_BC (1 << (LCD_DB5+16))
#define LCD_DB6_BC (1 << (LCD_DB6+16))
#define LCD_DB7_BC (1 << (LCD_DB7+16))
#if LCD_EN > 7
#define LCD_EN_H (1 << (LCD_EN-8) * 4)
#define C_LCD_EN_H (7 << ((LCD_EN-8) * 4 + 1))
#else
#define LCD_EN_L (1 << LCD_EN * 4)
#define C_LCD_EN_L (7 << (LCD_EN * 4 + 1))
#endif#if LCD_CD > 7
#define LCD_CD_H (1 << (LCD_CD-8) * 4)
#define C_LCD_CD_H (7 << ((LCD_CD-8) * 4 + 1))
#else
#define LCD_CD_L (1 << LCD_CD * 4)
#define C_LCD_CD_L (7 << (LCD_CD * 4 + 1))
#endif
#if LCD_DB4 > 7
#define DB4_H (1 << (LCD_DB4-8) * 4)
#define C_DB4_H (7 << ((LCD_DB4-8) * 4 + 1))
#else
#define DB4_L (1 << LCD_DB4 * 4)
#define C_DB4_L (7 << (LCD_DB4 * 4 + 1))
#endif#if LCD_DB5 > 7
#define DB5_H (1 << (LCD_DB5-8) * 4)
#define C_DB5_H (7 << ((LCD_DB5-8) * 4 + 1))
#else
#define DB5_L (1 << LCD_DB5 * 4)
#define C_DB5_L (7 << (LCD_DB5 * 4 + 1))
#endif
#if LCD_DB6 > 7
#define DB6_H (1 << (LCD_DB6-8) * 4)
#define C_DB6_H (7 << ((LCD_DB6-8) * 4 + 1))
#else
#define DB6_L (1<< LCD_DB6 * 4)
#define C_DB6_L (7 << (LCD_DB6 * 4 + 1))
#endif#if LCD_DB7 > 7
#define DB7_H (1 << (LCD_DB7-8) * 4)
#define C_DB7_H (7 << ((LCD_DB7-8) * 4 + 1))
#else
#define DB7_L (1 << LCD_DB7 * 4)
#define C_DB7_L (7 << (LCD_DB7 * 4 + 1))
#endif

#ifndef DB4_H
#define DB4_H 0
#endif#ifndef DB5_H
#define DB5_H 0
#endif
#ifndef DB6_H
#define DB6_H 0
#endif#ifndef DB7_H
#define DB7_H 0
#endif
#ifndef DB4_L
#define DB4_L 0
#endif#ifndef DB5_L
#define DB5_L 0
#endif
#ifndef DB6_L
#define DB6_L 0
#endif#ifndef DB7_L
#define DB7_L 0
#endif
#ifndef LCD_CD_L
#define LCD_CD_L 0
#endif#ifndef LCD_CD_H
#define LCD_CD_H 0
#endif
#ifndef LCD_EN_L
#define LCD_EN_L 0
#endif#ifndef LCD_EN_H
#define LCD_EN_H 0
#endif
////////////////////////#ifndef C_DB4_H
#define C_DB4_H 0
#endif
#ifndef C_DB5_H
#define C_DB5_H 0
#endif#ifndef C_DB6_H
#define C_DB6_H 0
#endif
#ifndef C_DB7_H
#define C_DB7_H 0
#endif#ifndef C_DB4_L
#define C_DB4_L 0
#endif
#ifndef C_DB5_L
#define C_DB5_L 0
#endif#ifndef C_DB6_L
#define C_DB6_L 0
#endif
#ifndef C_DB7_L
#define C_DB7_L 0
#endif
#ifndef C_LCD_CD_L
#define C_LCD_CD_L 0
#endif
#ifndef C_LCD_CD_H
#define C_LCD_CD_H 0
#endif#ifndef C_LCD_EN_L
#define C_LCD_EN_L 0
#endif
#ifndef C_LCD_EN_H
#define C_LCD_EN_H 0
#endif#define LCD_PORT_CRH_S (DB4_H | DB5_H | DB6_H | DB7_H | LCD_EN_H | LCD_CD_H)
#define LCD_PORT_CRL_S (DB4_L | DB5_L | DB6_L | DB7_L | LCD_EN_L | LCD_CD_L)
#define LCD_PORT_CRH_C (C_DB4_H | C_DB5_H | C_DB6_H | C_DB7_H | C_LCD_EN_H | C_LCD_CD_H)
#define LCD_PORT_CRL_C (C_DB4_L | C_DB5_L | C_DB6_L | C_DB7_L | C_LCD_EN_L | C_LCD_CD_L)
void lcd_init();
void lcd_send(uint8_t byte, dat_or_comm dc);
void lcd_set_4bit_mode(void);
void lcd_set_state(lcd_state state, cursor_state cur_state, cursor_mode cur_mode);
void lcd_clear(void);
void lcd_out(char * txt);
void lcd_set_xy(uint8_t x, uint8_t y);
void lcd_set_user_char(uint8_t char_num, uint8_t * char_data);
void lcd_delay(void);

вот код который вызывает глюки в отображении:

#include "stm32F10x.h"
#include "hd44780_driver\hd44780_driver.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
int main(void)
{
int x=10000;
int flags=0;
int flags_button=1;
int timer=0,data_out=0;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
 GPIOC->CRH = 0x00000022; // конфигурируем на выход частота 2мгЦ бит 8 и 9

uint8_t user_char[8]; //Сюда будем записывать пользовательский символ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //Вкл порт С
GPIOA->CRH = GPIOA->CRH &~ (1<<0);
while(x)
{
x--;
}
lcd_init(); //Инициализируем дисплей

user_char[0]=0b01110; //А вот тут
user_char[1]=0b10001; // рисуем
user_char[2]=0b10001; // наш символ
user_char[3]=0b10001; //
user_char[4]=0b10001; // Это типа рыба :-)
user_char[5]=0b01010;
user_char[6]=0b10001;
user_char[7]=0b10001;
lcd_set_user_char(0, user_char); // Наша рыба это символ номер ноль

lcd_out("Artos5! TEST"); //Выводм надпись в нулевую строку
lcd_set_xy(0,1); //переводим курсор в первую строку

lcd_out("2014 STM32F100"); //Выводм надпись в нулевую строку
lcd_set_xy(1,1); //переводим курсор в первую строку
lcd_set_state(LCD_ENABLE, CURSOR_DISABLE, NO_BLINK); //Включаем курсор и мигалку
while(1)
{
if(timer==0)
{
	 GPIO_SetBits(GPIOC, GPIO_Pin_8 );
 x=45000;
 while(x)
 {
 x--;
 }
}
if(timer==1)
{
 GPIO_ResetBits(GPIOC, GPIO_Pin_8 );
 x=450000;
 while(x)
 {
 x--;
 }
}
if(timer==2)
{
 GPIO_SetBits(GPIOC, GPIO_Pin_9 );
 x=45000;
 while(x)
 {
 x--;
 }
}
if(timer==3)
{
 GPIO_ResetBits(GPIOC, GPIO_Pin_9 );
 x=450000;
 while(x)
 {
 x--;
 }
}

timer++;
if(timer>3)timer=0;


 if(flags)
 {

 lcd_out("Yarunka lubit "); //Выводм надпись в нулевую строку
 lcd_set_xy(0,1); //переводим курсор в первую строку
 lcd_out("Kolbasu! "); //Выводм надпись в нулевую строку
 lcd_set_xy(1,1); //переводим курсор в первую строку
 lcd_set_state(LCD_ENABLE, CURSOR_DISABLE, NO_BLINK); //Включаем курсор и мигалку
 data_out=0;
 }
 else
 {

 lcd_out("Yarunka ne lubit"); //Выводм надпись в нулевую строку
 lcd_set_xy(0,1); //переводим курсор в первую строку

 lcd_out("Kolbasu! "); //Выводм надпись в нулевую строку
 lcd_set_xy(1,1); //переводим курсор в первую строку
 lcd_set_state(LCD_ENABLE, CURSOR_DISABLE, NO_BLINK); //Включаем курсор и мигалку
 data_out=0;
 }

 if((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1) && flags_button==1)
 {

 if(flags)flags=0;
		 else flags=1;
 lcd_clear(); //очищаем дисплей
 data_out=1;
 flags_button=0;
 }
 if((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0) && flags_button==0)
 {
 flags_button=1;
 }

}
}

а этот код нормально отображает данные на индикаторе:

if(data_out)
{
 if(flags)
 {

 lcd_out("Yarunka lubit "); //Выводм надпись в нулевую строку
 lcd_set_xy(0,1); //переводим курсор в первую строку
 lcd_out("Kolbasu! "); //Выводм надпись в нулевую строку
 lcd_set_xy(1,1); //переводим курсор в первую строку
 lcd_set_state(LCD_ENABLE, CURSOR_DISABLE, NO_BLINK); //Включаем курсор и мигалку
 data_out=0;
 }
 else
 {

 lcd_out("Yarunka ne lubit"); //Выводм надпись в нулевую строку
 lcd_set_xy(0,1); //переводим курсор в первую строку
 //lcd_send(1,DATA); //выводм символ номер ноль
 lcd_out("Kolbasu! "); //Выводм надпись в нулевую строку
 lcd_set_xy(1,1); //переводим курсор в первую строку
 lcd_set_state(LCD_ENABLE, CURSOR_DISABLE, NO_BLINK); //Включаем курсор и мигалку
 data_out=0;
 }
}

в этом коде добавлен флаг с помощью которого данные выводятся только один раз после изменения.

Помогите найти ошибку в коде...... я уже и тайминги менял , и буфер обнулял.. ничего не помогает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Я очень подозреваю что индикатор так ведет себя из за этой функции:

void lcd_set_xy(uint8_t x, uint8_t y)  {
if (y==0) {
lcd_send( ((1<<7) | (x)),COMMAND);
} else {
lcd_send( ((3<<6) | (x)),COMMAND);
}
}

Я не понимаю как работает эта строчка:

lcd_send( ((3<<6) | (x)),COMMAND);

Посмотрел это видео:

Блин... у меня тот же глюк.... Только мусор другой . И через раз инициализируется после сброса...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Уважаемые форумчане! Заметил такую особенность:

Если перед выводом данных очищать индикатор - то выводятся данные корректно! Но индикатор мерцает!

Как исправить эту проблему?

Мне надо постоянно слать данные без очистки содержимого на экране!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

Пока не вдавался в подробности библиотеки, но глюки, обычно, бывают из-за не правильных таймингов. Попробуйте увеличить время ожидания между отправками.

На счет очистки - если новые данные по количеству символов одинаковые с уже показанной строкой, то должно работать нормально. Просто перезапишется и все. Но если строка меньше, чем была, то или нужна очистка или дополнить строку дополнительными пробелами, для очистки неиспользуемых знакомест.

Я вроде дополнял строку доп. пробелами. т.к. очищать весь экран мне не надо было (изменял только значения параметров, а названия оставались не тронутыми).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Спасибо что обратили внимание на тему.

Я попробовал так:

без очистки экрана выводить данные по нажатию на кнопку.

Получил вообще страшный глюк.........

Глюк такой:

первая строка которая отображалась до вечного цикла (то есть: "Artos5! TEST") осталась!

а на второй строке высвечивается содержимое второй строки + накладывается содержимое (которое я пытаюсь отправить в первую строку) только обрезается содержимым второй строки........... короче колбаса какая то!!! :))))

Выкинул нафик исходник!!! Пилю теперь этот пример: http://avrlab.com/node/80

Очень нравится стиль написания. Очень понятный для меня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
swat24    9

Я так делал :

#include "hd44780.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx.h"
#include "Delay.h"

uint16_t d7 = GPIO_Pin_10;
uint16_t d6 = GPIO_Pin_11;
uint16_t d5 = GPIO_Pin_12;
uint16_t d4 = GPIO_Pin_13;
uint16_t rs = GPIO_Pin_8;
uint16_t en1 = GPIO_Pin_7;
uint16_t en2 = GPIO_Pin_9;

const char LCD_Char[65]={'A', 0xA0,'B',0xA1,0xE0, 'E',0xA3,0xA4,0xA5,0xA6, 'K',0xA7, 'M', 'H', 'O',0xA8,
   'P', 'C', 'T',0xA9,0xAA, 'X',0xE1,0xAB,0xAC,0xE2,0xAD,0xAE, 'b',0xAF,0xB0,0xB1,
   'a',0xB2,0xB3,0xB4,0xE3, 'e',0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD, 'o',0xBE,
   'p', 'c',0xBF, 'y',0xE4, 'x',0xE5,0xC0,0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7};


void lcd_delay(void) {
uDelay(25);
}

void Lcd_Write(int Data)
{
GPIOD->ODR = Data;
GPIO_SetBits(GPIOC, en1);
GPIO_ResetBits(GPIOC, en1);
GPIO_SetBits(GPIOC, en2);
GPIO_ResetBits(GPIOC, en2);
}

void lcd_init() {
GPIO_InitTypeDef gpio;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
gpio.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &gpio);

gpio.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_Init(GPIOC, &gpio);
//delay(0xffFFF);
mDelay(15);

//GPIOD->ODR = 12288;
Lcd_Write(12288);
//delay(0xFFF);
mDelay(4);

Lcd_Write(12288);
//delay(0xFFF);
uDelay(100);

Lcd_Write(12288);
//delay(0xFFF);
uDelay(100);

Lcd_Write(4096);
//delay(0xFFF);
uDelay(100);

Lcd_Write(4096);
Lcd_Write(1024);
//delay(0xFFF);
uDelay(100);


Lcd_Write(0);
Lcd_Write(6144);
//delay(0xFFF);
uDelay(100);

Lcd_Write(0);
Lcd_Write(3072);
//delay(0xFFF);
uDelay(100);

Lcd_Write(0);
Lcd_Write(8192);
//delay(0xFFF);
uDelay(100);
}

void lcd_set_user_char(uint8_t char_num, uint8_t * char_data) {
uint8_t i;
lcd_send(((1<<6) | (char_num * 8) ), COMMAND,0);
for (i=0;i<=7;i++) {
lcd_send(char_data[i],DATA,0);
}
lcd_send((1<<7), COMMAND,0);
}

void lcd_text(char * txt,u8 x, u8 y) {
if (y<2){
if (y==0) {
lcd_send( ((1<<7) | (x)),COMMAND,y);
} else {
lcd_send( ((3<<6) | (x)),COMMAND,y);
}
while(*txt) {
if (*txt>=0xc0)
{
*txt=LCD_Char[*txt-0xc0];
} 
lcd_send(*txt,DATA,y);
txt++;
}
}else
{
if (y==2) {
lcd_send( ((1<<7) | (x)),COMMAND,y);
} else {
lcd_send( ((3<<6) | (x)),COMMAND,y);
}
while(*txt) {
if (*txt>=0xc0)
{
*txt=LCD_Char[*txt-0xc0];
} 
lcd_send(*txt,DATA,y);
txt++;
}
}
}

void lcd_clear(void) {
lcd_send(0x01,COMMAND,0);
lcd_send(0x01,COMMAND,3);
}

void lcd_set_state(lcd_state state, cursor_state cur_state, cursor_mode cur_mode)  {
if (state==LCD_DISABLE)  {
lcd_send(0x08,COMMAND,0);
} else {
if (cur_state==CURSOR_DISABLE) {
if (cur_mode==NO_BLINK)  {
lcd_send(0x0C,COMMAND,0);
} else {
lcd_send(0x0D,COMMAND,0);
}
} else  {
if (cur_mode==NO_BLINK)  {
lcd_send(0x0E,COMMAND,0);
} else {
lcd_send(0x0F,COMMAND,0);
}
}
}
}



void lcd_send(uint8_t byte, dat_or_comm dc, uint8_t rows)  {
if (rows==0||rows==1)
{

GPIO_ResetBits(GPIOD, GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 );
//LCD_PORT->BSRR=(LCD_DB7_BC | LCD_DB6_BC | LCD_DB5_BC | LCD_DB4_BC) ;
GPIO_ResetBits(GPIOC, rs | en1 | en2 );
//LCD_PORT->BSRR=(RS|EN1|EN2);

if (dc) {
GPIO_SetBits(GPIOC, rs);
//LCD_PORT->BSRR=LCD_CD_BS;
}

if (byte & 0x10) {
GPIO_SetBits(GPIOD, d4);
//LCD_PORT->BSRR=LCD_DB4_BS;
}
if (byte & 0x20) {
GPIO_SetBits(GPIOD, d5);
//LCD_PORT->BSRR=LCD_DB5_BS;
}
if (byte & 0x40) {
GPIO_SetBits(GPIOD, d6);
//LCD_PORT->BSRR=LCD_DB6_BS;
}
if (byte & 0x80) {
GPIO_SetBits(GPIOD, d7);
//LCD_PORT->BSRR=LCD_DB7_BS;
}

GPIO_SetBits(GPIOC, en1);

//LCD_PORT->BSRR=LCD_EN_BS;
lcd_delay(); 
GPIO_ResetBits(GPIOC, en1);

//LCD_PORT->BSRR=LCD_EN_BC;
lcd_delay();


GPIO_ResetBits(GPIOD, GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 );
//LCD_PORT->BSRR=(LCD_DB7_BC | LCD_DB6_BC | LCD_DB5_BC | LCD_DB4_BC) ;

if (byte & 0x01) {
GPIO_SetBits(GPIOD, d4);
//LCD_PORT->BSRR=LCD_DB4_BS;
}
if (byte & 0x02) {
GPIO_SetBits(GPIOD, d5);
//LCD_PORT->BSRR=LCD_DB5_BS;
}
if (byte & 0x04) {
GPIO_SetBits(GPIOD, d6);
//LCD_PORT->BSRR=LCD_DB6_BS;
}
if (byte & 0x08) {
GPIO_SetBits(GPIOD, d7);
//LCD_PORT->BSRR=LCD_DB7_BS;
}

GPIO_SetBits(GPIOC, en1);
//LCD_PORT->BSRR=LCD_EN_BS;
lcd_delay();
GPIO_ResetBits(GPIOC, en1);
//LCD_PORT->BSRR=LCD_EN_BC;
lcd_delay();
}

if (rows==2||rows==3)
{

GPIO_ResetBits(GPIOD, GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 );
//LCD_PORT->BSRR=(LCD_DB7_BC | LCD_DB6_BC | LCD_DB5_BC | LCD_DB4_BC) ;
GPIO_ResetBits(GPIOC, rs | en1 | en2 );
//LCD_PORT->BSRR=(RS|EN1|EN2);

if (dc) {
GPIO_SetBits(GPIOC, rs);
//LCD_PORT->BSRR=LCD_CD_BS;
}

if (byte & 0x10) {
GPIO_SetBits(GPIOD, d4);
//LCD_PORT->BSRR=LCD_DB4_BS;
}
if (byte & 0x20) {
GPIO_SetBits(GPIOD, d5);
//LCD_PORT->BSRR=LCD_DB5_BS;
}
if (byte & 0x40) {
GPIO_SetBits(GPIOD, d6);
//LCD_PORT->BSRR=LCD_DB6_BS;
}
if (byte & 0x80) {
GPIO_SetBits(GPIOD, d7);
//LCD_PORT->BSRR=LCD_DB7_BS;
}

GPIO_SetBits(GPIOC, en2);
//LCD_PORT->BSRR=LCD_EN_BS;
lcd_delay();
GPIO_ResetBits(GPIOC, en2);
//LCD_PORT->BSRR=LCD_EN_BC;
lcd_delay();


GPIO_ResetBits(GPIOD, GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 );
//LCD_PORT->BSRR=(LCD_DB7_BC | LCD_DB6_BC | LCD_DB5_BC | LCD_DB4_BC) ;

if (byte & 0x01) {
GPIO_SetBits(GPIOD, d4);
//LCD_PORT->BSRR=LCD_DB4_BS;
}
if (byte & 0x02) {
GPIO_SetBits(GPIOD, d5);
//LCD_PORT->BSRR=LCD_DB5_BS;
}
if (byte & 0x04) {
GPIO_SetBits(GPIOD, d6);
//LCD_PORT->BSRR=LCD_DB6_BS;
}
if (byte & 0x08) {
GPIO_SetBits(GPIOD, d7);
//LCD_PORT->BSRR=LCD_DB7_BS;
}

GPIO_SetBits(GPIOC, en2);
//LCD_PORT->BSRR=LCD_EN_BS;
lcd_delay();
GPIO_ResetBits(GPIOC, en2);
//LCD_PORT->BSRR=LCD_EN_BC;
lcd_delay();
}
}

Изменено пользователем swat24

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Это просто кАшмар какой то :))

Переделал код под СТМ32 из этой статьи: http://avrlab.com/node/80

#include "stm32F10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#define RS 2	    // управляющие константы
#define E  3	    // управляющие константы
#define RS_S  GPIO_SetBits(GPIOA, GPIO_Pin_2 );	  //RS - установить сигнал управления ЖКИ
#define RS_R  GPIO_ResetBits(GPIOA, GPIO_Pin_2 );	  //RS  - сбросить сигнал управления ЖКИ
#define E_S  GPIO_SetBits(GPIOA, GPIO_Pin_1 );	    //E  - установить сигнал управления ЖКИ
#define E_R  GPIO_ResetBits(GPIOA, GPIO_Pin_1 );	    //E  - сбросить сигнал управления ЖКИ
#define BIT_4S  GPIO_SetBits(GPIOA, GPIO_Pin_4 );
#define BIT_5S  GPIO_SetBits(GPIOA, GPIO_Pin_5 );
#define BIT_6S  GPIO_SetBits(GPIOA, GPIO_Pin_6 );
#define BIT_7S  GPIO_SetBits(GPIOA, GPIO_Pin_7 );
#define BIT_4R  GPIO_ResetBits(GPIOA, GPIO_Pin_4 );
#define BIT_5R  GPIO_ResetBits(GPIOA, GPIO_Pin_5 );
#define BIT_6R  GPIO_ResetBits(GPIOA, GPIO_Pin_6 );
#define BIT_7R  GPIO_ResetBits(GPIOA, GPIO_Pin_7 );
#define TIME 1000	 //Константа временной задержки для ЖКИ
  //Частота тактирование МК - 4Мгц
uint8_t data_port=0;
//Программа формирвоания задержки
void pause (unsigned long int a)
{ unsigned long int i;
 for (i=a;i>0;i--);
 for (i=a;i>0;i--);
}
void data_out()
{
if ((data_port&0x04)==0x04) //RS
{
RS_S;
GPIO_SetBits(GPIOC, GPIO_Pin_8 );
}
else
{
RS_R;
GPIO_ResetBits(GPIOC, GPIO_Pin_8 );
}
if ((data_port&0x08)==0x08) //E
{
E_S;
GPIO_SetBits(GPIOC, GPIO_Pin_9 );
}
else
{
RS_R;
GPIO_ResetBits(GPIOC, GPIO_Pin_9 );
}
if ((data_port&0x10)==0x10) // bit4
{
BIT_4S;
}
else
{
BIT_4R;
}
if ((data_port&0x20)==0x20) // bit5
{
BIT_5S;
}
else
{
BIT_5R;
}
if ((data_port&0x40)==0x40) // bit6
{
BIT_6S;
}
else
{
BIT_6R;
}
if ((data_port&0x80)==0x80) // bit7
{
BIT_7S;
}
else
{
BIT_7R;
}
}
//Программа передачи команд в ЖКИ
void lcd_com (unsigned char lcd)
{ unsigned char temp;

 temp=(lcd&~(1<<RS))|(1<<E);  //RS=0 – это команда
 data_port=temp;						 //Выводим на portD старшую тетраду команды, сигналы RS, E
 data_out();
 pause(3000);						 //Небольшая задержка в 1 такт МК, для стабилизации
 data_port=temp&~(1<<E);				 //Сигнал записи команды
 data_out();
 temp=((lcd<<4)&~(1<<RS))|(1<<E); //RS=0 – это команда
 data_port=temp;						 //Выводим на portD младшую тетраду команды, сигналы RS, E
 data_out();
 pause(3000);						 //Небольшая задержка в 1 такт МК, для стабилизации
 data_port=temp&~(1<<E);				 //Сигнал записи команды
 data_out();
 pause (10*TIME);				 //Пауза для выполнения команды
 GPIO_ResetBits(GPIOC, GPIO_Pin_9 );
}
//Программа записи данных в ЖКИ
void lcd_dat (unsigned char lcd)
{ unsigned char temp;

 temp=(lcd|(1<<RS))|(1<<E);  //RS=1 – это данные
 data_port=temp;						 //Выводим на portD старшую тетраду данных, сигналы RS, E
 data_out();
 pause(3000);				  //Небольшая задержка в 1 такт МК, для стабилизации
 data_port=temp&~(1<<E);				 //Сигнал записи данных
 data_out();
 temp=((lcd<<4)|(1<<RS))|(1<<E); //RS=1 – это данные
 data_port=temp;						 //Выводим на portD младшую тетраду данных, сигналы RS, E
 data_out();
 pause(3000);						 //Небольшая задержка в 1 такт МК, для стабилизации
 data_port=temp&~(1<<E);				 //Сигнал записи данных
 data_out();
 pause(TIME);						 //Пауза для вывода данных

}
//Программа иниализации ЖКИ
void lcd_init (void)
{
lcd_com(0x2c);  //4-проводный интерфейс, 5x8 размер символа
pause(1000*TIME);
lcd_com(0x0c);  //Показать изображение, курсор не показывать
pause(1000*TIME);
lcd_com(0x01);  //Очистить DDRAM и установить курсор на 0x00
pause (1000*TIME);
}
//Основная программа
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //Вкл порт
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //Вкл порт
GPIOC->CRL=0x22222222;
GPIOC->CRH=0x22222222;
GPIOA->CRL=0x22222222;
GPIOA->CRH=0x22222222;
pause(30000); //Задержка, чтобы ЖКИ успел включиться
lcd_init(); //Инициализация ЖКИ

lcd_dat('w');   //Вывод "www.avrlab.com"
lcd_dat('w');
lcd_dat('w');
lcd_dat('.');
lcd_dat('a');
lcd_dat('v');
lcd_dat('r');
lcd_dat('l');
lcd_dat('a');
lcd_dat('b');
lcd_dat('.');
lcd_dat('c');
lcd_dat('o');
lcd_dat('m');
lcd_com(0xc0); //Ставим курсор на начало 2-й строки ЖКИ
lcd_dat('I'); //Записываем "It's so easy"
lcd_dat('t');
lcd_dat('"');
lcd_dat('s');
lcd_dat(' ');
lcd_dat('s');
lcd_dat('o');
lcd_dat(' ');
lcd_dat('e');
lcd_dat('a');
lcd_dat('s');
lcd_dat('y');

while(1) //бесконечный цикл
;
}

индикатор даже не инициализируется ........ что я не так сделал? Я уже на гране взрыва :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Проблема решена!!!! И заодно переписана библиотека :)

весь косяк был в установке курсора!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Вот моя библиотека:

lib_HD44780.rar

Из особенностей:

можно прикрутить к дисплею любую ножку МК! Хоть из разных портов!

Пример использования:

lcd_init(); //Инициализация ЖКИ

kursor_set(LCD_ENABLE, CURSOR_DISABLE, NO_BLINK);
lcd_clear();


lcd_xy(0,0);

lcd_out("2014");

lcd_xy(1,0); //Ставим курсор на начало 2-й строки ЖКИ

lcd_out("Artos5!!!!");

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ZERRO_    1

artos5 у меня дисплей wh1202a что-то нужно еще поменять в вашей библиотеке кроме распиновки ножек? Может я неправильно подключаю библиотеку, как ее подключить? Никак не удается добиться от этого дисплея хоть чего-то, помогите пожалуйста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Сейчас дам более усовершенствованную библиотеку и опишу подробно как подключить.

Какая среда разработки и какой МК у Вас?

Для использования , нужно файлы подключить к проекту. И подключить библиотеку в исходном коде.

//В хедере нужно с конфигурировать порты
// К примеру так:

#define RS_S GPIO_SetBits(GPIOA, GPIO_Pin_2 ); //RS - установить сигнал управления ЖКИ
#define RS_R GPIO_ResetBits(GPIOA, GPIO_Pin_2 ); //RS - сбросить сигнал управления ЖКИ

#define E_S GPIO_SetBits(GPIOA, GPIO_Pin_1 ); //E - установить сигнал управления ЖКИ
#define E_R GPIO_ResetBits(GPIOA, GPIO_Pin_1 ); //E - сбросить сигнал управления ЖКИ

#define BIT_4S GPIO_SetBits(GPIOA, GPIO_Pin_4 );
#define BIT_5S GPIO_SetBits(GPIOA, GPIO_Pin_5 );
#define BIT_6S GPIO_SetBits(GPIOA, GPIO_Pin_6 );
#define BIT_7S GPIO_SetBits(GPIOA, GPIO_Pin_7 );

#define BIT_4R GPIO_ResetBits(GPIOA, GPIO_Pin_4 );
#define BIT_5R GPIO_ResetBits(GPIOA, GPIO_Pin_5 );
#define BIT_6R GPIO_ResetBits(GPIOA, GPIO_Pin_6 );
#define BIT_7R GPIO_ResetBits(GPIOA, GPIO_Pin_7 );

Пользоваться библиотекой так:

#include <stdio.h>
#include "hd44780_driver.h"
void main(void)
{
lcd_init();
lcd_clear();
lcd_xy(0, 1) ; // выводить будем в верхнюю строку во вторую позицию
lcd_out("Hello world"); // выводим строку
//или так:
sprintf(buff, "%dV" , data_adc); // выводим переменную
lcd_xy(0, 1) ;
lcd_out(buff);
while(1);
}

Также, надо подправить функцию lcd_init(); если будете использовать другой МК или среду.

hd44780_driver_by_Artos.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ZERRO_    1

У меня stm32f103cbt6, среда разработки CoIDE. Буду пробовать) Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Возможно понадобится вам подправить задержки. Для этого нужно подправить константу в библиотеке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

У меня stm32f103cbt6. Спасибо.

Удалось победить дисплей? :)

Попробуйте пожалуйста подключить порты и ножки ЖКИ в разнобой .

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ZERRO_    1

Увы нет( Что ни делаю - две строчки черных квадратиков и все. Сижу разбираюсь с таймингами....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Должна быть одна. Может у вас дисплей труп?

Попробуйте все тайминги увеличить в три раза.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ZERRO_    1

Сразу одна, после ресет - две, это значит что он прошел инициализацию? Сейчас попробую...

Нет, увеличение таймингов ничего не меняет.

Изменено пользователем ZERRO_

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Что то подсказывает мне что где то или непропай , или битый дисплей, или неверная конфигурация . У меня все работает. Сегодня специально попробую настроить на разные порты.

Вот: http://cs618031.vk.me/v618031496/e1ae/nK3myRW_uZY.jpg

А вечером попробую на разные порты привязать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

после ресет - две, это значит что он прошел инициализацию?

Да, инициализацию проходит значит. Вы библиотеку тщательно осматривали внутри? Все параметры "подправили"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
КЭС    1 108

Ко

Сразу одна, после ресет - две

Контраст не перекручен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ZERRO_    1

Попробовал подключить дисплей к atmega он работает, выставил яркость. На stm32 оказалось он ничего не показывал (я и в правду перекручивал яркость). Хочу попробывать подключить другую библиотеку из примеров CoIDE но ошибка error: ld returned 1 exit status , multiple definition of `DelayMs'. Не могу разобраться... не думал что столько проблем будет с дисплеем, наверное у меня плохая карма)

lcd_c.txt

lcd_h.txt

main.txt

Изменено пользователем ZERRO_

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Подключил так порты:

#define RS_S  GPIO_SetBits(GPIOA, GPIO_Pin_11 );	  //RS - установить сигнал управления ЖК�
#define RS_R  GPIO_ResetBits(GPIOA, GPIO_Pin_11 );	  //RS  - сбросить сигнал управления ЖК�
#define E_S  GPIO_SetBits(GPIOA, GPIO_Pin_12 );	    //E  - установить сигнал управления ЖК�
#define E_R  GPIO_ResetBits(GPIOA, GPIO_Pin_12 );	    //E  - сбросить сигнал управления ЖК�
#define BIT_4S  GPIO_SetBits(GPIOC, GPIO_Pin_6 );
#define BIT_5S  GPIO_SetBits(GPIOA, GPIO_Pin_8 );
#define BIT_6S  GPIO_SetBits(GPIOA, GPIO_Pin_9 );
#define BIT_7S  GPIO_SetBits(GPIOA, GPIO_Pin_10 );
#define BIT_4R  GPIO_ResetBits(GPIOC, GPIO_Pin_6 );
#define BIT_5R  GPIO_ResetBits(GPIOA, GPIO_Pin_8 );
#define BIT_6R  GPIO_ResetBits(GPIOA, GPIO_Pin_9 );
#define BIT_7R  GPIO_ResetBits(GPIOA, GPIO_Pin_10 );

Работает всё супер! Так что мое предположение о всевозможной конфигурации подтвердилось :)

Править надо в двух местах библиотеку:

#define RS_S  GPIO_SetBits(GPIOA, GPIO_Pin_11 );	  //RS - установить сигнал управления ЖК�
#define RS_R  GPIO_ResetBits(GPIOA, GPIO_Pin_11 );	  //RS  - сбросить сигнал управления ЖК�
#define E_S  GPIO_SetBits(GPIOA, GPIO_Pin_12 );	    //E  - установить сигнал управления ЖК�
#define E_R  GPIO_ResetBits(GPIOA, GPIO_Pin_12 );	    //E  - сбросить сигнал управления ЖК�
#define BIT_4S  GPIO_SetBits(GPIOC, GPIO_Pin_6 );
#define BIT_5S  GPIO_SetBits(GPIOA, GPIO_Pin_8 );
#define BIT_6S  GPIO_SetBits(GPIOA, GPIO_Pin_9 );
#define BIT_7S  GPIO_SetBits(GPIOA, GPIO_Pin_10 );
#define BIT_4R  GPIO_ResetBits(GPIOC, GPIO_Pin_6 );
#define BIT_5R  GPIO_ResetBits(GPIOA, GPIO_Pin_8 );
#define BIT_6R  GPIO_ResetBits(GPIOA, GPIO_Pin_9 );
#define BIT_7R  GPIO_ResetBits(GPIOA, GPIO_Pin_10 );

и еще тут:

void lcd_init (void)
......

Если немного дописать библу - то можно сделать что править придется только в хедере.

Попробовал подключить дисплей....

Вы мою библиотеку пробовали подключать? Прикрепленные файлы не являются моей библиотекой.

Если пробовали - код в студию. И будем разбираться почему не работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    286

Попробуйте так:

void lcd_init (void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIOB->CRL=0x44422422; //OUT push-pull 2MHz
GPIOB->CRH=0x44444422;
.......

А напомните какой у Вас МК? Может шина не та выбрана при включении тактирования порта?

У меня сейчас на системнике лежит отладка с дисплеем , и работает :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Сообщения

    • Игнор. Вы в моём чёрном списке. @kotosob тоже в чёрном списке. Игнор.   Знания. Как кто-то сказал знания - это деньги. Меняет принцип работы ламп, полупроводниковых приборов.
    • Продаются 2 корпуса от ресиверов BBK AV-220. Первый полностью выпотрошен, но дисплей, кнопки/крутилки/болтики/радиаторы и подставки под них все на месте. Где то в кладовке может что и осталось от основной платы. Комплектность второго на фото - не хватает основного трансформатора и платы усилителя. Основная плата, входы/выходы, декодер, контроллер дисплея, крутилки/кнопки/болтики  - все на месте.  Индикация рабочая 100%. Ссылку на сервис мануал могу дать, если кто то задумает дисплей и регуляторы под свои задачи запрограммировать и  использовать.   По конструкции корпуса очень неплохие - толстый металл, вся обвеска снимается без проблем, останется только днище на ножках. Крышка со сплошной перфорацией. Когда то в аналогичном жила ЭА2014 - вентиляции хватало вполне, места с избытком.   По ценам - первый экземпляр 1500, Этот пусть будет 2500. Оба сразу отдам за 3500. Доставка на покупателе. По доставке - КИТ или могу выложить на Авито и получите по Авито.Доставка. Находятся в Москве.
    • Так что НОВОГО позволяет новая теория по сравнению со старой?  Ну вот нафига мне вычисление хорошо известного "Пи", но неким новым способом, если синус угла даже в военное время все-равно не достигнет четырех? А что меняет приставка "термо-"? В ядра я не имею оборудования лезть, поэтому квантовые уровни меня практически не интересуют, а что касается физического мира (до атомов-молекул), так вся энергетика (что гидро-, что угле- (в т.ч. угле-водородных) носителей) основана лишь на силах гравитации и солнечного излучения, так что все остальные преобразования на пути к розетке это лишь преобразования. 1. Так что ваши изыскания позволяют достичь в области электрогенерации (согласно названию темы)? 2. Изложите закон "о двух иерархиях уровней энергий" сделав это на качественном уровне, словами, как сэр Ньютон еще 300 лет назад делал.
    • Вечером покажу после работы, подавал сигнал с телефона (Тон-генератор) Забыл вчера по фоткать...
    • Пара корпусов "Надел-75", фото которых в постах выше, ещё есть....
    • Если минимальная подготовка включает в себя способность отличать ток от напряжения то скриншот будет вполне понятен.  Вам удобней схема загромождённая "окошечками" с напряжениями и токами, мне нет. Когда схема состоит из 3-х 5-ти деталей ещё терпимо, а когда элементов сотни что делать?  R8 и R9 разделены конденсатором и на режим по постоянному току не как не влияют, а по "переменке" так вообще С7 не даёт никаких шансов на что то повлиять. Так что с Вашего позволения я продолжу её "не замечать".