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

QQ登錄

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

搜索
查看: 4823|回復(fù): 0
收起左側(cè)

51單片機(jī)LCD12864任意表情包顯示(附有工程代碼)

[復(fù)制鏈接]
ID:684968 發(fā)表于 2020-6-6 17:01 | 顯示全部樓層 |閱讀模式
51hei圖片20200606165026.png 51hei圖片20200606165017.png
本工程主要介紹了基于51單片機(jī)的LCD12864的顯示驅(qū)動(dòng)(字符,數(shù)字,圖片,漢字,表情包),以及介紹完成表情包在LCD12864中顯示的過(guò)程
主要借用了兩個(gè)工具Image2LCD,和PCtoLCD,其中前者用于對(duì)表情包圖片文件進(jìn)行輸出,后者用于取模。
附有如下工程源碼和工程文件。
#include "reg51.h"
#include <intrins.h>
#include "source.h"
//宏定義
#define databyte P1
//位定義
sbit RST=P2^0;    //復(fù)位信號(hào),低電平有效
sbit E=P2^1;  //讀寫(xiě)使能,高電平有效,下降沿鎖定數(shù)據(jù)
sbit RW=P2^2; //讀寫(xiě)選擇:1讀,0寫(xiě)
sbit RS=P2^3 ;//數(shù)據(jù)/指令選擇:1數(shù)據(jù)寫(xiě)入RAM
sbit CS2=P2^4;    //片選2,低電平有效(后64列)
sbit CS1=P2^5;     //前64列
sbit BF=P1^7;//DB7    忙/不忙

//函數(shù)聲明
void delay_ms(int n);
void LCD_Change();
void LCD_Init();
void LCD_busy();
void LCD_WriteCmd(unsigned char cmd);
void LCD_WriteData(unsigned char dat);
void LCD_Open(unsigned char flag);
void LCD_CS(int flag);
void LCD_Clear();
void LCD_SetPage(unsigned char page);
void LCD_SetLine(unsigned char line);
void LCD_SetRow(unsigned char row);
void LCD_Reset();
void display_hz( int page,int line_local ,int row_locol,unsigned char  s ,unsigned char code *p);
//void set_xy(unsigned char x,unsigned char y);
void display_zf( int page ,int line_local ,int row_locol, unsigned char  s ,unsigned char code *p);
void display_img( unsigned char code *p,bit c);
void display_img_1( unsigned char code *p,bit c) ;
//主函數(shù)
void main()                     
{     
     LCD_Init();
    LCD_Clear();
    while(1)
    {

    display_img(dog2,1);
//    LCD_Change() ;
//    display_img_1(horse,1);
//    LCD_Change() ;
   
    }

    while(1);   
}
void delay_ms( int n)
{   
     int i,j;
     for(i = 0;i<n;i++)
    {
         for(j = 0;j<120;j++);
    }
}
//LCD初始化
void LCD_Init()
{
    LCD_Reset();
    LCD_CS(3);
    LCD_Open(0);
    LCD_SetPage(0);
    LCD_SetLine(0);
    LCD_SetRow(0);
    LCD_Open(1);
}

// 檢測(cè)忙
void LCD_busy()   
{
    unsigned char a;
    RW=1;
    RS=0;
    E=1;//讀出忙標(biāo)志(BF)準(zhǔn)備
    while(1)
    {
        E=0;//讀出忙標(biāo)志(BF)就緒
        if(!(databyte&0x80))//讀取忙信號(hào)
            break;//不忙跳出
        E=1;
        a++;
        if(a>10)//防止死循環(huán)
            break;
    }

}
//寫(xiě)命令
void LCD_WriteCmd(unsigned char cmd)
{
    LCD_busy() ;//檢測(cè)忙/不忙
    RW=0; //讀寫(xiě)選擇:0寫(xiě)
    RS=0; //數(shù)據(jù)/指令選擇:指令
    databyte=cmd ;
    E=1;
    _nop_()    ;
    E=0;  //讀寫(xiě)使能   
}
//寫(xiě)數(shù)據(jù)
void LCD_WriteData(unsigned char dat)
{
    LCD_busy() ;//檢測(cè)忙/不忙
    RW=0; //讀寫(xiě)選擇:0寫(xiě)
    RS=1; //數(shù)據(jù)/指令選擇:數(shù)據(jù)
    databyte=dat ;
    E=1;
    _nop_();   
    E=0;  //讀寫(xiě)使能
}
//設(shè)置開(kāi)關(guān)顯示(1開(kāi),0關(guān))
void LCD_Open(unsigned char flag)
{
    LCD_busy() ;//檢測(cè)忙/不忙
    E=1;
    RW=0;RS=0;
    if(flag)
        databyte=0x3F;
    else
        databyte = 0x3E;
    E=0;
}
//片選信號(hào)選通
//0:不選通
//1:選通CS1
//2:選通CS2
//3:同時(shí)選通
void LCD_CS(int flag)
{
    switch(flag)
    {
        case 0:    CS1=1;CS2=1;break;
        case 1:    CS1=0;CS2=1;break;
        case 2:    CS1=1;CS2=0;break;
        case 3:    CS1=0;CS2=0;break;
    }
}
//清屏
void LCD_Clear()
{
    int i,j;
    LCD_CS(3)  ;
    for(i=0;i<8;i++)
    {
        LCD_SetPage(i)    ;
        LCD_SetRow(0)  ;
        for(j=0;j<64;j++)
        {
            LCD_WriteData(0);        
        }
    }
}
//設(shè)置頁(yè)地址 (P0^1-P0^2      0-7)
void LCD_SetPage(unsigned char page)
{
    page=((page&0x07)|0xB8); //10111xxx
    LCD_WriteCmd(page);
}
//設(shè)置行地址 (P0^1-P0^5      0-63)
void LCD_SetLine(unsigned char line)
{
    line =((line&0x3F)|0xC0);  // 11xxxxxx
    LCD_WriteCmd(line);
}
//設(shè)置列地址 (P0^1-P0^5      0-63)
void LCD_SetRow(unsigned char row)
{
    row =((row&0x3F)|0x40);  // 11xxxxxx
    LCD_WriteCmd(row);
}
//復(fù)位
void LCD_Reset()
{
    RST = 0;
    _nop_();
    RST=1;
    _nop_();
    LCD_Open(1);   
}

