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_MAX  128-1
#define Dis_Y_MAX  64-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打开

你可能感兴趣的:(c,c,IO,IO,IO,IO)