分享一篇基于STM32F103驅動LCD12864的代碼(串行驅動,親測可用)
說明一下:PSB管腳可以直接接地,CS可以直接接VCC,可以省出2個管腳
另外想要移植到51的話只需要更改一下管腳控制、定義和注意延時時間即可
代碼如下(.c文件):
#include "lcd12864.h"
//字符顯示RAM(隨機存儲器)地址(簡單理解就是顯示屏上字符顯示的位置)
uint8_t LCD12864_DDRAM_ADDR[4][8]=
{
{0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87}, //第一行
{0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97}, //第二行
{0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F}, //第三行
{0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F} //第四行
};
void LCD12864_Init()
{
//SID、SCLK端口初始化
GPIO_InitTypeDef GPIO_InitStructure;
CS_H;
PSB_L;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //時鐘使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//LCD12864初始化基本流程
delay_ms(50); //等待液晶自檢(延時>40ms)
LCD12864_Write(WRITE_CMD,0x30);//功能設定:選擇基本指令集 ,選擇8bit數據流
delay_us(200); //延時>137us
LCD12864_Write(WRITE_CMD,0x0C);//開顯示
delay_us(200); //延時>100us
LCD12864_Write(WRITE_CMD,0x01);//清除顯示,并且設定地址指針為00H
delay_ms(20); //延時>10ms
LCD12864_Write(WRITE_CMD,0x06);//每次地址自動+1,初始化完成
}
void LCD12864_Send_Byte(char byte)//將一字節數據送到數據總線
{
uint8_t i;
for(i = 0; i < 8; i++)
{
SCLK_L; //時鐘線置低
if(byte & (0x80 >> i))//將所需要發送的byte一位一位的設置并發送
{
SID_H;
}
else
{
SID_L;
}
SCLK_H; //裝載數據
}
}
void LCD12864_Write(uint8_t Mode,uint8_t CMDorDAT)
{
delay_ms(1); //每次寫入數據或指令間隔大于1ms 便可不用寫忙狀態檢測
LCD12864_Send_Byte(Mode); //寫指令還是顯示數據
LCD12864_Send_Byte(0xF0 & CMDorDAT); //寫高四位(寫入的數據的高四位)
LCD12864_Send_Byte(0xF0 & (CMDorDAT << 4)); //寫低四位 (寫入的數據的低四位)
}
void LCD12864_Clear()
{
LCD12864_Write(WRITE_CMD, 0x01); //清屏指令
delay_ms(2); //延時以待液晶穩定【至少1.6ms】
}
void LCD12864_Display_Words(uint8_t x, uint8_t y, char *str) //顯示函數(x是行,y是列)
{
LCD12864_Write(WRITE_CMD, LCD12864_DDRAM_ADDR[x][y]); //設置顯示位置
while(*str!='\0')
{
LCD12864_Write(WRITE_DAT, *str++);
}
}
/*************
寫入圖片需要的步驟
1.切換到擴充指令
2.關閉繪圖顯示功能
3.將垂直的坐標(Y)和水平位元組坐標(X)寫入CGRAM地址(先Y后X)
4.將圖片的字節數據寫入RAM中(先將高位D15-D8寫入再寫D7-D0)
5.打開繪圖顯示功能
6.切換回基本指令
**************/
void LCD_Display_Picture(uint8_t *img)
{
uint8_t x,y,i;
LCD12864_Write(WRITE_CMD,0x34); //切換到擴充指令
LCD12864_Write(WRITE_CMD,0x34); //關閉圖形顯示
for(i = 0; i < 1; i++) //上下屏寫入
{
for(y=0;y<32;y++) //垂直Y寫32次
{
for(x=0;x<8;x++) //橫向X寫8次
{
LCD12864_Write(WRITE_CMD,0x80 + y) ; //行地址
LCD12864_Write(WRITE_CMD,0x80 + x+i); //列地址
LCD12864_Write(WRITE_DAT,*img ++) ; //寫高位字節數據 D15-D8
LCD12864_Write(WRITE_DAT,*img ++) ; //寫低位字節數據 D7-D0
}
}
}
LCD12864_Write(WRITE_CMD,0x36);//打開圖形顯示
LCD12864_Write(WRITE_CMD,0x30);//切換回基本指令
}
(.h文件代碼)
#ifndef __LCD12864_H
#define __LCD12864_H
#include "sys.h"
#include "delay.h"
//PA0接SID,PA1接SCLK,CS接VCC(一直選通),PSB接GND(串行傳輸方式),RST接VCC(低電平復位),BLA接VCC,BLK接GND
#define SID_H GPIO_SetBits(GPIOB,GPIO_Pin_3)
#define SID_L GPIO_ResetBits(GPIOB,GPIO_Pin_3)
#define SCLK_H GPIO_SetBits(GPIOB,GPIO_Pin_4)
#define SCLK_L GPIO_ResetBits(GPIOB,GPIO_Pin_4)
#define CS_H GPIO_SetBits(GPIOB,GPIO_Pin_5)
#define CS_L GPIO_ResetBits(GPIOB,GPIO_Pin_5)
#define PSB_H GPIO_SetBits(GPIOB,GPIO_Pin_6)
#define PSB_L GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define WRITE_CMD 0xF8 //寫命令
#define WRITE_DAT 0xFA //寫數據
void LCD12864_Init(void) ;//初始化LCD
void LCD12864_Clear(void) ;//清屏
void LCD12864_Send_Byte(char byte);//Byte發送函數
void LCD12864_Write(uint8_t Select,uint8_t CMDorDAT) ; //MCU向LCD寫數據或者命令
void LCD12864_Display_Words(uint8_t x, uint8_t y, char *str);//字符(漢字)顯示函數
void LCD12864_Display_Picture(uint8_t *img) ;//圖片顯示函數
#endif
|