//void set_xy(unsigned char x,unsigned char y)//x為行,y為列
//{
//    if(y>=64)//列地址大于等于64時(shí)右屏顯示
//    {
//        LCD_CS(1);
//        y=y-64;
//    }
//    else//列地址小于64時(shí)左屏顯示
//    {
//        LCD_CS(2);
//    }
//    LCD_WriteCmd(0x40|y);//寫(xiě)列地址
//    _nop_();
//    //line=x;
//    LCD_WriteCmd(0xb8|x);//寫(xiě)行地址
//}
//顯示漢字:頁(yè)(0,2,4,6),行(0),列(0-64),數(shù)組中第n個(gè),數(shù)組地址
void display_hz( int page ,int line_local ,int row_locol, unsigned char  s ,unsigned char code *p)
{
    int i,j;
    int  x;
    int row,line;
    line = line_local;
    row = row_locol;
    if(row>=64)
    {
        LCD_CS(2);
        row-=64;
        x = 0x20*s;
        LCD_SetPage(page);
         LCD_SetLine(line);
        LCD_SetRow(row);
        for(i=0;i<2;i++)
        {
            for(j=0;j<16;j++)
            {
                LCD_WriteData(p[x]);
                x++;
                row++;
                   LCD_SetRow(row);
            }
            LCD_SetPage(page+1);
            row=row_locol;
        }

    }
    else
    {
        LCD_CS(1);
        x = 0x20*s;
        LCD_SetPage(page);
         LCD_SetLine(line);
        LCD_SetRow(row);
        for(i=0;i<2;i++)
        {
            for(j=0;j<16;j++)
            {
                LCD_WriteData(p[x]);
                x++;
                row++;
                   LCD_SetRow(row);
            }
            LCD_SetPage(page+1);
            row=row_locol;
        }
    }
}

//顯示字符:頁(yè)(0,2,4,6),行(0),列(0-64),數(shù)組中第n個(gè),數(shù)組地址
void display_zf( int page ,int line_local ,int row_locol, unsigned char  s ,unsigned char code *p)
{
    int i,j;
    int  x;
    int row,line;
    line = line_local;
    row = row_locol;
    if(row>=64)
    {
        LCD_CS(2);
        row-=64;
        x = 0x10*s;
        LCD_SetPage(page);
         LCD_SetLine(line);
        LCD_SetRow(row);
        for(i=0;i<2;i++)
        {
            for(j=0;j<8;j++)
            {
                LCD_WriteData(p[x]);
                x++;
                row++;
                   LCD_SetRow(row);
            }
            LCD_SetPage(page+1);
            row=row_locol;
        }

    }
    else
    {
        LCD_CS(1);
        x = 0x10*s;
        LCD_SetPage(page);
         LCD_SetLine(line);
        LCD_SetRow(row);
        for(i=0;i<2;i++)
        {
            for(j=0;j<8;j++)
            {
                LCD_WriteData(p[x]);
                x++;
                row++;
                   LCD_SetRow(row);
            }
            LCD_SetPage(page+1);
            row=row_locol;
        }
    }
}
//顯示圖片
void display_img( unsigned char code *p,bit c)
{
    int i,j;
    LCD_CS(1);
    for(j=0;j<8;j++)
    {
        LCD_SetPage(j);
        LCD_SetRow(0) ;
        for(i=0;i<64;i++)
        {   
            if(c)
                LCD_WriteData(p[118*j+i]);
            else
                LCD_WriteData(~p[118*j+i]);
        }
    }
    LCD_CS(2);
    for(j=0;j<8;j++)
    {
        LCD_SetPage(j);
        LCD_SetRow(0) ;
        for(i=64;i<118;i++)
        {   
            if(c)
                LCD_WriteData(p[118*j+i]);
            else
                LCD_WriteData(~p[118*j+i]);
        }
    }
}
void display_img_1( unsigned char code *p,bit c)
{
    int i,j;
    LCD_CS(1);
    for(j=0;j<8;j++)
    {
        LCD_SetPage(j);
        LCD_SetRow(0) ;
        for(i=0;i<64;i++)
        {   
            if(c)
                LCD_WriteData(p[128*j+i]);
            else
                LCD_WriteData(~p[128*j+i]);
        }
    }
    LCD_CS(2);
    for(j=0;j<8;j++)
    {
        LCD_SetPage(j);
        LCD_SetRow(0) ;
        for(i=64;i<128;i++)
        {   
            if(c)
                LCD_WriteData(p[128*j+i]);
            else
                LCD_WriteData(~p[128*j+i]);
        }
    }
}
//LCD切屏
void LCD_Change()
{
    delay_ms(1000);
    LCD_Clear();
    delay_ms(50);               
} LCD12864任意圖片.rar (6.75 MB, 下載次數(shù): 61)




評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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