找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4405|回复: 0
收起左侧

51单片机LCD12864任意表情包显示(附有工程代码)

[复制链接]
ID:684968 发表于 2020-6-6 17:01 | 显示全部楼层 |阅读模式
51hei图片20200606165026.png 51hei图片20200606165017.png
本工程主要介绍了基于51单片机的LCD12864的显示驱动(字符,数字,图片,汉字,表情包),以及介绍完成表情包在LCD12864中显示的过程
主要借用了两个工具Image2LCD,和PCtoLCD,其中前者用于对表情包图片文件进行输出,后者用于取模。
附有如下工程源码和工程文件。
#include "reg51.h"
#include <intrins.h>
#include "source.h"
//宏定义
#define databyte P1
//位定义
sbit RST=P2^0;    //复位信号,低电平有效
sbit E=P2^1;  //读写使能,高电平有效,下降沿锁定数据
sbit RW=P2^2; //读写选择:1读,0写
sbit RS=P2^3 ;//数据/指令选择:1数据写入RAM
sbit CS2=P2^4;    //片选2,低电平有效(后64列)
sbit CS1=P2^5;     //前64列
sbit BF=P1^7;//DB7    忙/不忙

//函数声明
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) ;
//主函数
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);
}

// 检测忙
void LCD_busy()   
{
    unsigned char a;
    RW=1;
    RS=0;
    E=1;//读出忙标志(BF)准备
    while(1)
    {
        E=0;//读出忙标志(BF)就绪
        if(!(databyte&0x80))//读取忙信号
            break;//不忙跳出
        E=1;
        a++;
        if(a>10)//防止死循环
            break;
    }

}
//写命令
void LCD_WriteCmd(unsigned char cmd)
{
    LCD_busy() ;//检测忙/不忙
    RW=0; //读写选择:0写
    RS=0; //数据/指令选择:指令
    databyte=cmd ;
    E=1;
    _nop_()    ;
    E=0;  //读写使能   
}
//写数据
void LCD_WriteData(unsigned char dat)
{
    LCD_busy() ;//检测忙/不忙
    RW=0; //读写选择:0写
    RS=1; //数据/指令选择:数据
    databyte=dat ;
    E=1;
    _nop_();   
    E=0;  //读写使能
}
//设置开关显示(1开,0关)
void LCD_Open(unsigned char flag)
{
    LCD_busy() ;//检测忙/不忙
    E=1;
    RW=0;RS=0;
    if(flag)
        databyte=0x3F;
    else
        databyte = 0x3E;
    E=0;
}
//片选信号选通
//0:不选通
//1:选通CS1
//2:选通CS2
//3:同时选通
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);        
        }
    }
}
//设置页地址 (P0^1-P0^2      0-7)
void LCD_SetPage(unsigned char page)
{
    page=((page&0x07)|0xB8); //10111xxx
    LCD_WriteCmd(page);
}
//设置行地址 (P0^1-P0^5      0-63)
void LCD_SetLine(unsigned char line)
{
    line =((line&0x3F)|0xC0);  // 11xxxxxx
    LCD_WriteCmd(line);
}
//设置列地址 (P0^1-P0^5      0-63)
void LCD_SetRow(unsigned char row)
{
    row =((row&0x3F)|0x40);  // 11xxxxxx
    LCD_WriteCmd(row);
}
//复位
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时右屏显示
//    {
//        LCD_CS(1);
//        y=y-64;
//    }
//    else//列地址小于64时左屏显示
//    {
//        LCD_CS(2);
//    }
//    LCD_WriteCmd(0x40|y);//写列地址
//    _nop_();
//    //line=x;
//    LCD_WriteCmd(0xb8|x);//写行地址
//}
//显示汉字:页(0,2,4,6),行(0),列(0-64),数组中第n个,数组地址
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;
        }
    }
}

//显示字符:页(0,2,4,6),行(0),列(0-64),数组中第n个,数组地址
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, 下载次数: 59)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表