使用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);
}