久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3121|回復: 3
打印 上一主題 下一主題
收起左側

stm32怎么與lcd12864連接呀?

[復制鏈接]
跳轉到指定樓層
樓主
ID:820031 發表于 2020-11-6 18:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
5黑幣
如題

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

使用道具 舉報

沙發
ID:648615 發表于 2020-11-6 22:06 | 只看該作者
就兩個文件,LCD12864.h和LCD12864.c,自己復制過去后,改一下引腳即可

(如果你連改引腳都不會,那你看來是初初學者,那你自己百度吧),單片機主頻:72MHZ

LCD12864.h如下所示

#ifndef __LCD12864_H
#define __LCD12864_H         
#include "sys.h"


#define LCD1602_RS PEout(0)        // PE0                go define之后我們會發現,這個宏最后就是在這個io的地址這里賦值
                                                                                // #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define LCD1602_RW PEout(1)        // PE1        
#define LCD1602_E PAout(3)        //  PA3        


void LCD12864IO_Init(void);

void LCD1602_DB_IO_outputMode(void);
void LCD1602_DB_IO_inputMode(void);

void write_LCD1602_DB(uint8_t data);
uint8_t read_LCD1602_DB(void);


void InitLcd1602(void);
void LcdShowStr(unsigned char row, unsigned char column, unsigned char *str);
void LcdWriteCmd(unsigned char cmd);

void LcdShowImage(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t *img);
void LcdClearArea(uint8_t x, uint8_t y, uint8_t w, uint8_t h);

//#ifndef _HE_
extern uint8_t HE[];
extern uint8_t QQ[];
extern uint8_t myVX[];

//#endif

#endif
LCD12864.c如下所示:

#include "lcd12864.h"
#include "delay.h"
//#define _HE_

uint8_t HE[]=
{


0x20,0x00,0x70,0x00,0x1E,0x00,0x10,0x3E,0x10,0x22,0xFF,0x22,0x10,0x22,0x18,0x22,0x38,0x22,0x54,0x22,0x54,0x22,0x12,0x22,0x11,0x3E,0x10,0x22,0x10,0x00,0x10,0x00/*"和",0*/
/* (16 X 16 , 宋體 )*/
        
};

uint8_t QQ[]=
{


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0xE0,0x3F,0xE0,0x7F,0xF0,0x7F,0xF8,0x7D,0xF0,0x3C,0xD0,0x2C,0x30,0x30,0x70,0x38,0xE0,0x1F,0x00,0x00,0x00,0x00/*"C:\Users\Administrator\Desktop\qqXiaoBing.bmp",0*/
/* (16 X 16 )*/



        
};

