4758866 发表于 2016-9-19 09:09:48

初次玩12864部分显示乱码,高手分析一下问题出在哪里?

本帖最后由 4758866 于 2016-9-19 09:52 编辑






//液晶屏型号:JLX12864G-086-PC-3S
//接口:串行
//中文字库:带中文字库 IC:JLX-GB2312,竖置横排
//驱动 IC:UC1701X(与 ST7565R 兼容)
//主板:89C516-001 老主板
//单片机:51 系列
//版权所有:深圳市晶联讯电子有限公司:网址http://www.jlxlcd.cn;
//编程:叶建人,2013 年 10 月 11 日   
#include <REGX52.H>
#include <intrins.h>
sbit lcd_sclk=P0^0; //接口定义:lcd_sclk 就是 LCD 的 SCLK
sbit lcd_sid=P0^1;   //接口定义:lcd_sid 就是 LCD 的 SDA
sbit lcd_rs=P0^2;    //接口定义:lcd_rs 就是 LCD 的 RS,也叫“CD”
sbit lcd_reset=P0^3;//接口定义:lcd_reset 就是 LCD 的 RESET
sbit lcd_cs1=P0^4;   //接口定义:lcd_cs1 就是 LCD 的 CS1
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
code unsigned char Zf816_0[]={
                0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,};//0
code unsigned char Zf816_1[]={   
          0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
       0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,};//1
code unsigned char Zf816_2[]={
    0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x00,0x00,0x00,};//2
code unsigned char Zf816_3[]={
    0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,};//3
code unsigned char Zf816_4[]={
    0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0x00,0x00,0x00,};//4
code unsigned char Zf816_5[]={
    0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,};//5
code unsigned char Zf816_6[]={
    0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,};//6
code unsigned char Zf816_7[]={
    0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};//7
code unsigned char Zf816_8[]={
    0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x00,0x00,0x00,};//8
code unsigned char Zf816_9[]={
    0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0x00,0x00,0x00,};//9                                                                                    
code unsigned char Zf816_dian[]={
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,};//://10
code unsigned char Zf816_xian[]={
    0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0xFE,0x02,0x02,0xF2,0x02,0x02,0xFE,0x00,0x00,
    0x20,0x60,0x20,0x1F,0x10,0x90,0x40,0x23,0x18,0x06,0x01,0x7E,0x80,0x83,0xE0,0x00,};//现//11
code unsigned char Zf816_zai[]={
    0x08,0x08,0x88,0xC8,0x38,0x0C,0x0B,0x08,0x08,0xE8,0x08,0x08,0x08,0x08,0x08,0x00,
    0x02,0x01,0x00,0xFF,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x00,};//在//12
code unsigned char Zf816_shi[]={
    0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
    0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00,};//时//13
code unsigned char Zf816_jian[]={
    0x00,0xF8,0x01,0x06,0x00,0xF0,0x12,0x12,0x12,0xF2,0x02,0x02,0x02,0xFE,0x00,0x00,
    0x00,0xFF,0x00,0x00,0x00,0x1F,0x11,0x11,0x11,0x1F,0x00,0x40,0x80,0x7F,0x00,0x00,};//间//14

void delay(int n_ms)   //延时            
{
   int j,k;
   for(j=0;j<n_ms;j++)
   for(k=0;k<110;k++);
                           }

/*void delay_us(int n_us) //短延时               
{
   int j,k;
   for(j=0;j<n_us;j++)
   for(k=0;k<1;k++);
                        } */
                                                                                                       
void transfer_command_lcd(int data1) //写指令到 LCD 模块   
{
   char i;
   lcd_cs1=0;
   lcd_rs=0;
   for(i=0;i<8;i++)
   {
      lcd_sclk=0;
      if(data1&0x80)
                lcd_sid=1;
      elselcd_sid=0;
            lcd_sclk=1;
            data1=data1<<=1;
                      }
            lcd_cs1=1;
                              }
void transfer_data_lcd(int data1) //写数据到 LCD 模块
{
   char i;

   lcd_cs1=0;
   lcd_rs=1;
   for(i=0;i<8;i++)
{
       lcd_sclk=0;
   if(data1&0x80)
             lcd_sid=1;
   else lcd_sid=0;
       lcd_sclk=1;
       data1=data1<<=1;
                         }
       lcd_cs1=1;
                                 }

void initial_lcd( ) //LCD 模块初始化
{
   lcd_reset=0;       //低电平复位
   delay(100);
   lcd_reset=1;            //复位完毕
       
   delay(100);         
   transfer_command_lcd(0xe2);//软复位
   delay(5);
   transfer_command_lcd(0x2c);//升压步聚 1
   delay(50);
   transfer_command_lcd(0x2e);//升压步聚 2
   delay(50);
   transfer_command_lcd(0x2f);//升压步聚 3
   delay(5);
   transfer_command_lcd(0x23);//粗调对比度,可设置范围 0x20~0x27

   transfer_command_lcd(0x81);//微调对比度

   transfer_command_lcd(0x28);//微调对比度的值,可设置范围 0x00~0x3f
       
   transfer_command_lcd(0xa2);//1/9 偏压比(bias)

   transfer_command_lcd(0xc8);//行扫描顺序:从上到下

   transfer_command_lcd(0xa0);//列扫描顺序:从左到右

   transfer_command_lcd(0x40);//起始行:第一行开始

   transfer_command_lcd(0xaf);//开显示

                                                         }
void lcd_address(uint page,uint column) //设置页地址
{
   column=column-0x01;
   transfer_command_lcd(0xb0+page-1);   //设置页地址,每 8 行为一页,全屏共 64 行,被分成8页
   transfer_command_lcd(0x10+(column>>4&0x0f)); //设置列地址的高 4 位
   transfer_command_lcd(column&0x0f); //设置列地址的低 4 位   
                                                }

