کد:
/*----------------------------------------------------------------------------
* Name: LCD_4bit.c
* Purpose: low level LDC functions
* Note(s): 2 line 16 character Text LCD (4-bit interface)
* connected on MCBSTM32 Evaluation Board
*----------------------------------------------------------------------------
* This file is part of the uVision/ARM development tools.
* This software may only be used under the terms of a valid, current,
* end user licence from KEIL for a compatible version of KEIL software
* development tools. Nothing else gives you the right to use this software.
*
* This software is supplied "AS IS" without warranties of any kind.
*
* Copyright (c) 20009-2011 Keil - An ARM Company. All rights reserved.
*----------------------------------------------------------------------------*/
#include "STM32F10x.h"
#include "LCD.h"
/* 8 user defined characters to be loaded into CGRAM (used for bargraph) */
const char UserFont[8][8] = {
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
{ 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 },
{ 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C },
{ 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E },
{ 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F },
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }
};
/************************ Global function definitions *************************/
/*******************************************************************************
* Delay in while loop cycles *
* Parameter: cnt: number of while cycles to delay *
* Return: *
*******************************************************************************/
static void delay (int cnt)// us
{
uint32_t i;
i = 0;
while (cnt--) {
for (i = 0; i < DELAY; i++);
}
}
/*******************************************************************************
* Read status of LCD controller *
* Parameter: none *
* Return: Status byte contains busy flag and address pointer *
*******************************************************************************/
static unsigned char lcd_read_status (void)
{
unsigned char status;
LCD_DATA_DIR_IN
LCD_RS(0)
LCD_RW(1)
delay(1);
LCD_E(1)
delay(1);
status = LCD_DATA_IN << 4;
LCD_E(0)
delay(1);
LCD_E(1)
delay(1);
status |= LCD_DATA_IN;
LCD_E(0)
LCD_DATA_DIR_OUT
return (status);
}
/*******************************************************************************
* Wait until LCD controller busy flag is 0 *
* Parameter: *
* Return: Status byte of LCD controller (busy + address) *
*******************************************************************************/
static unsigned char wait_while_busy (void)
{
unsigned char status;
do {
status = lcd_read_status();
} while (status & 0x80); /* Wait for busy flag */
return (status);
}
/*******************************************************************************
* Write 4-bits to LCD controller *
* Parameter: c: command to be written *
* Return: *
*******************************************************************************/
void lcd_write_4bit (unsigned char c)
{
LCD_RW(0)
LCD_DATA_OUT(c)
LCD_E(1)
delay(1);
LCD_E(0)
delay(800);
LCD_CLR_OUT(x)
}
/*******************************************************************************
* Write command to LCD controller *
* Parameter: c: command to be written *
* Return: *
*******************************************************************************/
void lcd_write_cmd (unsigned char c)
{
wait_while_busy();
LCD_RS(0)
lcd_write_4bit (c>>4);
lcd_write_4bit (c);
}
/*******************************************************************************
* Write data to LCD controller *
* Parameter: c: data to be written *
* Return: *
*******************************************************************************/
static void lcd_write_data (unsigned char c)
{
wait_while_busy();
LCD_RS(1)
lcd_write_4bit (c>>4);
lcd_write_4bit (c);
}
/*******************************************************************************
* Print Character to current cursor position *
* Parameter: c: character to be printed *
* Return: *
*******************************************************************************/
void lcd_putchar (char c)
{
lcd_write_data (c);
}
/*******************************************************************************
* Initialize the LCD controller *
* Parameter: *
* Return: *
*******************************************************************************/
void lcd_init (void)
{
int i;
char const *p;
//LCD_CLOCKA_EN /* Enable clock for peripheral */
LCD_CLOCKB_EN
/* Set all pins for LCD as outputs */
LCD_ALL_DIR_OUT1
LCD_ALL_DIR_OUT2
delay (1500);
LCD_RS(0)
lcd_write_4bit (0x3); /* Select 4-bit interface */
lcd_write_4bit (0x3);
lcd_write_4bit (0x3);
lcd_write_4bit (0x2);
lcd_write_cmd (0x28); /* 2 lines, 5x8 character matrix */
lcd_write_cmd (0x0C); /* Display ctrl:Disp=ON,Curs/Blnk=OFF */
lcd_write_cmd (0x06); /* Entry mode: Move right, no shift */
/* Load user-specific characters into CGRAM */
lcd_write_cmd(0x40); /* Set CGRAM address counter to 0 */
p = &UserFont[0][0];
for (i = 0; i < sizeof(UserFont); i++, p++)
lcd_putchar (*p);
lcd_write_cmd(0x80); /* Set DDRAM address counter to 0 */
}
/*******************************************************************************
* Set cursor position on LCD display *
* Parameter: column: column position *
* line: line position *
* Return: *
*******************************************************************************/
void set_cursor (int column, int line)
{
unsigned char address;
address = (line * 40) + column;
address = 0x80 + (address & 0x7F);
lcd_write_cmd(address); /* Set DDRAM address counter to 0 */
}
/*******************************************************************************
* Clear the LCD display *
* Parameter: *
* Return: *
*******************************************************************************/
void lcd_clear (void)
{
lcd_write_cmd(0x01); /* Display clear */
set_cursor (0, 0);
}
/*******************************************************************************
* Print sting to LCD display *
* Parameter: string: pointer to output string *
* Return: *
*******************************************************************************/
void lcd_print (char *string)
{
while (*string) {
lcd_putchar (*string++);
}
}
/*******************************************************************************
* Print a bargraph to LCD display *
* Parameter: val: value 0..100 % *
* size: size of bargraph 1..16 *
* Return: *
*******************************************************************************/
void lcd_bargraph (int value, int size) {
int i;
value = value * size / 20; /* Display matrix 5 x 8 pixels */
for (i = 0; i < size; i++) {
if (value > 5) {
lcd_putchar (0x05);
value -= 5;
}
else {
lcd_putchar (value);
break;
}
}
}
/*******************************************************************************
* Display bargraph on LCD display *
* Parameter: pos_x: horizontal position of bargraph start *
* pos_y: vertical position of bargraph *
* value: size of bargraph active field (in pixels) *
* Return: *
*******************************************************************************/
void lcd_bargraphXY (int pos_x, int pos_y, int value) {
int i;
set_cursor (pos_x, pos_y);
for (i = 0; i < 16; i++) {
if (value > 5) {
lcd_putchar (0x05);
value -= 5;
} else {
lcd_putchar (value);
while (i++ < 16) lcd_putchar (0);
}
}
}
/******************************************************************************/
این کتابخونه تغییر دادم برای برد خودم..برا lcdولی کار نمیکنه.....اتصالاتم مثل همین ک مشخص کردم بستم....هدر رد stm32f103cاستفاده میکنم
لطفعا کمک کنین
- - - Updated - - -
/*------------------------- Speed dependant settings -------------------------*/
#define DELAY 20
/*------------------------- Text LCD size definitions ------------------------*/
#define LineLen 16 /* Width (in characters) */
#define NumLines 2 /* Hight (in lines) */
/*-------------------- LCD interface hardware definitions --------------------*/
/* PINS:
- DB4 = PB12
- DB5 = PB13
- DB6 = PB14
- DB7 = PB15
- RS = PB9
- RW = PB10
- E = PB11
*/
#define DB4 12
#define PIN_RS (1<<9) //PB.9
#define PIN_RW (1<<10) //PB.10
#define PIN_E (1<<11) //PB.11
#define GPIO_Data GPIOB
#define GPIO_CTRL GPIOB
#define PINS_DATA (0x0F << DB4)
/* Enable Clock for peripheral driving LCD pins */
#define LCD_CLOCKB_EN RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // enable clock for GPIOB
//#define LCD_CLOCKB_EN RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // enable clock for GPIOC
/* pin RS setting to 0 or 1 */
#define LCD_RS(x) (x ? (GPIO_CTRL->BSRR = PIN_RS) : (GPIO_CTRL->BRR = PIN_RS));
/* pin RW setting to 0 or 1 */
#define LCD_RW(x) (x ? (GPIO_CTRL->BSRR = PIN_RW) : (GPIO_CTRL->BRR = PIN_RW));
/* pin E setting to 0 or 1 */
#define LCD_E(x) (x ? (GPIO_CTRL->BSRR = PIN_E) : (GPIO_CTRL->BRR = PIN_E));
/* Reading DATA pins */
#define LCD_DATA_IN ((GPIO_Data->IDR & PINS_DATA) >> DB4) & 0x0F
/* Writing value to DATA pins */
#define LCD_CLR_OUT(x) GPIO_Data->BRR = 0xF << DB4;
#define LCD_DATA_OUT(x) GPIO_Data->BSRR = (x&0x0f) << DB4;
/* Setting all pins to output mode */
#define LCD_ALL_DIR_OUT1 GPIO_Data->CRH &= ~0xFFFF0000;\
GPIO_Data->CRH |= 0x33330000;
#define LCD_ALL_DIR_OUT2 GPIO_CTRL->CRH &= ~0x0000FFF0;\
GPIO_CTRL->CRH |= 0x00003330;
/* Setting DATA pins to input mode */
#define LCD_DATA_DIR_IN GPIO_Data->CRH = (GPIO_Data->CRH & 0xFFFF0000) | 0x44440000;
/* Setting DATA pins to output mode */
#define LCD_DATA_DIR_OUT GPIO_Data->CRH &= ~0xFFFF0000;\
GPIO_Data->CRH |= 0x33330000;
extern void lcd_init (void);
extern void lcd_clear (void);
extern void lcd_putchar (char c);
extern void set_cursor (int column, int line);
extern void lcd_print (char *string);
extern void lcd_bargraph (int value, int size);
extern void lcd_bargraphXY (int pos_x, int pos_y, int value);
void lcd_write_cmd (unsigned char c);
/******************************************************************************/