u8 myVX[]=
{
0x00,0x0D,0xFC,0xC8,0x0F,0x3F,0xB0,0x00,0x00,0x0D,0xFC,0xC8,0x0F,0x3F,0xB0,0x00,
0x3F,0xCC,0x7C,0x0F,0x93,0x26,0x33,0xFC,0x20,0xCD,0x80,0x31,0xF0,0x9F,0xB3,0x04,
0x20,0xCD,0x80,0x31,0xF0,0xDF,0xB3,0x04,0x20,0xCF,0xFF,0xC6,0x0C,0xD9,0xB3,0x04,
0x20,0xCF,0xFF,0xC6,0x0C,0x99,0xB3,0x04,0x20,0xCF,0x80,0xCE,0x1C,0xE1,0xB3,0x04,
0x20,0xCF,0xC0,0xCE,0x1C,0xE1,0x33,0x04,0x3F,0xCD,0xE0,0x30,0x00,0xC6,0x33,0xFC,
0x00,0x0D,0x9B,0x36,0x6C,0xD9,0xB0,0x00,0x00,0x0D,0x9B,0x36,0x6C,0xD9,0xB0,0x00,
0xFF,0xFD,0x9F,0xC9,0x83,0x9F,0xBF,0xFF,0xFF,0xFD,0x9F,0xC9,0x83,0x9F,0xBF,0xFF,
0xE0,0xCD,0xFC,0x07,0xF0,0x27,0xC0,0xE0,0x06,0x32,0x79,0xC6,0x33,0x39,0xBC,0x99,
0x06,0x32,0x7B,0xC6,0x13,0x39,0xBC,0x9B,0xF9,0x01,0x9E,0x0F,0x9C,0x18,0x33,0x64,
0xF9,0x01,0x9C,0x0F,0x9C,0x18,0x33,0x64,0x06,0xFC,0x63,0x08,0x73,0x18,0x33,0x1C,
0x06,0xFC,0x61,0x08,0x73,0x18,0x33,0x1C,0xD8,0x03,0x9F,0x01,0x8F,0xE7,0xF3,0xE3,
0xD8,0x03,0x9F,0x01,0x8F,0xE7,0xF3,0xE3,0xFE,0x31,0x98,0xC9,0xFC,0x87,0x8C,0x87,
0x1F,0x03,0x9F,0x35,0xEC,0x18,0x43,0x98,0x1F,0x03,0x9F,0x36,0xEC,0x18,0x43,0x98,
0xFE,0xF3,0xE0,0x7F,0xAC,0x39,0xB0,0xF8,0xFE,0xF3,0xE0,0xFF,0xDC,0x39,0xB0,0xF8,
0x3E,0xC3,0xFF,0xE6,0x5C,0xE6,0x70,0x60,0xF7,0xF3,0x6F,0xFD,0xCC,0x1F,0xBC,0x9F,
0xE7,0xF2,0x67,0xFE,0xFF,0x1F,0xBC,0x9F,0xC7,0xCE,0x7D,0xA1,0xFF,0x00,0x3C,0xE0,
0xC7,0xCE,0x7D,0x83,0xBB,0x80,0x3C,0xE0,0x3F,0x3E,0x1C,0x83,0xFF,0x99,0xFF,0xFB,
0x3F,0x3E,0x1C,0x43,0xFF,0x99,0xFF,0xFB,0x19,0x02,0x18,0x7F,0xFF,0xB8,0x40,0x07,
0x00,0xFC,0x79,0xF3,0xFF,0x39,0xFC,0x83,0x00,0xFC,0x7B,0xF1,0xFF,0x79,0xFC,0x83,
0xD9,0x00,0x04,0xF1,0xFF,0x18,0x0F,0xF8,0xD9,0x00,0x04,0xF1,0x83,0x18,0x0F,0xF8,
0x18,0xFC,0x19,0xF8,0x1F,0x39,0x80,0xFB,0x18,0xFC,0x19,0xF8,0x1F,0x39,0x80,0xFB,
0x27,0xCE,0x66,0x31,0xEC,0x07,0xC0,0x1C,0x38,0x30,0x07,0x0E,0x73,0xE0,0x3C,0x84,
0x38,0x30,0x07,0x0E,0x73,0xE0,0x3C,0x84,0x3E,0xC1,0x81,0xC1,0x83,0x00,0x7C,0xF8,
0x3E,0xC1,0x83,0xC1,0x83,0x00,0x7C,0xF8,0x21,0x31,0x99,0xF6,0x1C,0x3F,0xFC,0xF8,
0x21,0x31,0x9B,0xF6,0x1C,0x3F,0xFC,0xF8,0x39,0x0C,0x1B,0xC9,0x93,0x20,0x00,0x03,
0xFF,0xFC,0x03,0x0E,0x6F,0x61,0x1E,0x7F,0xFF,0xFC,0x03,0x0E,0x6F,0x21,0xBF,0x7F,
0x00,0x0F,0xE3,0xFF,0xFF,0x81,0xB3,0x18,0x00,0x0F,0xE3,0xFF,0xFF,0xC1,0xB3,0x18,
0x3F,0xCE,0x67,0x37,0x83,0xF8,0x3F,0x7B,0x3F,0xCE,0x67,0x37,0x83,0xF8,0x3E,0x79,
0x20,0xCC,0x1B,0x36,0x13,0x18,0x00,0x60,0x20,0xCD,0xE7,0x07,0xEF,0x86,0x30,0x07,
0x20,0xCD,0xE7,0x07,0xEF,0xC6,0x30,0x07,0x20,0xCC,0x7C,0xCE,0x63,0xC6,0x3C,0x9C,
0x20,0xCC,0x7C,0xCE,0x63,0xC6,0x3C,0x9C,0x3F,0xCE,0x67,0x39,0xEC,0xDE,0x0C,0xFC,
0x3F,0xCF,0x67,0x3D,0xE4,0x9E,0x0D,0xFC,0x00,0x0F,0xE4,0x3E,0x63,0x19,0xFF,0x80,/*"C:\Users\Administrator\Desktop\我的二維碼.bmp",0*/
/* (64 X 64 )*/

}
;


