打印

1602显示程序 求帮忙

[复制链接]
5448|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
knight700|  楼主 | 2010-5-20 08:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^7;
sbit RS=P2^5;

void delay(uint z)
{
   int x,y;
    for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}

void write_com(uchar com)
{
   RS=0;
   P0=com;
   delay(5);
   E=1;
   delay(5);
   E=0;
}

void write_data(uchar date)
{
  RS=0;
  P0=date;
  delay(5);
  E=1;
  delay(5);
  E=0;
}

void init()
{
   E=0;
   write_com(0x38);
   write_com(0x0c);
   write_com(0x06);
   write_com(0x01);
   write_com(0x80);
}

void main()
{
   init();
   while(1);
}

不知道为什么总是显示第一行都是方块 不知道程序那里错了 或者连接的问题 希望哪位达人帮帮我  谢谢 调试了 一晚上无果

相关帖子

沙发
hcfatjh| | 2010-5-20 11:41 | 只看该作者
1 写命令,写数据都是RS==0,明显不对.
2 上电时液晶要延时一段时间才能初始化,因为可能电压上升没到5V单片机工作了液晶还没工作
3 如果不读忙的话.每个命令之间延时长一点吧;

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
knight700 + 1
板凳
ningling_21| | 2010-5-20 12:00 | 只看该作者
应该还有个 RW 信号,是否被遗忘了?

使用特权

评论回复
地板
thanksgiving| | 2010-5-20 15:34 | 只看该作者
应该还有个 RW 信号,是否被遗忘了?
ningling_21 发表于 2010-5-20 12:00


他RW可能一直是0。

使用特权

评论回复
5
brief110| | 2010-5-20 22:32 | 只看该作者
我觉得一楼分析的很对

使用特权

评论回复
6
CYJMCU| | 2010-5-20 23:01 | 只看该作者
以下是我当年设计的希望能给你一些启发                                                                                                                                                        <<        电子闹钟程序 > >   
//                                                                                                                                                          程序作者:08级电气智能自动控制技术专业----赵永建    CYJMCU@HOTMAIL.COM
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code tablehige[]="   2010-01-01";
uchar code tabledown[]="    00:00:00";
sbit        rs=P3^7;
sbit        en=P3^6;
void delay(uint);
void keyscan();
void init();
void com(uchar);  
void date(uchar date);
void autowritetime(uchar add,uchar time);
void autowritedate(uchar add,uchar date1);
char num,sec,min,hour,day,month,year;
uint count,key1num;
sbit        key1=P0^7;       
sbit        key2=P0^6;
sbit        key3=P0^5;
sbit        keyrs=P0^4;

