MzLH04-12864 串行SPI字库LCD模块使用笔记

日前从淘宝上购买了2块12864串行SPI接口的模块,本想打算用7S64自带的SPI接口去接LCD,结果发现LCD的SPI不是标准的SPI接口。因此只能尝试用7s64的PIO口模拟SPI接口以满足LCD需要。

首先从"铭正同创"的官网上把LCD的驱动整下来。找到LCD_Config.h文件。修改里面的管角定义。(如下)


//#include "REG52.h"
#include <AT91SAM7S64.H> //加入AT91SAM7S64头文件
#include "../Board.h"

#define Dis_X_MAX128-1
#define Dis_Y_MAX64-1

//Define the MCU Register


#define LCD_SPI_CS (1<<0) /* PA0 */ SPI口定义
#define LCD_SPI_SDA (1<<31) /* PA31 */
#define LCD_SPI_SCK (1<<1) /* PA1 */
#define LCD_SPI_RES (1<<15) /* PA3 */

/*
sbit SPI_CS = P1^0;//定义CS接在P1.0端口
sbit SPI_SDA = P1^1;//定义SDA接在P1.1端口
sbit SPI_SCK = P1^2;//定义SCK接在P1.2端口
sbit SPI_RES = P1^3;//定义RESET接P1.3端口
*/

其次修改底层SPI接口操作代码,找到LCD_Dis.c 文件

(1) 在最顶上加入AT91SAM7S64头文件

#include <AT91SAM7S64.H> //此处加入
#include "LCD_Config.h"


unsigned char X_Witch=6;
unsigned char Y_Witch=10;
unsigned char X_Witch_cn=16;
unsigned char Y_Witch_cn=16;
unsigned char Dis_Zero=0;

(2)修改LCD初始化代码

void LCD_Init(void)
{
//SS和SCK预先设置为高电平
*AT91C_PIOA_SODR|=LCD_SPI_SCK;//SPI_SCK = 1;
*AT91C_PIOA_SODR|=LCD_SPI_CS; //SPI_CS = 1;
//复位LCD模块
*AT91C_PIOA_CODR|=LCD_SPI_RES;//SPI_RES = 0;
TimeDelay(50);
//保持低电平大概2ms左右
*AT91C_PIOA_SODR|=LCD_SPI_RES;//SPI_RES = 1;
TimeDelay(80); //延时大概10ms左右
}

(3)修改SPI置SS线状态代码

void SPI_SSSet(unsigned char Status)
{
if(Status)//判断是要置SS为低还是高电平?//SS置高电平
*AT91C_PIOA_SODR|=LCD_SPI_CS;//SPI_CS = 1;
else
*AT91C_PIOA_CODR|=LCD_SPI_CS; //SS置低电平 SPI_CS = 0;
}

(4)串行SPI口数据传输代码

void SPI_Send(unsigned char Data)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
*AT91C_PIOA_CODR|=LCD_SPI_SCK;//SCK置低,SPI_SCK = 0;
if(Data&0x0080)
*AT91C_PIOA_SODR|=LCD_SPI_SDA;//SPI_SDA = 1;
else
*AT91C_PIOA_CODR|=LCD_SPI_SDA;//SPI_SDA = 0;
*AT91C_PIOA_SODR|=LCD_SPI_SCK;//SCK上升沿触发串行数据采样 SPI_SCK = 1;
Data = Data<<1;//数据左移一位
}
}

修改完成后,在主程序中,就可以直接使用LCD了。不过别忘了在主程序中加入

#include "LCD/LCD_Dis.h"

void main()

{

*AT91C_PMC_PCER = (1 << AT91C_ID_PIOA);

*AT91C_PIOA_PER=(LCD_SPI_CS|LCD_SPI_SDA|LCD_SPI_SCK|LCD_SPI_RES); //使能SPI对应的管脚的IO功能
*AT91C_PIOA_OER=(LCD_SPI_CS|LCD_SPI_SDA|LCD_SPI_SCK|LCD_SPI_RES); //使能LED对应的管脚的输出功能
*AT91C_PIOA_OWER=(LCD_SPI_CS|LCD_SPI_SDA|LCD_SPI_SCK|LCD_SPI_RES);

LCD_Init(); //LCD初始化

ClrScreen();


PutString_cn(10,0,"ADC转换---F6返回");
PutString(0,12,"CH0 CH1 CH2 CH3 CH4");
PutString(0,24,"3.3/3.3/3.3/3.3");
PutString(0,36,"CH0 CH1 CH2 CH3 CH4");
PutString(0,48,"3.3/3.3/3.3/3.3");

}

注意,在使用对应的PIO口之前,一定要对 *AT91C_PIOA_PER进行写入,使能I对应的管脚的IO打开

你可能感兴趣的:(SPI)