【毕设求教】【急】为什么我的仿真里12864没显示

2019-07-18 09:32发布

让人帮做了个实物,实物能完美运行所以代码应该没问题,但是仿真里的12864就是没显示,大神帮我看一下是不是我12864接的不对。。。
仿真运行图 仿真运行图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
温柔以待
1楼-- · 2019-07-19 04:29
融稔 发表于 2016-5-24 14:21
得看看你的程序

#include "reg52.h"
#include "typedef.h"
#include "delay.h"
#include "12864.h"

sbit LCD_CLK = P0^5;
sbit LCD_SID = P0^6;
sbit LCD_CS  = P0^7;



xdata uchar LCD_Buf[64]=0;
uchar SparkF = 0;    //闪烁开关
uchar SparkA = 0;    //闪烁缓存地址
uchar SparkL = 1;    //闪烁长度默认1
uchar LCD_RefFlag = 0;

void LCD_Write_Byte(uchar Data)  //往12864写一个字节
{
  uchar i;
  for(i=0;i<8;i++)
  {
    LCD_CLK = 0;      //时钟拉低
    if(Data & 0x80)
    { LCD_SID = 1;  }
    else
    { LCD_SID = 0; }
    LCD_CLK = 1;         //时钟拉高,传入1bit数据
    Data = Data<<1;   //数据左移一位
  }
}





void LCD_Write_Command(uchar COMMAND)  //写控制命令
{
  LCD_CS = 1;
  LCD_Write_Byte(SENDCOMM);   
  LCD_Write_Byte(COMMAND & 0XF0);  //写入高四位
  LCD_Write_Byte((COMMAND << 4) & 0XF0);    //写入低四位
  LCD_CS = 0;
}

void LCD_Write_Data(uchar Data)     //写数据
{
  LCD_CS = 1;
  LCD_Write_Byte(SENDDATA);   
  LCD_Write_Byte(Data & 0XF0);  //写入高四位
  LCD_Write_Byte((Data << 4)&0XF0);    //写入低四位
  LCD_CS = 0;
}

void LCD_XY(uchar x,uchar y)  //设置显示位置    X(1~16),Y(1~4)
{
  switch(y)
  {
    case 1:LCD_Write_Command(0X7F+x);break;
    case 2:LCD_Write_Command(0X8F+x);break;
    case 3:LCD_Write_Command(0X87+x);break;
    case 4:LCD_Write_Command(0X97+x);break;
    default: break;
  }
}

void LCD_Init(void)
{
  Delay_1ms(100);  
  LCD_Write_Command(0x34);//一次送8位数据
  LCD_Write_Command(0x30);//基本操作指令
  LCD_Write_Command(0x0C);//整体显示,游标off,
  LCD_Write_Command(0x01);//清屏
  Delay_1ms(100);
  LCD_Clr();
}



//void Display_Char(uchar x,uchar y, uchar Char)
//{
//  uchar add = 2*(x-1)+16*(y-1);
//  LCD_Buf[add]=Char;
//  LCD_RefFlag = 1;
//}

void Display_String(uchar x,uchar y,uchar *string)
{
  uchar add = 2*(x-1)+16*(y-1);
  LCD_RefFlag = 0;
  while(*string!='')
  {
    LCD_Buf[add]=*string;
        add++;
        string++;
  }
  LCD_RefFlag = 1;
}


//void Display_u8(uchar x,uchar y,uchar num)
//{
//  uchar buff[4]=0;
//       
//        buff[0]=num / 100 +'0';
//        buff[1]=num%100/10 +'0';
//        buff[2]=num%10+'0';
//        buff[3]='';
//        if(buff[0]=='0')
//        {
//          buff[0]=' ';
//          if(buff[1]=='0')
//            buff[1]=' ';
//        }
//        Display_String(x,y,buff);
//}



void LCD_TimeDis(uchar x,uchar y,uchar *time) //[0][1][2] 时分秒
{
  uchar add = 2*(x-1)+16*(y-1);
  LCD_RefFlag = 0;
  LCD_Buf[add+0] = time[0] /10 +'0';
  LCD_Buf[add+1] = time[0] %10 +'0';
  LCD_Buf[add+2] = ':';
  LCD_Buf[add+3] = time[1] /10 +'0';
  LCD_Buf[add+4] = time[1] %10 +'0';
  LCD_Buf[add+5] = ':';
  LCD_Buf[add+6] = time[2] /10 +'0';
  LCD_Buf[add+7] = time[2] %10 +'0';         
  LCD_RefFlag = 1;
}

void LCD_WeekDis(uchar x,uchar y,uchar week)
{
  switch(week)
  {
    case 1:{  Display_String(x,y,"星期一");  }break;
        case 2:{  Display_String(x,y,"星期二");  }break;
        case 3:{  Display_String(x,y,"星期三");  }break;
        case 4:{  Display_String(x,y,"星期四");  }break;
        case 5:{  Display_String(x,y,"星期五");  }break;
        case 6:{  Display_String(x,y,"星期六");  }break;
        case 7:{  Display_String(x,y,"星期日");  }break;
        default:{ Display_String(x,y,"      ");  }break;
  }
}

void LCD_DateDis(uchar x,uchar y,uchar *Date) //[0][1][2 年月日
{
  uchar add = 2*(x-1)+16*(y-1);
  LCD_RefFlag = 0;
  Display_String(x+2,y,"年");
  Display_String(x+4,y,"月");
  Display_String(x+6,y,"日");

/*--------------年份----------------------*/  
  LCD_Buf[add] = '2';
  LCD_Buf[add+1] = '0';
  LCD_Buf[add+2] = Date[0] /10 +'0';
  LCD_Buf[add+3] = Date[0] %10 +'0';
/*--------------月份----------------------*/
  LCD_Buf[add+6] = Date[1] /10 +'0';
  LCD_Buf[add+7] = Date[1] %10 +'0';         
/*--------------日期----------------------*/
  LCD_Buf[add+10] = Date[2] /10 +'0';
  LCD_Buf[add+11] = Date[2] %10 +'0';         
  LCD_RefFlag = 1;
}



void LCD_Clr(void)
{
  uchar i = 0;
  LCD_RefFlag = 0;
  for(i=0;i<64;i++)
  {
    LCD_Buf=0x20;
  }
  LCD_RefFlag = 1;   
}



void LCD_Ref(void)   //更新12864显示缓存
{
  uchar i = 0;
  uchar j=0;
  LCD_XY(1,1);
  LCD_RefFlag = 0;
  for(i=0;i<64;i++)
  {
        if(i==16)
       LCD_XY(1,2);
        else if(i==32)
       LCD_XY(1,3);
        else if(i==48)
       LCD_XY(1,4);
        LCD_Write_Data(LCD_Buf);
  }
  LCD_RefFlag = 1;
}
这是12864的程序
融稔
2楼-- · 2019-07-19 04:52
你的仿真图和下面那个原理图接线不一样啊。。。连接12864的I/O口都没一致。特别是CS,SID,SCLK,你按照下面那个图接线就好了
chenan1212
3楼-- · 2019-07-19 09:27
 精彩回答 2  元偷偷看……
chenan1212
4楼-- · 2019-07-19 12:15
你程序里的液晶的传输方式是串行,你仿真用的是并行的

一周热门 更多>