void LCD12864IO_Init(void)
{

GPIO_InitTypeDef  GPIO_InitStructure;
         
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA, ENABLE);         
                                                                                                                        //使能PG,PE,PA端口時鐘
GPIO_InitStructure.GPIO_Pin = 0XFF;                                                 //PG端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                          //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                         //IO口速度為50MHz
GPIO_Init(GPIOG, &GPIO_InitStructure);                                                 //根據設定參數初始化GPIOG.0
GPIO_SetBits(GPIOG,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);                                                 //PG.0 輸出高

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;                //PE.0,PE.1,端口配置
GPIO_Init(GPIOE, &GPIO_InitStructure);                                                 //根據設定參數初始化GPIOE.0.1
GPIO_SetBits(GPIOE,GPIO_Pin_0|GPIO_Pin_1);                                 //PE.0.1 輸出高

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                                         //PA3端口配置
GPIO_Init(GPIOA, &GPIO_InitStructure);                                                 //根據設定參數初始化GPIOPA3
GPIO_SetBits(GPIOA,GPIO_Pin_3);                                                          //PA3 輸出高
        
}
void LCD1602_DB_IO_outputMode(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = 0XFF;                                                 //PG端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                          //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                         //IO口速度為50MHz
GPIO_Init(GPIOG, &GPIO_InitStructure);                                                 //根據設定參數初始化GPIOG.0
GPIO_SetBits(GPIOG,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);                                                 //PG.0 輸出高
        
}

void LCD1602_DB_IO_inputMode(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = 0XFF;                                                 //PG端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                  //上拉輸入
GPIO_Init(GPIOG, &GPIO_InitStructure);                                                 //根據設定參數初始化GPIOG.0
GPIO_SetBits(GPIOG,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);                                                 //PG.0 輸出高
        
}

void write_LCD1602_DB(uint8_t data)
{
        GPIO_Write(GPIOG,(uint16_t)data);
}

uint8_t read_LCD1602_DB(void)
{
        uint8_t value;
        value=(uint8_t)GPIO_ReadInputData(GPIOG);
        return value;
}

