|
分享一篇基于STM32F103驅(qū)動(dòng)LCD12864的代碼(串行驅(qū)動(dòng),親測(cè)可用)
說(shuō)明一下:PSB管腳可以直接接地,CS可以直接接VCC,可以省出2個(gè)管腳
另外想要移植到51的話只需要更改一下管腳控制、定義和注意延時(shí)時(shí)間即可
代碼如下(.c文件):
#include "lcd12864.h"
//字符顯示RAM(隨機(jī)存儲(chǔ)器)地址(簡(jiǎn)單理解就是顯示屏上字符顯示的位置)
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); //時(shí)鐘使能
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); //等待液晶自檢(延時(shí)>40ms)
LCD12864_Write(WRITE_CMD,0x30);//功能設(shè)定:選擇基本指令集 ,選擇8bit數(shù)據(jù)流
delay_us(200); //延時(shí)>137us
LCD12864_Write(WRITE_CMD,0x0C);//開(kāi)顯示
delay_us(200); //延時(shí)>100us
LCD12864_Write(WRITE_CMD,0x01);//清除顯示,并且設(shè)定地址指針為00H
delay_ms(20); //延時(shí)>10ms
LCD12864_Write(WRITE_CMD,0x06);//每次地址自動(dòng)+1,初始化完成
}
void LCD12864_Send_Byte(char byte)//將一字節(jié)數(shù)據(jù)送到數(shù)據(jù)總線
{
uint8_t i;
for(i = 0; i < 8; i++)
{
SCLK_L; //時(shí)鐘線置低
if(byte & (0x80 >> i))//將所需要發(fā)送的byte一位一位的設(shè)置并發(fā)送
{
SID_H;
}
else
{
SID_L;
}
SCLK_H; //裝載數(shù)據(jù)
}
}
void LCD12864_Write(uint8_t Mode,uint8_t CMDorDAT)
{
delay_ms(1); //每次寫(xiě)入數(shù)據(jù)或指令間隔大于1ms 便可不用寫(xiě)忙狀態(tài)檢測(cè)
LCD12864_Send_Byte(Mode); //寫(xiě)指令還是顯示數(shù)據(jù)
LCD12864_Send_Byte(0xF0 & CMDorDAT); //寫(xiě)高四位(寫(xiě)入的數(shù)據(jù)的高四位)
LCD12864_Send_Byte(0xF0 & (CMDorDAT << 4)); //寫(xiě)低四位 (寫(xiě)入的數(shù)據(jù)的低四位)
}
void LCD12864_Clear()
{
LCD12864_Write(WRITE_CMD, 0x01); //清屏指令
delay_ms(2); //延時(shí)以待液晶穩(wěn)定【至少1.6ms】
}
void LCD12864_Display_Words(uint8_t x, uint8_t y, char *str) //顯示函數(shù)(x是行,y是列)
{
LCD12864_Write(WRITE_CMD, LCD12864_DDRAM_ADDR[x][y]); //設(shè)置顯示位置
while(*str!='\0')
{
LCD12864_Write(WRITE_DAT, *str++);
}
}
/*************
寫(xiě)入圖片需要的步驟
1.切換到擴(kuò)充指令
2.關(guān)閉繪圖顯示功能
3.將垂直的坐標(biāo)(Y)和水平位元組坐標(biāo)(X)寫(xiě)入CGRAM地址(先Y后X)
4.將圖片的字節(jié)數(shù)據(jù)寫(xiě)入RAM中(先將高位D15-D8寫(xiě)入再寫(xiě)D7-D0)
5.打開(kāi)繪圖顯示功能
6.切換回基本指令
**************/
void LCD_Display_Picture(uint8_t *img)
{
uint8_t x,y,i;
LCD12864_Write(WRITE_CMD,0x34); //切換到擴(kuò)充指令
LCD12864_Write(WRITE_CMD,0x34); //關(guān)閉圖形顯示
for(i = 0; i < 1; i++) //上下屏寫(xiě)入
{
for(y=0;y<32;y++) //垂直Y寫(xiě)32次
{
for(x=0;x<8;x++) //橫向X寫(xiě)8次
{
LCD12864_Write(WRITE_CMD,0x80 + y) ; //行地址
LCD12864_Write(WRITE_CMD,0x80 + x+i); //列地址
LCD12864_Write(WRITE_DAT,*img ++) ; //寫(xiě)高位字節(jié)數(shù)據(jù) D15-D8
LCD12864_Write(WRITE_DAT,*img ++) ; //寫(xiě)低位字節(jié)數(shù)據(jù) D7-D0
}
}
}
LCD12864_Write(WRITE_CMD,0x36);//打開(kāi)圖形顯示
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(低電平復(fù)位),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 //寫(xiě)命令
#define WRITE_DAT 0xFA //寫(xiě)數(shù)據(jù)
void LCD12864_Init(void) ;//初始化LCD
void LCD12864_Clear(void) ;//清屏
void LCD12864_Send_Byte(char byte);//Byte發(fā)送函數(shù)
void LCD12864_Write(uint8_t Select,uint8_t CMDorDAT) ; //MCU向LCD寫(xiě)數(shù)據(jù)或者命令
void LCD12864_Display_Words(uint8_t x, uint8_t y, char *str);//字符(漢字)顯示函數(shù)
void LCD12864_Display_Picture(uint8_t *img) ;//圖片顯示函數(shù)
#endif
|
評(píng)分
-
查看全部評(píng)分
|