打印

12864显示出问题,51单片机

[复制链接]
2230|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zamely|  楼主 | 2012-7-13 19:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
12864显示是这样的,总是会重复一个图案,而下一个就不会显示了,这个到底是什么问题,要怎么解决呢?
代码如下:
#include <reg51.h>
#include <intrins.h>
#include <stdlib.h>  
#define uchar unsigned char
#define uint  unsigned int
/*  端口定义*/
#define LCD_data  P0             // 数据口
sbit LCD_RS  =  P3^5;            // 寄存器选择输入
sbit LCD_RW  =  P3^6;            //液晶读/ 写控制
sbit LCD_EN  =  P3^4;            // 液晶使能控制
sbit LCD_PSB =  P3^7;            // 串/ 并方式控制
sbit wela    =  P2^7;
sbit dula    =  P2^6;
uchar dis1[10];   
uchar code dis2[] = {0x02,0x03,0x04,0x05,0x06,0x07,'\0'};
uchar code dis3[] = {"我爱你你没的大富科技阿娇"};
uchar code dis4[] = {"--------"};
void delay_1ms(uint x)   
{  
uint i,j;   
for(j=0;j<x;j++)   
for(i=0;i<110;i++);  
}   
/*******************************************************************/
/*                                                                 */
/* 写指令数据到 LCD                                                  */
/*RS=L,RW=L ,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void write_cmd(uchar cmd)
{                           
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = cmd;
delay_1ms(5);
    LCD_EN = 1;
delay_1ms(5);
    LCD_EN = 0;   
}
/*******************************************************************/
/*                                                                 */
/* 写显示数据到 LCD                                                  */
/*RS=H ,RW=L ,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void write_dat(uchar dat)
{                           
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delay_1ms(5);
    LCD_EN = 1;
delay_1ms(5);
    LCD_EN = 0;   
}
/*********************************************************/
/*                                                       */
/*  设定显示位置                                          */
/*                                                       */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{                           
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
      pos = X+Y ;     
   write_cmd(pos);     //显示地址
}
/*******************************************************************/            
/*初始化设置                                                         
/*******************************************************************/
void lcd_init()
{  
    LCD_PSB = 1;         //并口方式   
    write_cmd(0x30);      // 基本指令操作
    delay_1ms(5);
    write_cmd(0x0c);      // 显示开,关光标
    delay_1ms(5);
    write_cmd(0x01);      // 清除LCD 的显示内容
    delay_1ms(5);
}
/*********************************************************/
/*              
/*  主程序                    
/*                                                       */
/*********************************************************/
void main()
{
    uchar i;
    wela=0;
     dula=0;
    delay_1ms(10);                 //延时
    lcd_init();                     //初始化 LCD  
        write_cmd(0x80);
    for(i=0;i<8;i++)
    {                           
             //设置显示位置为第二行的第 1 个字符
    write_dat(0x01+i);      //显示字符
    }
    while(1);
}

相关帖子

沙发
chen3bing| | 2012-7-13 21:11 | 只看该作者
1.硬件问题。
2.时序问题。

使用特权

评论回复
板凳
wukunshan| | 2012-7-13 21:51 | 只看该作者
去我的博客看看吧,哪里有详细的12864驱动代码,保证你找到答案。

使用特权

评论回复
地板
NE5532| | 2012-7-13 21:54 | 只看该作者
没看懂楼主的描述,请楼主再配两张清晰点的图片和描述来看下。

使用特权

评论回复
5
ningling_21| | 2012-7-13 22:49 | 只看该作者
void write_data_lcd(uchar dat)
{
        uchar dly;
       
//        lcd_rw=0;
        lcd_di=1;
        P0=dat;
        dly=4;
        while(dly--);
        lcd_en=1;
        dly=6;
        while(dly--);
        lcd_en=0;
        dly=4;
        while(dly--);               
}

void write_comm_lcd(uchar comm)
{
        uchar dly;
       
//        lcd_rw=0;
        lcd_di=0;
        P0=comm;
        dly=4;
        while(dly--);
        lcd_en=1;
        dly=6;
        while(dly--);
        lcd_en=0;
        dly=4;
        while(dly--);
}

使用特权

评论回复
6
zamely|  楼主 | 2012-7-14 13:56 | 只看该作者
5# ningling_21
效果是一样的,这段代码是郭天祥上的,应该没问题,我的液晶是s6b0108的,他的是st7920,不知道这个会影响么?

使用特权

评论回复
7
ningling_21| | 2012-7-14 19:09 | 只看该作者
5# ningling_21
效果是一样的,这段代码是郭天祥上的,应该没问题,我的液晶是s6b0108的,他的是st7920,不知道这个会影响么?
zamely 发表于 2012-7-14 13:56

那肯定有影响了,搞清楚再问吧...

使用特权

评论回复
8
zamely|  楼主 | 2013-2-2 11:45 | 只看该作者
结果是我的P0^0口开路了,所以有些字符会出现大1的效果~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

75

帖子

1

粉丝