打印
[STC单片机]

求大神指导这是哪个位置错了,怎么1602显示屏上全是ooooooooo

[复制链接]
1748|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gonglong|  楼主 | 2013-10-8 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gonglong 于 2013-10-8 22:12 编辑

#include<reg51.h>
unsigned char  table[]="dang pian ji";
sbit leden=P2^7;
sbit ledrs=P2^6;
sbit ledwr=P2^5;
void delay(unsigned int c)
{         
        unsigned int b;
        for(;c>0;c--)
        
                for(b=199;b>0;b--);
               
        
}
void writecom(unsigned char com)
{        
leden=0;
        ledrs=0;
        ledwr=0;
        P0=com;
        delay(1);
        leden=1;
        delay(1);
        leden=0;
               
}
void writedate(unsigned char date)
{
        leden=0;
        ledrs=1;
        ledwr=0;
        P0=date;
        delay(1);
        leden=1;
        delay(1);
        
        
}
void init()
{
    writecom(0x38);
        writecom(0x0c);
        writecom(0x06);
        writecom(0x01);
        writecom(0x80);

}                                          
void main()
{        unsigned int i;
        init();
        writecom(0x80);
        while(1)
        {
                for(i=0;i<12;i++)
                {
                        writedate(table);
                         delay(10);
                }
        }
}

相关帖子

沙发
南宫云明| | 2013-10-8 10:45 | 只看该作者
不管怎么看,table数组都越界了

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
gonglong + 1 很给力!
板凳
gonglong|  楼主 | 2013-10-8 14:04 | 只看该作者
南宫云明 发表于 2013-10-8 10:45
不管怎么看,table数组都越界了

有这个问题,当主要是主要是1602屏幕上没有显示出任何字符,好纠结额!

使用特权

评论回复
地板
opal11| | 2013-10-10 21:56 | 只看该作者
writedate(table[i]);

使用特权

评论回复
5
很忙| | 2013-10-11 08:33 | 只看该作者
writedate(table);
这个确实是问题。怎么这样用呢,同意楼上的。

使用特权

评论回复
6
ballack_linux| | 2013-10-11 11:50 | 只看该作者
这个是个明显的语法问题啊
writedate(table);
这样调用你传递的是数组的首元素的地址 ,地址实质上是一个指针,你把指针传递给一个普通变量,然后想直接访问数组的所有元素??这是不可能的
writedate(table[i]);这才是访问数组所有元素的正确用法

使用特权

评论回复
7
ningling_21| | 2013-10-11 12:56 | 只看该作者
没有指定显示字符的位置;
也没有判断LCD是不是在忙;

使用特权

评论回复
8
gonglong|  楼主 | 2013-10-15 16:23 | 只看该作者
ningling_21 发表于 2013-10-11 12:56
没有指定显示字符的位置;
也没有判断LCD是不是在忙;

请问要如何修正额!

使用特权

评论回复
9
gonglong|  楼主 | 2013-10-15 16:24 | 只看该作者
ballack_linux 发表于 2013-10-11 11:50
这个是个明显的语法问题啊
writedate(table);
这样调用你传递的是数组的首元素的地址 ,地址实质上是一个 ...

改过来了但还是无法显示出来,我用的stc90c51芯片

使用特权

评论回复
10
gonglong|  楼主 | 2013-10-15 16:28 | 只看该作者
ballack_linux 发表于 2013-10-11 11:50
这个是个明显的语法问题啊
writedate(table);
这样调用你传递的是数组的首元素的地址 ,地址实质上是一个 ...

确实,但是改过来了,还是无法显示

使用特权

评论回复
11
ningling_21| | 2013-10-15 21:38 | 只看该作者
gonglong 发表于 2013-10-15 16:23
请问要如何修正额!

/*************************************************************/
/*                                                           */
/*检查LCD忙状态                                              */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */
/*                                                           */
/*************************************************************/
static bit lcd_busy()
{                          
    bit result;     
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
        delayNOP();
        delayNOP();
        delayNOP();
    result = (bit)(LCD_DB_Port&0x80);
    LCD_EN = 0;
    return(result);
}

