[LCD HD44780] Biblioteka na HAL działa, na rejestrach nie

Wszystko o co chcesz zapytać na temat mikrokontrolerów ARM firmy STMicroelectronics: problemy z pisaniem programu, problemy sprzętowe, niejasności w DS czy AN itp.
StaryAnoda

[LCD HD44780] Biblioteka na HAL działa, na rejestrach nie

Postautor: StaryAnoda » wtorek 20 gru 2016, 19:16

Cześć

Mam taki problem nie działa mi biblioteka do wyświetlacza na sterowniku HD44780.

Kod napisany na rejestrach:

Taktowanie:

Kod: Zaznacz cały

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
 #define SYSCLK_FREQ_24MHz  24000000
#else
/*   #define SYSCLK_FREQ_HSE   HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
 #define SYSCLK_FREQ_72MHz  72000000
#endif


Plik main.c:

Kod: Zaznacz cały

#include <stddef.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stm32f10x.h"
#include "stm32f1xx_it.h"

#define D7_RESET (GPIOB -> ODR &= ~GPIO_ODR_ODR12);
#define D7_SET (GPIOB -> ODR |= GPIO_ODR_ODR12);

#define D6_RESET (GPIOB -> ODR &= ~GPIO_ODR_ODR13);
#define D6_SET (GPIOB -> ODR |= GPIO_ODR_ODR13);

#define D5_SET (GPIOB -> ODR &= ~GPIO_ODR_ODR14);
#define D5_RESET (GPIOB -> ODR |= GPIO_ODR_ODR14);

#define D4_RESET (GPIOB -> ODR &= ~GPIO_ODR_ODR15);
#define D4_SET (GPIOB -> ODR |= GPIO_ODR_ODR15);

#define RS_RESET (GPIOA ->ODR &= ~GPIO_ODR_ODR8);
#define RS_SET (GPIOA -> ODR |= GPIO_ODR_ODR8);

#define E_RESET (GPIOA -> ODR &= ~GPIO_ODR_ODR9);
#define E_SET (GPIOA -> ODR |= GPIO_ODR_ODR9);


void Lcd_Send_Half_Byte(uint8_t Data)
{
   if (Data & 0x01) D4_SET else D4_RESET;
   if (Data & 0x02) D5_SET else D5_RESET;
   if (Data & 0x04) D6_SET else D6_RESET;
   if (Data & 0x08) D7_SET else D7_RESET;
   Delay_ms(2);
}

void Lcd_Write_Byte(uint8_t Data)
{
   E_SET;
   Lcd_Send_Half_Byte(Data >> 4);
   E_RESET;

   E_SET;
   Lcd_Send_Half_Byte(Data);
   E_RESET;

   Delay_ms(2);
}

void Lcd_Write_Command(uint8_t Command)
{
   RS_RESET;
   Delay_ms(2);
   Lcd_Write_Byte(Command);
}

void Lcd_Write_Data(uint8_t Data)
{
   RS_SET;
   Delay_ms(2);
   Lcd_Write_Byte(Data);
}

void Lcd_Init(void)
{
   RS_SET;
   E_SET;
   Delay_ms(45);
   E_RESET;
   RS_RESET;


   E_SET;
   Lcd_Send_Half_Byte(0x03);
   E_RESET;
   Delay_ms(5);

   E_SET;
   Lcd_Send_Half_Byte(0x03);
   E_RESET;
   Delay_ms(1);

   E_SET;
   Lcd_Send_Half_Byte(0x03);
   E_RESET;
   Delay_ms(1);

   E_SET;
   Lcd_Send_Half_Byte(0x02);
   E_RESET;
   Delay_ms(1);

   Lcd_Write_Command(0x28); // Function SET // OFF DISPLAY // DISPLAY TWO-LINE // MATRIX CHARACTER 5 * 7 POINTS
   Delay_ms(2);
   Lcd_Write_Command(0x01); // CLEAR DISPLAY //
   Delay_ms(2);
   Lcd_Write_Command(0x06); // ENTRY MODE SET //
   Delay_ms(2);
   Lcd_Write_Command(0x0C); // DISPLAY ON //

   Delay_ms(1);
}


void Lcd_Char(char c)
{
   Lcd_Write_Data(c);
}

void Lcd_Send_String (char * String)
{
   while(*String)   Lcd_Char(*String++);
   Delay_ms(20);
}

void Lcd_Int(int val)
{
   char bufor[17];
   sprintf(bufor,"%d",val);
   Lcd_Send_String(bufor);
}

void Lcd_XY(uint8_t Y, uint16_t X)
{
   switch (Y)
   {
   case 0: Y = 0x00; break;
   case 1: Y = 0x40; break;
   }
   Lcd_Write_Command((0x80 + Y + X));
   Delay_ms(1);
}


int main (void)
{

   RCC -> APB2ENR = RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPAEN;;

   GPIOB -> CRL |= GPIO_CRL_MODE1_1;
   GPIOB -> CRL &= ~GPIO_CRL_CNF1_0;

   GPIOB -> CRH |= GPIO_CRH_MODE12_1;
   GPIOB -> CRH &= ~GPIO_CRH_CNF12_0;

   GPIOB -> CRH |= GPIO_CRH_MODE13_1;
   GPIOB -> CRH &= ~GPIO_CRH_CNF13_0;

   GPIOB -> CRH |= GPIO_CRH_MODE14_1;
   GPIOB -> CRH &= ~GPIO_CRH_CNF14_0;

   GPIOB -> CRH |= GPIO_CRH_MODE15_1;
   GPIOB -> CRH &= ~GPIO_CRH_CNF15_0;

   GPIOA -> CRH |= GPIO_CRH_MODE8_1;
   GPIOA -> CRH &= ~GPIO_CRH_CNF8_0;

   GPIOA -> CRH |= GPIO_CRH_MODE9_1;
   GPIOA -> CRH &= ~GPIO_CRH_CNF9_0;



   SysTick_Config(72000000/1000);

   Lcd_Init();
   Lcd_Send_String("BARTEK");

   while(1)
   {

   }

}


Kod napisany przy użyciu bibliotek HAL: (wersja uproszczona)

Kod: Zaznacz cały

   
   #define D4_SET   (HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET));
   #define D5_SET   (HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET));
   #define D6_SET   (HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET));
   #define D7_SET   (HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET));
   #define RS_SET   (HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET));
   #define E_SET     (HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET));
   
   #define D4_RESET   (HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET));
   #define D5_RESET   (HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET));
   #define D6_RESET   (HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET));
   #define D7_RESET   (HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET));
   #define RS_RESET   (HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET));
   #define E_RESET      (HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET));
   
   void Lcd_Send_Half_Byte(uint8_t Data)
{
   if (Data & 0x01) D4_SET else D4_RESET;
   if (Data & 0x02) D5_SET else D5_RESET;
   if (Data & 0x04) D6_SET else D6_RESET;
   if (Data & 0x08) D7_SET else D7_RESET;
}

void Lcd_Write_Byte(uint8_t Data)
{
   E_SET;
   Lcd_Send_Half_Byte(Data >> 4);
   E_RESET;

   E_SET;
   Lcd_Send_Half_Byte(Data);
   E_RESET;

   HAL_Delay(2);
}

void Lcd_Write_Command(uint8_t Command)
{
   RS_RESET;
   Lcd_Write_Byte(Command);
}

void Lcd_Write_Data(uint8_t Data)
{
   RS_SET;
   Lcd_Write_Byte(Data);
}

void Lcd_Init(void)
{
   RS_SET;
   E_SET;
   HAL_Delay(45);
   E_RESET;
   RS_RESET;


   E_SET;
   Lcd_Send_Half_Byte(0x03);
   E_RESET;
   HAL_Delay(5);

   E_SET;
   Lcd_Send_Half_Byte(0x03);
   E_RESET;
   HAL_Delay(1);
 
   E_SET;
   Lcd_Send_Half_Byte(0x03);
   E_RESET;
   HAL_Delay(1);
   
   E_SET;
   Lcd_Send_Half_Byte(0x02);
   E_RESET;
   HAL_Delay(1);

   Lcd_Write_Command(0x28); // Function SET // OFF DISPLAY // DISPLAY TWO-LINE // MATRIX CHARACTER 5 * 7 POINTS
   Lcd_Write_Command(0x01); // CLEAR DISPLAY //
   Lcd_Write_Command(0x06); // ENTRY MODE SET //
   Lcd_Write_Command(0x0C); // DISPLAY ON //

   HAL_Delay(1);
}


void Lcd_Char(char c)
{
   Lcd_Write_Data(c);   
}

void Lcd_Send_String (char * String)
{
   while(*String)   Lcd_Char(*String++);
}

void Lcd_Int(int val)
{
   char bufor[17];
   sprintf(bufor,"%d",val);
   Lcd_Send_String(bufor);
}

void Lcd_XY(uint8_t Y, uint16_t X)
{
   switch (Y)
   {
      case 0: Y = 0x00; break;
      case 1: Y = 0x40; break;         
   }
   Lcd_Write_Command((0x80 + Y + X));
   HAL_Delay(1);
}

int main(void)
{
Lcd_Init();
   Lcd_XY(0,2);
   Lcd_Send_String("BARTEK:");
}
   
   

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [LCD HD44780] Biblioteka na HAL działa, na rejestrach nie

Postautor: Antystatyczny » wtorek 20 gru 2016, 19:34

Tu masz błąd:

Kod: Zaznacz cały

#define D5_SET (GPIOB -> ODR &= ~GPIO_ODR_ODR14);
#define D5_RESET (GPIOB -> ODR |= GPIO_ODR_ODR14);
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: [LCD HD44780] Biblioteka na HAL działa, na rejestrach nie

Postautor: StaryAnoda » wtorek 20 gru 2016, 19:40

No ruszyło dzięki wielkie. Jednak oko które nie widziało kodu widzi więcej :)


Wróć do „ARM STMicroelectronics”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości