使用stm32 SPI总线控制LCD12864

使用stm32 SPI总线控制LCD12864
使用stm32 SPI总线控制LCD12864

使用stm32 SPI总线控制LCD12864

一、SPI初始化

/****************************************************************************** *

* Function Name : SPI1_Init

* Description : Initializes the peripherals used by the SPI FLASH driver.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void SPI1_Init(void)

{

SPI_InitTypeDef SPI_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

/* Enable SPI1 and GPIO clocks */

/*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,

SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO

and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

/*!< SPI_FLASH_SPI Periph clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

/*!< Configure SPI_FLASH_SPI pins: SCK */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/*!< Configure SPI_FLASH_SPI pins: MISO */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/*!< Configure SPI_FLASH_SPI pins: MOSI */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/*!< Configure SPI_FLASH_SPI_CS_PIN pin: SPI_FLASH Card CS pin */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* SPI1 configuration */

// Data on the DO and DIO pins are clocked out on the falling edge of CLK.

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI1, &SPI_InitStructure);

/* Enable SPI1 */

SPI_Cmd(SPI1, ENABLE);

}

二、LCD12864头文件

#ifndef __LCD12864_H__

#define __LCD12864_H__

#include "stm32f10x.h"

#define DisIO GPIOA

#define DisClk RCC_APB2Periph_GPIOA

#define IOData GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7

#define CS_H GPIO_SetBits(GPIOA,GPIO_Pin_4) //CS=1 PIN4

#define CS_L GPIO_ResetBits(GPIOA,GPIO_Pin_4) //CS=0

#define SID_H GPIO_SetBits(GPIOA,GPIO_Pin_7) //SID=1 PIN5

#define SID_L GPIO_ResetBits(GPIOA,GPIO_Pin_7); //SID = 0

#define CLK_H GPIO_SetBits(GPIOA,GPIO_Pin_5); //CLK = 1.PIN6

#define CLK_L GPIO_ResetBits(GPIOA,GPIO_Pin_5); //CLK = 0

void LCD_Init(void); //液晶初始化

void LCD_Wdata(u8 data); //液晶写入数据

void LCD_Wcmd(u8 cmd); //液晶写入指令

void LCD_Clr(void); //清屏

void DisNum(u8 x_add,u8 y_add,u8 num); //指定位置写入数字void display(unsigned char x_add,unsigned char *ptr); //指定位置写入字符串void DisStr(u8 x_add,u8 y_add,u8 *ptr); //指定位置写入字符串

三、

u8 SPI_SendByte(u16 data)

{

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

SPI1->DR=data; //送数据

return 0;

}

void LCD_Write(u8 data)

{

SPI_SendByte(data&0xf0); //发送高四位

SPI_SendByte((data<<4)&0xf0); //发送低四位

}

void LCD_Wcmd(u8 cmd)

{

CS_H;

SPI_SendByte(0xf8); //表示要发送的是指令

LCD_Write(cmd);

CS_L;

}

void LCD_Clr()

{

LCD_Wcmd(0x01);

}

void LCD_Wdata(u8 data)

{

CS_H;

SPI_SendByte(0xfa); //表示要发送的是数据

LCD_Write(data);

CS_L;

}

void DisNum(u8 x_add,u8 y_add,u8 num)

{

u8 temp,i=0;

temp=num;

temp/=10;

while(temp)

{

i++;

temp /= 10;

}

if(y_add==1) //第一行

{

LCD_Wcmd(x_add+0x80);

}

else if(y_add==2) //第二行

{

LCD_Wcmd(x_add+0x90);

}

else if(y_add==3) //第三行

{

LCD_Wcmd(x_add+0x80+0x08);

}

else //第四行LCD_Wcmd(x_add+0x90+0x08);

if(i==1 || num==0)

LCD_Wdata(num+0x30);

else if(i==2)

{

LCD_Wdata(num/10+0x30);

LCD_Wdata(num%10+0x30);

}

else

{

LCD_Wdata(num/100+0x30);

LCD_Wdata(num%100/10+0x30);

LCD_Wdata(num%10+0x30);

}

}

void display(unsigned char x_add,unsigned char *ptr)

{

LCD_Wcmd(x_add);

while(*ptr != '\0')

{

LCD_Wdata(*ptr);

++ptr;

}

}

void DisStr(u8 x_add,u8 y_add,u8 *ptr)

{

if(y_add==1) //第一行

{

LCD_Wcmd(x_add+0x80);

else if(y_add==2) //第二行

{

LCD_Wcmd(x_add+0x90);

}

else if(y_add==3) //第三行

{

LCD_Wcmd(x_add+0x80+0x08);

}

else //第四行LCD_Wcmd(x_add+0x90+0x08);

while(*ptr != '\0')

{

LCD_Wdata(*ptr);

++ptr;

}

}

void LCD_Init(void)

{

CS_L;

SPI1_Init();

Delay_us(2000);

LCD_Wcmd(0x30);//基本指令集

LCD_Wcmd(0x0c);

LCD_Wcmd(0x01);

LCD_Wcmd(0x02);

LCD_Wcmd(0x80);

}

相关主题
相关文档
最新文档