找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1439|回复: 3
打印 上一主题 下一主题
收起左侧

单片机+12864可以字库显示文字,但显示不出图像,求帮看一下程序。

[复制链接]
跳转到指定楼层
楼主
ID:789174 发表于 2021-1-1 16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10黑币
#include "reg51.h"         
#include "intrins.h"

#define LCD_DB  P0         //LCD12864显示数据接口定义
typedef unsigned char u8;
typedef unsigned int u16;

sbit LCD_RS=P3^7;         //定义LCD12864使用的IO口
sbit LCD_RW=P3^6;
sbit LCD_EN=P3^5;
sbit DSdat=P3^4;

void display();
void clrgdram(void);
         
code char dis[]={
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0X00,0X00,0X1F,0XFC,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XE0,0X00,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFE,0X0F,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XBF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XFF,0X8F,0XFF,0XFF,0XFE,0X3F,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XFC,0X03,0XFF,0XFF,0XF0,0X07,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XF8,0X00,0XFF,0XFF,0XE0,0X07,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XF8,0X00,0X3F,0XFF,0X80,0X03,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XFC,0X00,0X7F,0XFF,0XC0,0X07,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XFC,0X01,0XFF,0XFF,0XF0,0X0F,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X07,0XFF,0X07,0XFF,0XFF,0XFC,0X1F,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X07,0XFF,0XC7,0XFF,0XFF,0XF8,0X7F,0XFC,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X03,0XFF,0XE1,0XFF,0X1F,0XF1,0XFF,0XF8,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0XFF,0XF8,0X7C,0X0F,0XC3,0XFF,0XE0,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X7F,0XFE,0X10,0X03,0X0F,0XFF,0XC0,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0X00,0X00,0X3F,0XFF,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X7E,0X00,0X00,0X07,0XFF,0XC0,0X00,0X7F,0XFC,0X00,0X00,0X0F,0X80,0X00,
0X00,0X07,0XFF,0XF0,0X00,0X63,0XFF,0XF0,0X01,0XFF,0XF0,0XC0,0X01,0XFF,0XFC,0X00,
0X00,0X3F,0XFF,0XFC,0X01,0XF8,0XFF,0XF8,0X07,0XFF,0XE3,0XF0,0X07,0XFF,0XFF,0X00,
0X00,0X7F,0XFF,0XFF,0X07,0XFC,0X3F,0XFE,0X0F,0XFF,0X87,0XFC,0X1F,0XFF,0XFF,0XC0,
0X01,0XFF,0XFF,0XFF,0XDF,0XFF,0X1F,0XFF,0XBF,0XFE,0X1F,0XFE,0X7F,0XFF,0XFF,0XE0,
0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0X07,0XFF,0XFF,0XFC,0X1F,0XFF,0XFF,0XFF,0XFF,0XF0,
0X03,0XFF,0X81,0XFF,0XFF,0XFC,0X01,0XFF,0XFF,0XF0,0X07,0XFF,0XFF,0XE0,0X3F,0XF8,
0X07,0XFF,0X00,0X7F,0XFF,0XF0,0X00,0XFF,0XFF,0XC0,0X01,0XFF,0XFF,0XC0,0X1F,0XF8,
0X07,0XFE,0X00,0X1F,0XFF,0XC0,0X00,0X3F,0XFF,0X80,0X00,0XFF,0XFF,0X00,0X0F,0XF8,
0X07,0XFE,0X00,0X1F,0XFF,0XC0,0X00,0X3F,0XFF,0X80,0X00,0XFF,0XFF,0X00,0X0F,0XF8,
0X03,0XFF,0X00,0X7F,0XFF,0XF0,0X00,0XFF,0XFF,0XE0,0X01,0XFF,0XFF,0XC0,0X1F,0XF8,
0X03,0XFF,0X81,0XFF,0XFF,0XFC,0X03,0XFF,0XFF,0XF8,0X07,0XFF,0XFF,0XF0,0X7F,0XF8,
0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0X07,0XFF,0XFF,0XFC,0X1F,0XFF,0XFF,0XFF,0XFF,0XF0,
0X00,0XFF,0XFF,0XFF,0X8F,0XFE,0X1F,0XFF,0X3F,0XFF,0X1F,0XFE,0X7F,0XFF,0XFF,0XE0,
0X00,0X7F,0XFF,0XFE,0X03,0XFC,0X7F,0XFE,0X0F,0XFF,0XC7,0XF8,0X1F,0XFF,0XFF,0XC0,
0X00,0X1F,0XFF,0XFC,0X01,0XF0,0XFF,0XF8,0X07,0XFF,0XE1,0XE0,0X07,0XFF,0XFF,0X00,
0X00,0X07,0XFF,0XE0,0X00,0X43,0XFF,0XE0,0X01,0XFF,0XF8,0XC0,0X00,0XFF,0XF8,0X00,
0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XC0,0X00,0X7F,0XFC,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0X00,0X00,0X3F,0XFF,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X7F,0XFC,0X30,0X03,0X0F,0XFF,0XC0,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X01,0XFF,0XF8,0XFC,0X0F,0XC3,0XFF,0XE0,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X03,0XFF,0XE1,0XFF,0X3F,0XF1,0XFF,0XF8,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X07,0XFF,0X87,0XFF,0XFF,0XF8,0X7F,0XFC,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XFF,0X07,0XFF,0XFF,0XFC,0X1F,0XFC,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XFC,0X01,0XFF,0XFF,0XF0,0X0F,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X1F,0XF8,0X00,0X7F,0XFF,0XC0,0X07,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X1F,0XF8,0X00,0X7F,0XFF,0X80,0X03,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XF8,0X00,0XFF,0XFF,0XE0,0X07,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XFC,0X03,0XFF,0XFF,0XF0,0X0F,0XFE,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0F,0XFF,0X9F,0XFF,0XFF,0XFE,0X7F,0XFC,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFC,0X0F,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XF8,0X03,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XE0,0X00,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X07,0XFE,0X00,0X00,0X1F,0XFC,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};

