找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3717|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于stm32F103驅(qū)動(dòng)LCD12864的代碼(串行驅(qū)動(dòng))

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:695711 發(fā)表于 2020-11-2 18:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
分享一篇基于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)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表