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

QQ登錄

只需一步,快速開始

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

stm32f103驅(qū)動(dòng)lcd程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:188556 發(fā)表于 2017-4-11 18:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include "stm32f10x.h"
#include"12864.h"
#include"delay.h"       
/************************************************************************************************
//FILE:液晶12864驅(qū)動(dòng)程序
  //DATE:2012/07/11
************************************************************************************************/
/************************************************************************************************
@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);
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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