//======================================================================================================================
void main()         //主程序
{
        init();
        while(1)
        {
                keyscan();
        }
}
//===========================================================================================================================
void delay(uint x)                        //延时程序
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=110;j>0;j--);
}
//-===================================================
void init()            //上电初始化
{
        en=0;
        com(0x38);//设置16*2显示,5*7点阵,8位数据接口
        com(0x0e);//设置  开显示 、显示光标
        com(0x06);//设置  当读或写一个字符后地址指针加1,且光标加一 ;
                                //当写一个字符时,整屏显示左移(N=1)或右移(N=0),得到光标不动而屏幕移动的效果
        com(0x01);//显示清0,数据指针清0       
//--------------
        com(0x80);//将数据指针定位到第一行第一个字处
        for(num=0;num<13;num++)                                                                //  上半部分显示为        日期    年:月:日
                {
                        date(tablehige[num]);
                        delay(50);
                }
//-------------------------------
        com(0x80+0x40);
        for(num=0;num<12;num++)
                {
                        date(tabledown[num]);                                                                //显示下半部分为        具体时间        时:分:秒
                        delay(50);
                }       
        TMOD=0x01;
        TL0=(65536-50000)/256;   //定时器中断
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
//=============================================================
void com(uchar com)        //控制初始化子程序
{
        rs=0;
        P2=com;               
        delay(5);
        en=1;
        delay(5);
        en=0;
}
//========================================================
void date(uchar date)        //数据初始化子程序
{
        rs=1;
        P2=date;
        delay(5);
        en=1;
        delay(5);
        en=0;
}


//===============================================================
void time() interrupt 1            
{
        TH0=(65536-50000)/256;                                         //中断子程序
        TL0=(65536-50000)/256;
        count++;
                if(count==18)//*****************************  time min
                        {
                                sec++; //秒
                                count=0;
       
                //----------------------------
                                if(sec==60)
                                        {
                                                sec=0;
                                                min++;  //分
                               
                                //-----------------------
                                                if(min==60)
                                                        {
                                                                min=0;
                                                                hour++; //时
                                                       
                                                                if(hour==24)
                                                                        {
                                                                                hour=0;
                                                                                day++;  //日
                                                                                if(day==31)
                                                                                        {
                                                                                                day=0;
                                                                                                month++;     //月
                                                                                                if(month==12)
                                                                                                {
                                                                                                        month=0;
                                                                                                        year++;              //年
                                                                                                        autowritedate(5,year);   // year auto write**
                                                                                                }
                                                                                        autowritedate(8,month); //  month auto write **        
                                                                                        }
                                                                                autowritedate(11,day);         // day auto write **                                                                                       
                                                                        }
                                                                autowritetime(4,hour);   //  hour auto write
                                                        }
                                                autowritetime(7,min);      //   min auto write
                                        }
                                autowritetime(10,sec);         // sec auto write       
                       
                        }
}
//=======================================================
void autowritetime(uchar add,uchar time)
{
        uchar shi,ge;                                                                        //下行时间        数据,地址自动写入程序
        shi=time/10;
        ge=time%10;
        com(0x80+0x40+add);
        date(0x30+shi);
        date(0x30+ge);
}
//==================================================================
                                                                //          上行   月,日 数据地址自动写入程序           //
void autowritedate(uchar add,uchar date1)
{       
        uchar yue,ri;
        yue=date1/10;
        ri=date1%10;
        com(0x80+add);
        date(0x30+yue);
        date(0x30+ri);

}       
//======================================================
                                        /*按键扫描程序段*/
void keyscan()
{
        keyrs=0;
        if(key1==0)
        {
                delay(5);
                if(key1==0)     //KEY1选定需要调节的时间
                {
                        key1num++;
                        while(!key1);
                        TR0=0;
                        com(0x80+0x40+11); //当前光标闪烁位置为 秒 调节
                        com(0x0f);         //主要是使光标闪烁
                }
//-----------------------------------------------
                if(key1num==2)
                {
                        com(0x80+0x40+8);        //当前光标闪烁位置为 分   
                }
//-----------------------------------------
                if(key1num==3)
                {
                        com(0x80+0x40+5);        //当前光标闪烁位置为  时
                }
//---------------------------------------------------
                if(key1num==4)
                {
                        com(0x80+12);   //当前光标闪烁位置为  日
                }
                if(key1num==5)
                {
                        com(0x80+9);      //当前光标闪烁位置为   月
                }
                if(key1num==6)
                {
                        com(0x80+6);     //当前光标闪烁位置为  年
                }
                if(key1num==7)
                {
                        key1num=0;
                        com(0x0c);                        //光标停止闪烁
                        TR0=1;      //定时器启动
                }
        }
        if(key1num!=0)
        {
                        //数字递增按键 KEY2//
                if(key2==0)                       
                delay(5);
                if(key2==0)
                {
                        while(!key2);
                        if(key1num==1)
                        {
                                sec++;
                                if(sec==60)
                                sec=0;
                                autowritetime(10,sec);     //秒  ++
                                com(0x80+0x40+10);
                        }
                        if(key1num==2)
                        {
                                min++;
                                if(min==60)
                                min=0;
                                autowritetime(7,min);        //分  ++
                                com(0x80+0x40+7);
                        }
                        if(key1num==3)
                        {
                                hour++;
                                if(hour==24)
                                hour=0;
                                autowritetime(4,hour);        //时   ++
                                com(0x80+0x40+4);
                        }
                        if(key1num==4)
                        {
                                day++;
                                if(day==31)
                                day=1;
                                autowritedate(11,day);     // 日  ++
                                com(0x80+12);
                        }       
                        if(key1num==5)
                        {
                                month++;
                                if(month==13)
                                month=1;
                                autowritedate(8,month); //月  ++
                                com(0x80+8);
                        }
                        if(key1num==6)
                        {
                                year++;
                                if(year==99)
                                year=00;
                                autowritedate(5,year);     // 年 ++
                                com(0x80+5);
                        }
                }
//---------------------------------------------
                                        //递减功能按键 KEY3//
                if(key3==0)
                delay(5);
                if(key3==0)
                {
                        while(!key3);       
                        if(key1num==1)
                        {
                                sec--;
                                if(sec==-1)
                                sec=59;
                                autowritetime(10,sec);
                                com(0x80+0x40+10);
                        }
                        if(key1num==2)
                        {
                                min--;
                                if(min==-1)
                                min=59;
                                autowritetime(7,min);    //分    - -
                                com(0x80+0x40+7);
                        }
                        if(key1num==3)
                        {
                                hour--;
                                if(hour==-1)               //时  - -
                                hour=23;
                                autowritetime(4,hour);
                                com(0x80+0x40+4);
                        }
                        if(key1num==4)
                        {
                                day--;
                                if(day==0)
                                day=31;
                                autowritedate(11,day);       // 日  - -
                                com(0x80+11);
                        }
                        if(key1num==5)
                        {
                                month--;
                                if(month==0)
                                month=12;
                                autowritedate(8,month); // 月  - -
                                com(0x80+8);
                        }
                        if(key1num==6)
                        {
                                year--;
                                if(year==00)
                                year=99;
                                autowritedate(5,year);     //年 - -
                                com(0x80+5);
                        }       
                                                                                  
                }               

        }

}
//==========================================================================================================================


  
//程序说明:核心CPU选为STC89C52,控制1602液晶屏显示时间及其一些功能!!!
//           key1:功能键                                 key2:增加         key3:减少
//      
//
//
//
//
//程序作者 :      08级电气自动化专业     赵永建
//                                年:year                        月:month                日:day                时:hour                分:min                秒:sec
CYJMCU@HOTMAIL.COM

当年我设计的闹钟 利用1602液晶屏显示的闹钟

使用特权

评论回复
7
brief110| | 2010-5-20 23:08 | 只看该作者
把write_data里的rs=0;改成等于一就可以了  我在实验板上调试过了

使用特权

评论回复
8
knight700|  楼主 | 2010-5-24 09:01 | 只看该作者
请问你是什么板子哈 是买的郭天祥的板子吗?

使用特权

评论回复
9
knight700|  楼主 | 2010-5-24 09:02 | 只看该作者
请问你是什么板子哈 是买的郭天祥的板子吗? 7# brief110

使用特权

评论回复
10
woshi217| | 2010-5-28 11:04 | 只看该作者
写数据里的rs应该为1,规范点的话初始化中把rw设为0。

使用特权

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

本版积分规则

0

主题

15

帖子

1

粉丝