標(biāo)題:
STM32驅(qū)動(dòng)LCD12864程序
[打印本頁]
作者:
dtfsfsfs
時(shí)間:
2019-9-21 17:02
標(biāo)題:
STM32驅(qū)動(dòng)LCD12864程序
LCD12864單片機(jī)源程序如下:
#include "lcd12864.H"
#include "delay.h"
/*!
* @brief GPIO_init
* @since v1.0
* @param None
* @author Z小旋
* 使用時(shí)自行修改這里的初始化即可
*/
void lcd_GPIO_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE時(shí)鐘
//GPIOE0,E1初始化設(shè)置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//無上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
SID=1;
SCLK=1;
}
/* 字符顯示RAM地址 4行8列 */
u8 LCD_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} //第四行
};
/*!
* @brief LCD串行發(fā)送一個(gè)字節(jié)
* @since v1.0
* @param byte 寫入字節(jié)
* @author Z小旋
*/
void SendByte(u8 byte)
{
u8 i;
for(i = 0;i < 8;i++)
{
if((byte << i) & 0x80) //0x80(1000 0000) 只會(huì)保留最高位
{
SID = 1; // 引腳輸出高電平,代表發(fā)送1
}
else
{
SID = 0; // 引腳輸出低電平,代表發(fā)送0
}
/*或
SID = (Dbyte << i) & 0x80;
上面那樣為了方便理解
*/
SCLK = 0; //時(shí)鐘線置低 允許SID變化
delay_us(5); //延時(shí)使數(shù)據(jù)寫入
SCLK = 1; //拉高時(shí)鐘,讓從機(jī)讀SID
}
}
/*!
* @brief LCD寫指令
* @since v1.0
* @param Cmd 要寫入的指令
* @author Z小旋
*/
void Lcd_WriteCmd(u8 Cmd )
{
delay_ms(1); //由于我們沒有寫LCD正忙的檢測,所以直接延時(shí)1ms,使每次寫入數(shù)據(jù)或指令間隔大于1ms 便可不用寫忙狀態(tài)檢測
SendByte(WRITE_CMD); //11111,RW(0),RS(0),0
SendByte(0xf0&Cmd); //高四位
SendByte(Cmd<<4); //低四位(先執(zhí)行<<)
}
/*!
* @brief LCD寫數(shù)據(jù)
* @since v1.0
* @param Dat 要寫入的數(shù)據(jù)
* @author Z小旋
*/
void Lcd_WriteData(u8 Dat )
{
delay_ms(1);
SendByte(WRITE_DAT); //11111,RW(0),RS(1),0
SendByte(0xf0&Dat); //高四位
SendByte(Dat<<4); //低四位(先執(zhí)行<<)
}
/*!
* @brief LCD初始化
* @since v1.0
* @param None
* @author Z小旋
*/
void Lcd_Init(void)
{
delay_ms(50); //等待液晶自檢(延時(shí)>40ms)
Lcd_WriteCmd(0x30); //功能設(shè)定:選擇基本指令集
delay_ms(1);//延時(shí)>100us
Lcd_WriteCmd(0x30); //功能設(shè)定:選擇8bit數(shù)據(jù)流
delay_ms(1); //延時(shí)>37us
Lcd_WriteCmd(0x0c); //開顯示
delay_ms(1); //延時(shí)>100us
Lcd_WriteCmd(0x01); //清除顯示,并且設(shè)定地址指針為00H
delay_ms(30); //延時(shí)>10ms
Lcd_WriteCmd(0x06); //進(jìn)入設(shè)定點(diǎn),初始化完成
}
/*!
* @brief 顯示字符或漢字
* @since v1.0
* @param x: row(0~3)
* @param y: line(0~7)
* @param str: 要顯示的字符或漢字
* @author Z小旋
*/
void LCD_Display_Words(uint8_t x,uint8_t y,uint8_t*str)
{
Lcd_WriteCmd(LCD_addr[x][y]); //寫初始光標(biāo)位置
while(*str>0)
{
Lcd_WriteData(*str); //寫數(shù)據(jù)
str++;
}
}
/*!
* @brief 顯示圖片
* @since v1.0
* @param *pic 圖片地址
* @author
*/
void LCD_Display_Picture(uint8_t *img)
{
uint8_t x,y,i;
Lcd_WriteCmd(0x34); //切換到擴(kuò)充指令
Lcd_WriteCmd(0x34); //關(guān)閉圖形顯示
for(i = 0; i < 1; i++) //上下屏寫入
{
for(y=0;y<32;y++) //垂直Y寫32次
{
for(x=0;x<8;x++) //橫向X寫8次
{
Lcd_WriteCmd(0x80 + y); //行地址
Lcd_WriteCmd(0x80 + x+i); //列地址
Lcd_WriteData(*img ++); //寫高位字節(jié)數(shù)據(jù) D15-D8
Lcd_WriteData(*img ++); //寫低位字節(jié)數(shù)據(jù) D7-D0
}
}
}
Lcd_WriteCmd(0x36);//打開圖形顯示
Lcd_WriteCmd(0x30); //切換回基本指令
}
/*!
* @brief 清屏函數(shù)
* @since v1.0
* @param None
* @author Z小旋
*/
void LCD_Clear(void)
{
Lcd_WriteCmd(0x01); //清屏指令
delay_ms(2); //延時(shí)以待液晶穩(wěn)定【至少1.6ms】
}
復(fù)制代碼
所有資料51hei提供下載:
STM32 LCD12864 -Z小旋.7z
(308.63 KB, 下載次數(shù): 93)
2019-9-21 17:58 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
Robust
時(shí)間:
2020-3-31 17:13
你好,請問有接線圖嗎
作者:
jackshi618
時(shí)間:
2020-4-1 09:19
Robust 發(fā)表于 2020-3-31 17:13
你好,請問有接線圖嗎
程序里面不都寫的很清楚了
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1