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:");
}