/*************************************************************/
/*                                                           */
/* LCD初始化设定                                             */
/*                                                           */
/*************************************************************/
void lcd_init()
{
    delay_nms(15);                //等待电源稳定   
    lcd_wcmd(LCD_MODE);      //设置显示模式
    delay_nms(5);
    lcd_wcmd(LCD_MODE);         
    delay_nms(5);
    lcd_wcmd(LCD_MODE);         
    delay_nms(5);
//    lcd_wcmd(0x0c);       //显示开,关光标
        lcd_wcmd(0x0c);                 //开光标
    delay_nms(5);
    lcd_wcmd(0x06);              //移动光标
    delay_nms(5);
    lcd_wcmd(0x01);              //清除LCD的显示内容
    delay_nms(5);
}


/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
#ifdef LCD_8DB
    LCD_DB_Port = cmd;
#endif
#ifdef LCD_4DB
LCD_DB_Port &= 0x0F;            //清高四位
LCD_DB_Port |= (cmd & 0xF0);    //送高四位
    delayNOP();
    LCD_EN = 1;        //上跳沿时输入数据
    delayNOP();
    LCD_EN = 0;
LCD_DB_Port &= 0x0F;            //清高四位
LCD_DB_Port |= (cmd << 4);      //送低四位
#endif
delayNOP();
    LCD_EN = 1;         //上跳沿时输入数据
    delayNOP();
        delayNOP();
        delayNOP();
        delayNOP();
    LCD_EN = 0;
       
        delay_nms(1);
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
gonglong + 1 很给力!
12
gonglong|  楼主 | 2013-10-15 21:55 | 只看该作者
ningling_21 发表于 2013-10-15 21:38
/*************************************************************/
/*                                 ...

#ifdef LCD_8DB
    LCD_DB_Port = cmd;
#endif
#ifdef LCD_4DB
LCD_DB_Port &= 0x0F;            //清高四位
LCD_DB_Port |= (cmd & 0xF0);    //送高四位
    delayNOP();
    LCD_EN = 1;        //上跳沿时输入数据
    delayNOP();
    LCD_EN = 0;
LCD_DB_Port &= 0x0F;            //清高四位
LCD_DB_Port |= (cmd << 4);      //送低四位
#endif
delayNOP();
    LCD_EN = 1;         //上跳沿时输入数据
    delayNOP();
        delayNOP();
        delayNOP();
        delayNOP();
    LCD_EN = 0;
        
        delay_nms(1);
我看有的程序上并没有分8位传输和4位传输,为什么这个位置必须要分才能显示额?

使用特权

评论回复
13
ballack_linux| | 2013-10-16 01:01 | 只看该作者
给你一个我STC89C52测试成功的代码 。你看看
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^2;
sbit lcdrs=P2^0;
sbit dula=P2^6;
sbit wela=P2^7;
uchar i;
uchar code table[]="I love China!" ;
uchar code table1[]="Me too.";
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void init()
{
        dula=0;
        wela=0;
        lcden=0;
}               
void write_lcd(uchar com,bit j)
{
        lcdrs=j;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}       
void display_lcd(bit y,uchar x,uchar value)
{
        x&=0x0f;
        if(y)
        {
                 x+=0x40;
        }
        x+=0x80;
        write_lcd(x,0);
        write_lcd(value,1);

}
void main()
{
        init();       
        write_lcd(0x38,0);                         //        显示模式设置
        write_lcd(0x0c,0);                         // 显示开/关及光标设置                                                            
        write_lcd(0x01,0);                         // 使用前先将数据指针和所有显示清零

        for(i=0;i<13;i++)
        {
                display_lcd(0,i,table[i]);
                delay(5);
        }
        for(i=0;i<7;i++)
        {
                display_lcd(1,i+9,table1[i]);
                delay(5);
        }
        while(1);                                                 //使显示固定
}       

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
gonglong + 1 很给力!
14
ningling_21| | 2013-10-16 12:54 | 只看该作者
gonglong 发表于 2013-10-15 21:55
#ifdef LCD_8DB
    LCD_DB_Port = cmd;
#endif

这个根据实际电路来选择,不是非要有所选择的

使用特权

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

本版积分规则

7

主题

17

帖子

1

粉丝