void clear_screen( ) //全屏清屏
{
   unsigned char i,j;
   for(i=0;i<9;i++)
       {
         transfer_command_lcd(0xb0+i);
         transfer_command_lcd(0x10);
         transfer_command_lcd(0x00);
         for(j=0;j<132;j++)
            {
            transfer_data_lcd(0x00);
                                        }
                                             }
                                                }

/*void display_128x64(uchar *dp) //显示 128x64 点阵图像
{
   uint i,j;
   for(j=0;j<8;j++)
{
       lcd_address(j+1,1);
       for (i=0;i<128;i++)
      {
         transfer_data_lcd(*dp);   //写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1
            dp++;
                        }
                              }
                                       } */

void display_graphic_16x16(uchar page,uchar column,uchar *dp) //显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标
{
   uint i,j;
   for(j=0;j<2;j++)
{
      lcd_address(page+j,column);
      for (i=0;i<16;i++)
      {
               transfer_data_lcd(*dp);   //写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1
               dp++;
                     }
                           }
                                     }

/*void display_graphic_8x16(uchar page,uchar column,uchar *dp) //显示 8x16 点阵图像、ASCII, 或 8x16 点阵的自造字符、其他图标
{
   uint i,j;
   for(j=0;j<2;j++)
{
   lcd_address(page+j,column);
   for (i=0;i<8;i++)
   {
         transfer_data_lcd(*dp);   //写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1
         dp++;
                }
                     }
                           } */

/*void display_graphic_5x8(uchar page,uchar column,uchar *dp) //显示 5X8 点阵图像、ASCII, 或 5x8 点阵的自造字符、其他图标
{
   uint i;
   lcd_address(page,column);
   for (i=0;i<6;i++)
    {
         transfer_data_lcd(*dp);
         dp++;
                           }
                                 } */
unsigned char *number_to_matrix(unsigned charucBitNumber)        //字模返回       
{
      unsigned char *p_ucAnyNumber;//此指针根据ucBitNumber数值的大小,分别调用不同的字库。

      switch(ucBitNumber)//根据ucBitNumber数值的大小,分别调用不同的字库。
      {
            case 0:
             p_ucAnyNumber=Zf816_0;
                     break;
            case 1:
             p_ucAnyNumber=Zf816_1;
                     break;
            case 2:
             p_ucAnyNumber=Zf816_2;
                     break;
            case 3:
             p_ucAnyNumber=Zf816_3;
                     break;
            case 4:
             p_ucAnyNumber=Zf816_4;
                     break;
            case 5:
             p_ucAnyNumber=Zf816_5;
                     break;
            case 6:
             p_ucAnyNumber=Zf816_6;
                     break;
            case 7:
             p_ucAnyNumber=Zf816_7;
                     break;
            case 8:
             p_ucAnyNumber=Zf816_8;
                     break;
            case 9:
             p_ucAnyNumber=Zf816_9;
                     break;
            case 10:
             p_ucAnyNumber=Zf816_dian;
                     break;
                              case 11:
             p_ucAnyNumber=Zf816_xian;
                     break;
                              case 12:
             p_ucAnyNumber=Zf816_zai;
                     break;
                              case 13:
             p_ucAnyNumber=Zf816_shi;
                     break;
                              case 14:
             p_ucAnyNumber=Zf816_jian;
                     break;
                       
      }
    return p_ucAnyNumber;//返回转换结束后的指针
}       

路过羊圈的狼 发表于 2016-9-19 09:17:29

建议贴程序。还有液晶资料。是集成了字库的液晶屏么?

4758866 发表于 2016-9-19 09:20:09

路过羊圈的狼 发表于 2016-9-19 09:17
建议贴程序。还有液晶资料。是集成了字库的液晶屏么?

无字库的,程序稍等更新楼主位

security 发表于 2016-9-19 09:47:48

既然已经可以显示出来,但不稳定,
那么我想多半是 总线时序过快的问题,
在总线操作适当加些延时(对照手册的时序要求),降低总线的速度,
试试看吧。

gliet_su 发表于 2016-9-19 15:36:32

送数太快了,慢一些。

bccuje_love 发表于 2016-9-19 15:58:56

定时,把
整个一下刷一下

runapp 发表于 2016-9-19 21:21:21

也可能是屏坏了?

4758866 发表于 2016-9-19 22:43:27

runapp 发表于 2016-9-19 21:21
也可能是屏坏了?

所有的都刷新就没有问题了

bbstr 发表于 2016-9-19 23:32:21

可能是iic时序被干扰了,写数据前先关闭中断,写完再恢复看看

4758866 发表于 2016-9-20 17:48:24

我现在是全屏刷新

ZHAOBAO511 发表于 2016-9-23 17:04:03

可以像中语言一样先用PROTEUS仿真一下,成了再写入单片机

a136498491 发表于 2016-9-23 21:41:31

你时钟别那么高

xintao 发表于 2016-9-24 11:11:45

a136498491 发表于 2016-9-23 21:41
你时钟别那么高

即然都显示出来了,做计也没啥大题了,
不稳定就按楼上说的试试吧,一个是调整通信速度,要满足手册中的要求,最好按推荐值去做;
如果怀疑屏有问题,就换个个屏再试试看。

ayumi8 发表于 2016-9-24 13:11:17

这个是SPI串口的吧 这种屏我也玩过也遇到过 偶尔会显示错位错误的时候
页: [1]
查看完整版本: 初次玩12864部分显示乱码,高手分析一下问题出在哪里?