找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2895|回复: 3
收起左侧

12864液晶屏显示问题

[复制链接]
ID:58003 发表于 2013-12-18 20:28 | 显示全部楼层 |阅读模式
为什么我用proteus仿真后效果是这样的

1、 LCD12864显示驱动程序
//--------------------------LCD_12864.c-------------------------
//        名称 :12864LCD显示驱动程序(不带字库)
//-----------------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_DB_PORT P0          // 液晶数据线端口DB0-DB7
#define LCD_START_ROW 0xc0         //起始行命令
#define LCD_PAGE 0xB8                 //         页指令
#define LCD_COL  0x40                 //          列指令
bit Reverse_Display=0;//是否反相显示(白底黑字/黑底白字)
//液晶引脚定义
sbit DI=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit CS1=P2^3;
sbit CS2=P2^4;
sbit RST=P2^5;
//---------------------------------------------------------------
//        检查LCD是否忙
//--------------------------------------------------------------
bit LCD_IS_BUSY()
{
          LCD_DB_PORT=0xFF;
        RW=1;
        _nop_();
        DI=0;
        E=1;
        _nop_();
        E=0;
        return (bit)(P0&0x80);
}
//---------------------------------------------------------------
//        向LCD写入一个字节(一般用于发送命令)
//--------------------------------------------------------------
void Write_Byte_To_LCD(uchar comand)
{
   while(LCD_IS_BUSY());  
   LCD_DB_PORT=0xFF;
   RW=0;
   _nop_();
   DI=0;
   LCD_DB_PORT=comand;
   E=1;
   _nop_();
   E=0;
}
//---------------------------------------------------------------
//        向LCD写入数据
//--------------------------------------------------------------
void Write_Data_To_LCD(uchar dat)
{
   while(LCD_IS_BUSY());  
   LCD_DB_PORT=0xFF;
   RW=0;
   _nop_();
   DI=1;
   if(!Reverse_Display)           //根据Reverse_Display决定是否反相显示
       LCD_DB_PORT=dat;
   else
      LCD_DB_PORT=~dat;
   E=1;
   _nop_();
   E=0;
}
//---------------------------------------------------------------
//        初始化LCD
//--------------------------------------------------------------
void LCD12864_Initialization()
{
  CS1=1;
  CS2=1;
  Write_Byte_To_LCD(0x38);
  Write_Byte_To_LCD(0x0F);
  Write_Byte_To_LCD(0x01);
  Write_Byte_To_LCD(0x06);
  Write_Byte_To_LCD(LCD_START_ROW);
}
//---------------------------------------------------------------
//        通用显示函数  从第P页第L列显示W个字节数据,具体显示的数据在r所指的数组中
//--------------------------------------------------------------
void LCD_Show(uchar P,uchar L,uchar W,uchar *r) reentrant
{
    uchar i;
        if(L<64)
                  {
                    CS1=1;
                CS2=0;
                        Write_Byte_To_LCD(LCD_PAGE+P);
                        Write_Byte_To_LCD(LCD_COL+L);
                        if(L+W<64)
                          {
                            for(i=0;i<W;i++)
                                   Write_Data_To_LCD(r);
                          }
                        else
                          {
                            for(i=0;i<64-L;i++)
                                          Write_Data_To_LCD(r);
                                CS1=0;
                    CS2=1;
                                Write_Byte_To_LCD(LCD_PAGE+P);
                            Write_Byte_To_LCD(LCD_COL);
                                for(i=64-L;i<W;i++)
                                          Write_Data_To_LCD(r);
                          }
                   }
        else
          {
                    CS1=0;
            CS2=1;
                        Write_Byte_To_LCD(LCD_PAGE+P);
                    Write_Byte_To_LCD(LCD_COL+L-64);
                        for(i=0;i<W;i++)
                                  Write_Data_To_LCD(r);
          }
}
//---------------------------------------------------------------
// 显示一个8×16点阵字符
//--------------------------------------------------------------
void Display_char(uchar P1,uchar L1,uchar *M) reentrant
{
   LCD_Show(P1,L1,8,M);
   LCD_Show(P1+1,L1,8,M+8);
}
//--------------------------------------------------------------------
// 显示一个16×16点阵字符 (汉字上半部分与下半部分分别处在相邻两页中)
//----------------------------------------------------------------------
void Display_Word(uchar P2,uchar L2,uchar *M) reentrant
{                                                                                         
   LCD_Show(P2,L2,16,M);
   LCD_Show(P2+1,L2,16,M+16);
}


QQ图片20131218142240.jpg
回复

使用道具 举报

ID:1 发表于 2013-12-19 00:21 | 显示全部楼层
打了 汉字补丁没有?
回复

使用道具 举报

ID:1 发表于 2013-12-19 00:50 | 显示全部楼层
本站有keil汉字补丁下载 你搜索一下
回复

使用道具 举报

ID:153199 发表于 2017-1-8 16:14 | 显示全部楼层

本站有keil汉字补丁
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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