標(biāo)題:
基于stm32的帶字庫(kù)LCD12864驅(qū)動(dòng)源程序
[打印本頁(yè)]
作者:
__myth丶
時(shí)間:
2018-11-9 09:48
標(biāo)題:
基于stm32的帶字庫(kù)LCD12864驅(qū)動(dòng)源程序
基于stm32的LCD12864源程序如下:
#include "stm32f10x.h"
#include"12864.h"
#include"delay.h"
/************************************************************************************************
//FILE:液晶12864驅(qū)動(dòng)程序
//VERS:1.0
//AUTHOR:福建師范大學(xué)林木泉
************************************************************************************************/
/************************************************************************************************
@f_name: void LCD12864_InitPort(void)
@brief: 初始化硬件端口配置
@param: None
@return: None
************************************************************************************************/
void LCD12864_InitPort(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定義結(jié)構(gòu)體
RCC_APB2PeriphClockCmd(GPIOCLK|RCC_APB2Periph_AFIO, ENABLE); //使能功能復(fù)用IO時(shí)鐘,不開啟復(fù)用時(shí)鐘不能顯示
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); //把調(diào)試設(shè)置普通IO口
GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DAT; //數(shù)據(jù)口配置成開漏輸出模式,此模式下讀輸入寄存器的值得到IO口狀態(tài)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //開漏輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure); //IO口初始化函數(shù)(使能上述配置)
GPIO_InitStructure.GPIO_Pin = LCD_GPIO_CMD;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure);
GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure); //初始化IO口配置
GPIO_Write(LCD12864_GPIO ,0xffff);
}
/************************************************************************************************
@f_name: void NOP(void)
@brief: 延時(shí)函數(shù)
@param: None
@return: None
************************************************************************************************/
void NOP(void)
{ u8 i; for(i=0; i<100; i++); }
/************************************************************************************************
@f_name: u8 LCD12864_busy(void)
@brief: 檢測(cè)忙狀態(tài)
@param: None
@return: None
************************************************************************************************/
u8 LCD12864_busy(void)
{
u8 x;
LCD_RS(0);
LCD_RW(1);
LCD_EN(1);
NOP();
NOP();
x=Text_Busy;
LCD_EN(0);
return x;
}
/************************************************************************************************
@f_name: void LCD12684_Wcmd(u8 dat)
@brief: 寫指令
@param: u8 dat 輸入指令
@return: None
************************************************************************************************/
void LCD12684_Wcmd(u8 dat)
{
while(LCD12864_busy()); //忙檢測(cè)
LCD_RS(0);
LCD_RW(0);
LCD_EN(0);
NOP();
NOP();
LCD_WriteData(dat);
NOP();
NOP();
LCD_EN(1);
NOP();
NOP();
LCD_EN(0);
}
/************************************************************************************************
@f_name: void LCD12684_Wcmd(u8 dat)
@brief: 寫數(shù)據(jù)
@param: u8 dat 輸入數(shù)據(jù)
@return: None
************************************************************************************************/
void LCD12684_Wdat(u8 dat)
{
while(LCD12864_busy()); //忙檢測(cè)
LCD_RS(1);
LCD_RW(0);
LCD_EN(0);
NOP();
NOP();
LCD_WriteData(dat);
NOP();
NOP();
LCD_EN(1);
NOP();
NOP();
LCD_EN(0);
}
/************************************************************************************************
@f_name: void LCD12864_Init(void)
@brief: 液晶初始化
@param: None
@return: None
************************************************************************************************/
void LCD12864_Init(void)
{
LCD_PSB(1); //并口方式
LCD_RST(0); //液晶復(fù)位 低電平有效
delay_ms(3);
LCD_RST(1); //置高電平等待復(fù)位
delay_ms(3);
LCD12684_Wcmd(0x34); //擴(kuò)充指令操作
delay_ms(5);
LCD12684_Wcmd(0x30); //基本指令操作
delay_ms(5);
LCD12684_Wcmd(0x0c); //顯示開,關(guān)光標(biāo)
delay_ms(5);
LCD12684_Wcmd(0x01); //清除LCD的顯示內(nèi)容
delay_ms(5);
}
/************************************************************************************************
@f_name: void LCD12864_Clr(void)
@brief: 清屏
@param: None
@return: None
************************************************************************************************/
void LCD12864_Clr(void)
{
LCD12684_Wcmd(0x34); //擴(kuò)充指令操作 “繪圖”
delay_ms(5);
LCD12684_Wcmd(0x30); //基本指令操作
delay_ms(5);
LCD12684_Wcmd(0x01); //清屏
delay_ms(5);
}
/************************************************************************************************
@f_name: void LCD12864_Pos(u8 x,u8 y)
@brief: 設(shè)置顯示位置
@param: u8 x:X軸 u8 y:Y軸
@return: None
************************************************************************************************/
void LCD12864_Pos(u8 x,u8 y)
{
u8 pos;
if (x==1) {x=0x80;}
else if (x==2) {x=0x90;}
else if (x==3) {x=0x88;}
else if (x==4) {x=0x98;}
else x=0x80;
pos = x+y ;
LCD12684_Wcmd(pos); //顯示地址
}
/************************************************************************************************
@f_name: void LCD12864_PhotoDis(u8 *bmp)
@brief: 顯示圖形
@param: u8 *bmp 圖形數(shù)組
@return: None
************************************************************************************************/
void LCD12864_PhotoDis(u8 *bmp)
{
u8 i,j;
LCD12684_Wcmd(0x34); //關(guān)閉圖形顯示
for(i=0;i<32;i++)
{
LCD12684_Wcmd(0x80+i); //先寫入水平坐標(biāo)值
LCD12684_Wcmd(0x80); //寫入垂直坐標(biāo)值
for(j=0;j<16;j++) //再寫入兩個(gè)8位元的數(shù)據(jù)
LCD12684_Wdat(*bmp++);
delay_ms(1);
}
for(i=0;i<32;i++)
{
LCD12684_Wcmd(0x80+i);
LCD12684_Wcmd(0x88);
for(j=0;j<16;j++)
LCD12684_Wdat(*bmp++);
delay_ms(1);
}
LCD12684_Wcmd(0x36); //寫完數(shù)據(jù),開圖形顯示
}
/************************************************************************************************
@f_name: void LCD_ShowString(u8 x,u8 y,const u8 *p)
@brief: 顯示字符串
@param: u8 *bmp 圖形數(shù)組
@return: None
************************************************************************************************/
void LCD_ShowString(u8 x,u8 y,const u8 *p)
{
u8 temp;
if(x>4) {x=1;}
if(y>4) {y=0;}
LCD12864_Pos(x,y);
temp=*p;
while(temp!='\0')
{
LCD12684_Wdat(temp);
temp=*(++p);
}
}
復(fù)制代碼
所有資料51hei提供下載:
DIS12864.zip
(305.42 KB, 下載次數(shù): 367)
2018-11-9 09:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
hibis_cn
時(shí)間:
2018-11-9 17:18
附件貌似沒有編譯通過調(diào)試,樓主編譯通過了么
作者:
__myth丶
時(shí)間:
2018-11-14 12:20
當(dāng)然通過了,沒有錯(cuò)誤。
作者:
by64214
時(shí)間:
2018-11-14 17:10
謝謝分享
我用Proteus仿真 原程序采用STM32F103RB 現(xiàn)改成STM32F103R6
刪除lcd.c lcd.h (彩屏程序 ,原程序編譯不通過 )兩個(gè)文件
原程序 startup_stm32f10x_hd 更改為startup_stm32f10x_ld
//LCD_ShowString(3,0,"www點(diǎn)openedv點(diǎn)com"); 仿真 除文字外 仿真失敗
2018-11-14_16.jpg
(317.4 KB, 下載次數(shù): 78)
下載附件
2018-11-14 17:08 上傳
作者:
wangzhenkuan060
時(shí)間:
2019-5-4 19:16
感謝分享
作者:
qianfeng0519
時(shí)間:
2019-12-20 16:36
謝謝樓主分享
作者:
156450727
時(shí)間:
2020-4-11 15:48
謝謝樓主分享
作者:
51hdz3356619
時(shí)間:
2020-4-13 09:17
謝謝樓主共享。
作者:
123ty
時(shí)間:
2020-6-20 13:48
謝謝樓主分享
作者:
yimaer
時(shí)間:
2022-3-7 21:23
樓主的12864怎么找的啊,我的proteus8.6沒有這個(gè)模塊
作者:
yimaer
時(shí)間:
2022-3-7 23:19
proteus8.9,原理圖能選LCD12864A,但是仿真出錯(cuò),Internal Exception: access violation in module 'LCD12864A.DLL' [000013C0].
樓主能指導(dǎo)下嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1