void delay_12864(u16 del)                //LCD12864延时函数
{
u16 i;
for(i = 0; i < del; i++);
}
/***********************************************************************/
/**********12864初始化********************************************/
/***********************************************************************/
u8 busy()                           //忙判断函数
{
   u8 s;
   LCD_RS=0;                                
   LCD_RW=1;
   LCD_EN=1;
   delay_12864(50);
   s=P0;
   delay_12864(50);
   LCD_EN=0;
   return s;
}

void LCD_write_command(u8 command)          //LCD12864写指令函数
{
while((busy()&&0x80)==0x80);
LCD_EN=0;
LCD_RS=0;         //写指令
LCD_RW=0;         //写入
LCD_DB=command;//赋值给D0-D7对应的IO引脚
delay_12864(50);
LCD_EN=1;          //允许
delay_12864(50);  
LCD_EN=0;
}

void LCD_write_data(u8 dat)                        //LCD12864写数据函数
{
while((busy()&&0x80)==0x80);
LCD_EN=0;
LCD_RS=1;          //写数据
LCD_RW=0;          //写入
LCD_DB=dat;//赋值给D0-D7对应的IO引脚
delay_12864(50);
LCD_EN=1;           //允许
delay_12864(50);
LCD_EN=0;
}

void LCD_init(void)                                //初始化LCD12864显示设置函数
{
DSdat=1;
delay_12864(10000);
LCD_write_command(0x30);//功能设置
delay_12864(20);
LCD_write_command(0x30);//功能设置
delay_12864(20);
LCD_write_command(0x0c);//显示开关控制
delay_12864(20);
LCD_write_command(0x01);//显示清除
delay_12864(120);
LCD_write_command(0x06);//显示清除
delay_12864(50);
}


void clrgdram(void)                // 清整个GDRAM空间
{
    char i,j;
    LCD_write_command(0x34);
    LCD_write_command(0x34);
   for(j=0;j<32;j++)
   {
   LCD_write_command(0x80+j);
   LCD_write_command(0x80);
    for(i=0;i<16;i++)
   {
        LCD_write_data(0x00);
          }
          }  
   for(j=0;j<32;j++)
   {
   LCD_write_command(0x80+j);
   LCD_write_command(0x88);
         for(i=0;i<16;i++)
   {
        LCD_write_data(0x00);
          }
          }                                 
         LCD_write_command(0x36);
         LCD_write_command(0x30);
         }