/* 等待液晶準備好 */
void LcdWaitReady()
{
    unsigned char sta;
                delay_us(1);

    LCD1602_RS = 0;
                delay_us(1);

    LCD1602_RW = 1;
                delay_us(1);

    do {
        LCD1602_E = 1;
                delay_us(1);

                LCD1602_DB_IO_inputMode();
                sta = read_LCD1602_DB();
                LCD1602_DB_IO_outputMode();        
                delay_us(1);

        LCD1602_E = 0;
                delay_us(1);

    } while (sta & 0x80);         //bit7等于1表示液晶正忙,重復檢測直到其等于0為止
}
/* 向LCD1602液晶寫入一字節命令,cmd-待寫入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
                delay_us(1);

    LcdWaitReady();
                delay_us(1);

    LCD1602_RS = 0;
                delay_us(1);

    LCD1602_RW = 0;
                delay_us(1);

    write_LCD1602_DB(cmd);
                delay_us(1);

    LCD1602_E  = 1;
                delay_us(1);

    LCD1602_E  = 0;
                delay_us(1);

}

/* 向LCD1602液晶寫入一字節數據,dat-待寫入數據值 */
void LcdWriteDat(unsigned char dat)
{
                delay_us(1);

    LcdWaitReady();
                delay_us(1);

    LCD1602_RS = 1;
                delay_us(1);

    LCD1602_RW = 0;
                delay_us(1);

    write_LCD1602_DB(dat);
                delay_us(1);

    LCD1602_E  = 1;
                delay_us(1);

    LCD1602_E  = 0;
                delay_us(1);

}
/* 設置顯示RAM起始地址,亦即光標位置,(x,y)-對應屏幕上的字符坐標 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
    unsigned char addr;
   
        if (y >= 2)                                                           //說明我們想顯示在右半屏
    {
        y -= 2;
        x += 8;                                                        //那么x就得往右挪動8個漢字了
    }
    addr = y*16 + x;                                        //現在這個是以一個漢字為單位,這里所有所說的漢字為單位的意思是16*16
                                                                                //由起始DDRAM地址連續寫入字符串                                 
                                                                                //addr的值是所有的漢字后面的地址,也是漢字為單位,即ddram也是以漢字為單位的
    LcdWriteCmd(0x30);                                         //啟動DDRAM操作
    LcdWriteCmd(0x80|addr);                                //設置ram地址
}
/* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */
void LcdShowStr(unsigned char row, unsigned char column, unsigned char *str)
{
        unsigned char n=0,a;
        unsigned char *fore_str;
    LcdSetCursor(column, row);                   //設置起始地址
    while (*str != '\0')                                  //連續寫入字符串數據,直到檢測到結束符
    {
               
                if((n+1)%2==0)                                        //奇數地址
                {
                        fore_str=str-1;
                        if(*fore_str>0x80)
                        {
                                LcdWriteDat(*str++);
                        }
                        else if(*str>0x80)
                                LcdWriteDat(' ');
                        else if(*str<=0x80)
                                LcdWriteDat(*str++);
                }                        
                else
                        LcdWriteDat(*str++);                  //先取str指向的數據,然后str自加1
                n++;

                if((n+2*column)%16==0)
                {
                        a=(n+2*column)/16;
                        if(row==0)
                        {
                        if(a==1)
                                LcdWriteCmd(0x90);
                        if(a==2)
                                LcdWriteCmd(0x88);
                        if(a==3)
                                LcdWriteCmd(0x98);
                        if(a==4)
                                LcdWriteCmd(0x80);
                        }

                        if(row==1)
                        {
                        if(a==1)
                                LcdWriteCmd(0x88);
                        if(a==2)
                                LcdWriteCmd(0x98);
                        if(a==3)
                                LcdWriteCmd(0x80);
                        if(a==4)
                                LcdWriteCmd(0x90);
                        }        

                        if(row==2)
                        {
                        if(a==1)
                                LcdWriteCmd(0x98);
                        if(a==2)
                                LcdWriteCmd(0x80);
                        if(a==3)
                                LcdWriteCmd(0x90);
                        if(a==4)
                                LcdWriteCmd(0x88);
                        }        

                        if(row==3)
                        {
                        if(a==1)
                                LcdWriteCmd(0x80);
                        if(a==2)
                                LcdWriteCmd(0x90);
                        if(a==3)
                                LcdWriteCmd(0x88);
                        if(a==4)
                                LcdWriteCmd(0x98);
                        }        


        
                }
    }
}/* 初始化1602液晶 */
void InitLcd1602()
{
    LcdWriteCmd(0x38);  //16*2顯示,5*7點陣,8位數據接口
    LcdWriteCmd(0x0C);  //顯示器開,光標關閉
    LcdWriteCmd(0x06);  //文字不動,地址自動+1
    LcdWriteCmd(0x01);  //清屏
}




/*
* 函數名:LcdShowImage
* 描  述:在顯示屏上顯示一幅圖像
* 輸  入:img - 待顯示圖像指針
*         x - 屏幕顯示橫坐標(以像素為單位)
*         y - 屏幕顯示縱坐標(以像素為單位)
*         w - 圖像寬度(以像素為單位)
*         h - 圖像高度(以像素為單位)
* 輸  出:無
* 備  注:x與w必須是16的整數倍,因CGRAM最小尋址單位為2字節;y與h可為0-63的任意值。
*/