/*************************************************************************/


/**************************************************************************/


void LCD_SHOW1(char*p)                  //图形显示函数
{

   char i,j;
   clrgdram();
    LCD_write_command(0x34);
    LCD_write_command(0x34);
   for(j=0;j<32;j++)
   {
   LCD_write_command(0x80+j);
   LCD_write_command(0x80);
    for(i=0;i<16;i++)
   {
        LCD_write_data(*p);
            p++;
          }
          }  
   for(j=0;j<32;j++)
   {
   LCD_write_command(0x80+j);
   LCD_write_command(0x88);
         for(i=0;i<16;i++)
   {
        LCD_write_data(*p);
            p++;
          delay_12864(10);
          }
          }                                 
         LCD_write_command(0x36);
         LCD_write_command(0x30);
         }


void main()                        //主函数
{                        
  LCD_init();
while(1)               
{            
             LCD_SHOW1(dis);

}  
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2021-1-3 11:16 | 只看该作者
是仿真运行还是加载程序到实物运行?液晶屏是哪一类?根据液晶屏的参数、命令和时序调整程序就可以了
回复

使用道具 举报

板凳
ID:390416 发表于 2021-1-3 11:51 | 只看该作者
看我发达贴子,里面有最好的资料:http://www.51hei.com/bbs/dpj-200462-1.html
回复

使用道具 举报

地板
ID:517466 发表于 2021-1-3 12:03 | 只看该作者
看你的代码,估计设置图形模式没有生效的结果。我这里的代码是经过实机测试过的。注意函数setGraphMode

/********************************************************************
* 名称 : TransferData()
* 功能 : 传送数据或者命令
* 输入 : data1 - 传送的数据或者指令
*        DI    - 当DI=0是,传送命令,当DI=1,传送数据.
* 输出 : 无
***********************************************************************/
void TransferData(char data1,bit DI) {
        WRD=0;
        RS=DI;
        delay(1);
        P2=data1;
        E=1;
        delay(1);
        E=0;
}

/********************************************************************
* 名称 : setGraphMode()
* 功能 : 设置LCD显示图片模式
* 输入 : 无
* 输出 : 无
***********************************************************************/
void setGraphMode(void) {
        delay(40);             //大于40MS的延时程序
        PSB=1;                 //设置为8BIT并口工作模式
        delay(1);              //延时
        RES=0;                 //复位
        delay(1);              //延时
        RES=1;                 //复位置高
        delay(10);
       
        TransferData(0x36,0);  //Extended Function Set RE=1: extended instruction
        delay(100);            //大于100uS的延时程序
        TransferData(0x36,0);  //Extended Function Set:RE=1: extended instruction set
        delay(37);             ////大于37uS的延时程序
        TransferData(0x3E,0);  //EXFUNCTION(DL=8BITS,RE=1,G=1)
        delay(100);            //大于100uS的延时程序
        TransferData(0x01,0);  //CLEAR SCREEN
        delay(100);            //大于100uS的延时程序
}

/********************************************************************
* 名称 : DisplayGraphic()
* 功能 : 显示图形数据
* 输入 : adder - 图形数据首地址
* 输出 : 无
***********************************************************************/
void DisplayGraphic(unsigned char code *adder)
{

   int i,j;
   // 显示上半屏内容设置
   for(i=0;i<32;i++) {
      TransferData((0x80 + i),0); // 设置垂直开始地址
      TransferData(0x80,0);       // 设置水平开始地址
      for(j=0;j<16;j++) {
         TransferData(*adder,1);
         adder++;
       }
    }          
   
   // 显示下半屏内容设置
   for(i=0;i<32;i++) {
      TransferData((0x80 + i),0); // 设置垂直开始地址
      TransferData(0x88,0);       // 设置水平开始地址
      for(j=0;j<16;j++) {
         TransferData(*adder,1);
         adder++;
       }
    }
}

// 图片数据,16*64个字节的数据,对应于128*64个像素点
unsigned char code pic2[]= {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
......
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x2E,
};
实际显示图片时,执行以下代码
setGraphMode();            //调用LCD显示图片(扩展)初始化程序
DisplayGraphic(pic2);  //显示图片2

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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