//經過我的不斷測試,y和h的值也是可以取到64,而且顯示漢字,也得取到16而不是15,那么來說,是多少像素高度,這里就填多少
void LcdShowImage(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t *img)
{
    uint16_t i;
    uint8_t xi,yi;
    uint8_t xt,yt;

    x >>= 4;
    w >>= 3;
    i = 0;
    LcdWriteCmd(0x36); //啟動CGRAM操作
        
    for (yi=0; yi<h; yi++)
    {
        yt = y+yi;
        xt = x;
        if (yt >= 32)
        {
            yt -= 32;
            xt += 8;
        }
        LcdWriteCmd(0x80|yt);
        LcdWriteCmd(0x80|xt);
        for (xi=0; xi<w; xi++)
        {
            LcdWriteDat(img[i++]);
        }
    }
}

/*
* 函數名:LcdClearArea
* 描  述:清除屏幕上的一塊圖形顯示區域
* 輸  入:x - 區域起始橫坐標(以像素為單位)
*         y - 區域起始縱坐標(以像素為單位)
*         w - 區域寬度(以像素為單位)
*         h - 區域高度(以像素為單位)
* 輸  出:無
* 備  注:x與w必須是16的整數倍,因CGRAM最小尋址單位為2字節;y與h可為0-63的任意值。
*/


//記住,繪圖模式時候屏幕默認有亂點顯示的數據的,需要我們先調用這個函數后面才能正常顯示

void LcdClearArea(uint8_t x, uint8_t y, uint8_t w, uint8_t h)
{
    uint8_t xi,yi;
    uint8_t xt,yt;

    x >>= 4;
    w >>= 3;
    LcdWriteCmd(0x36);                         //啟動CGRAM操作
    for (yi=0; yi<h; yi++)
    {
        yt = y+yi;
        xt = x;
        if (yt >= 32)
        {
            yt -= 32;
            xt += 8;
        }
        LcdWriteCmd(0x80|yt);
        LcdWriteCmd(0x80|xt);
        for (xi=0; xi<w; xi++)
        {
            LcdWriteDat(0x00);         //寫入0x00以清除顯示
        }
    }
}

主函數main()中這樣調用即可:

void main()
{
        LCD12864IO_Init(void);
        // 為什么驅動函數會出現1602的字樣,因為這個LCD12864的驅動程序我是從1602液晶屏移植過來的,
        // 只是忘記改了名字而已,就這樣吧
        InitLcd1602(void);
        LcdShowStr(1,1,"hello 你好");
        while(1);
回復

使用道具 舉報

板凳
ID:829985 發表于 2020-11-9 20:56 | 只看該作者
在LCD12864.c中弄一個.h文件,在主程序中調用就行,
回復

使用道具 舉報

地板
ID:235954 發表于 2020-11-10 16:48 | 只看該作者
數據口和通信口
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩视频精品在线 | 免费黄色成人 | 国产亚洲精品久久久久久豆腐 | 欧美精品一区二区三区在线播放 | 国产综合久久久久久鬼色 | 国产精品成人在线观看 | 美女一级a毛片免费观看97 | a在线免费观看视频 | 福利一区在线观看 | 成人免费福利视频 | 日韩成人| 韩国理论电影在线 | 国产黄色大片在线免费观看 | 久久久久久久久蜜桃 | 色爱综合网 | 综合在线视频 | 欧美日韩精品综合 | 久热m3u8 | 在线观看免费福利 | 在线观看视频中文字幕 | 久久男人 | 亚洲一区二区三区四区av | 一区二区三区四区在线视频 | 久久久久久久一区二区 | 五月婷婷在线视频 | 欧美日韩精选 | 国产羞羞视频在线观看 | 久久久.com| 亚洲视频一区二区三区四区 | 欧美日韩精品一区二区三区蜜桃 | 日韩二区 | 日韩成人一区二区 | 伊人伊人网 | 最新伦理片| 亚洲欧美在线一区 | 91日韩在线| 91视频在线观看 | 黄网免费| 国产精品国产成人国产三级 | 日本成人三级电影 | 欧美日韩第一页 |