juruqiang 发表于 2008-5-2 00:49:48

protues仿真出现黄色电平,到底是怎么回事!

有那位大虾看下,在仿真时,P0口和1602会出现黄色电平,而且1602无法正常显示,出现乱码.电路图如下(程序是从网上下的)
希望高手指点啊!!!!!
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_263490.jpg
(原文件名:p.jpg)


#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;

sbit speaker=P3^0;
sbit alarm=P2^4;

sbit clk=P3^6;
sbit io=P3^7;
sbit rst=P3^5;
sbit bit0=ACC^0;
sbit bit7=ACC^7;

sbit DQ=P2^3;

sbit set=P2^5;
sbit plus=P2^6;
sbit minus=P2^7;

uchar code lcdweek={0x53,0x75,0x6e,0x4d,0x6f,0x6e,0x54,0x75,0x65,0x57,
                                                0x65,0x64,0x54,0x68,0x75,0x46,0x72,0x69,0x53,0x61,0x74};
uchar code hr_mode_tab[]={0x02,0x03,0x00}; //am,pm,24
uchar data time_data={0x08,0x02,0x04,0x01,0x92,0x00,0x00};        //year,week,month,day,hr,min,sec       

bit flag,hr_7;
char ap24;

uchar data temperature[]={0x00,0x00};
uchar data temp_data[]={0x00,0x00,0x00,0x00};
uchar code dec_tab[]={0x30,0x31,0x31,0x32,0x33,0x33,0x34,0x34,
                  0x35,0x36,0x36,0x37,0x38,0x38,0x39,0x39};
bit negative;

char num=0;

uchar code disp1[]={"20--      "};       
uchar code disp2[]={"::      .C"};
uchar code mychar1[]={0x1d,0x15,0x17,0x00,0x07,0x04,0x1f,0x00};//24
uchar code mychar2[]={0x02,0x05,0x02,0x00,0x00,0x00,0x00,0x00};       //*
uchar code mychar3[]={0x00,0x04,0x04,0x07,0x04,0x04,0x1f,0x00};       //上
uchar code mychar4[]={0x00,0x1f,0x04,0x06,0x05,0x04,0x04,0x00};       //下


void delay(uint z)
{
        while( --z);
}

//--------------------1302--------------------
write(uchar dat)                               //写一字节子程序
{
        uchar i;
        ACC=dat;
        rst=1;
        for(i=8;i>0;i--)
        {
                io=bit0;
                clk=0;
                clk=1;               
                ACC>>=1;          
        }               
}

read()                                                          //读一字节子程序
{
        uchar i;
        rst=1;
        for(i=8;i>0;i--)
        {
                ACC>>=1;
                io=1;       
                clk=1;
                clk=0;       
                bit7=io;
        }
}

write_1302(uchar com,uchar num)                   //向1302写一数据子程序
{
        clk=0;
        rst=0;
        write(com);       
        write(num);       
        rst=0;
        clk=1;
}

uchar read_1302(uchar com)                                //从1302读一数据子程序
{
        clk=0        ;
        rst=0;
        write(com);               
        read();                       
        rst=0;
        clk=1;
        return ACC;
}

read_time()                                                               //从1302读出:年/周/月/日/时/分/秒        子程序
{
       uchar i,j=0x8d,k=0;
       for(i=7;i>0;i--)
       {
               time_data=read_1302(j);
               j-=2;
       }       
}

hr_mode()
{
       hr_7=(bit)(time_data&0x80);

       if(hr_7)                                                //12
       {
               if(time_data&0x20)                //pm
                        ap24=1;
                else
                        ap24=0;                                        //am
       }

       else
               ap24=2;                                                //24
}

write_time()                                                       //写入1302:年/周/月/日/时/分/秒        子程序
{
       uchar i,j=0x8c,k=0;
       for(i=7;i>0;i--)
       {
               write_1302(j,time_data);
               j-=2;
       }       
}
//---------------1602-----------------------------
bit busy()                                                //判断忙子程序
{
        bit result;
//        P0=0xff;
        _nop_();
        P0=0x00;
        rs=0;
        rw=1;
        en=0;
        _nop_();
        en=1;
        result=(bit)(P0&0x80);
        return result;       
}          

write_com(uchar com)              //写指令子程序
{
        while(busy())
        {
                en=0;_nop_();
                en=1;_nop_();
        };
        rs=0;
        rw=0;
        P0=com;          
        _nop_();   
        en=1;
        _nop_();
        en=0;

        delay(1);                               //防干扰
        rw=1;                                       //key_ready
        en=1;
}

write_dat(uchar dat)                          //写数据子程序
{
        while(busy())
        {
                en=0;_nop_();
                en=1;_nop_();
        };
        rs=1;
        rw=0;
        P0=dat;
        _nop_();       
        en=1;
        _nop_();
        en=0;
       
        delay(1);                               //防干扰
//        rw=1;                                       //key_ready
//        en=1;
}

write_cgram()
{       
    uchar i;
    write_com(0x40);            //写CGRAM
    for(i=0;i<8;i++)      
            write_dat(mychar1);
        for(i=0;i<8;i++)      
            write_dat(mychar2);
        for(i=0;i<8;i++)      
            write_dat(mychar3);
        for(i=0;i<8;i++)      
            write_dat(mychar4);      
}               

lcd_init()                           //初始化子程序
{   
        uchar i;                  
        en=0;                          
        write_com(0x38);            //1602,5*7点阵,8位数据
        write_com(0x0c);            //开显示,不显示光标,不闪烁光标
        write_com(0x06);            //写一个字符指针加一
        write_com(0x01);            //清屏

        write_com(0x80);               
        for(i=0;i<16;i++)
        {
                write_dat(disp1);       
        }
        write_com(0xc0);       
        for(i=0;i<16;i++)
        {
                write_dat(disp2);
        }
        write_com(0xce);                          //*
        write_dat(0x01);
}

/*------------------------------------------------------------------------*/

write_week()
{
        uchar temp,i;
        temp=time_data*3;                                                  //week
        for        (i=3;i>0;i--)
        {
                write_dat(lcdweek);
        }
}

disp_year()
{
        write_com(0x82);                                           //year
        write_dat(((time_data&0xf0)>>4)+0x30);
        write_dat((time_data&0x0f)+0x30);
}
disp_month()
{
        write_com(0x85);                                                //month
        write_dat(((time_data&0xf0)>>4)+0x30);
        write_dat((time_data&0x0f)+0x30);
}
disp_day()
{
        write_com(0x88);                                                //day
        write_dat(((time_data&0xf0)>>4)+0x30);
        write_dat((time_data&0x0f)+0x30);
}
disp_week()
{
        write_com(0x8b);                                                //week
        write_week();
}
disp_hr()
{
        write_com(0xc0);                                                //hr
        if(hr_7)
                write_dat(((time_data&0x10)>>4)+0x30);
        else
                write_dat(((time_data&0xf0)>>4)+0x30);
        write_dat((time_data&0x0f)+0x30);
}
disp_min()
{
        write_com(0xc3);                                                //min
        write_dat(((time_data&0xf0)>>4)+0x30);
        write_dat((time_data&0x0f)+0x30);
}
disp_sec()
{
        write_com(0xc6);                                                //sec
        write_dat(((time_data&0xf0)>>4)+0x30);
        write_dat((time_data&0x0f)+0x30);
}
disp_hr_mode()
{
        write_com(0x8f);                                                //hr_mode
        write_dat(hr_mode_tab);
}

display_time()
{
        disp_year();
        disp_month();
        disp_day();
        disp_week();
        disp_hr();
        disp_min();
        disp_sec();
        disp_hr_mode();
}
//--------------------------18b20----------------------
reset_18b20()                                   //复位子程序
{
   DQ=0;      //DQ拉低
   delay(60);   //延时大于480us

   DQ=1;       //DQ拉高
   delay(20);               //延时约130us完成复位

          DQ=1;               //释放总线
}

uchar read_18b20()                                //读一字节子程序
{
        uchar i=0,dat=0;
        for (i=8;i>0;i--)
        {
               DQ=0;
          dat>>=1;
          DQ=1;
       
          if(DQ)
                           dat|=0x80;
          delay(4);
        }
       
        DQ=1;

        return dat;
}

write_18b20(uchar dat)                           //写一字节子程序
{
        uchar i=0;
        for (i=8;i>0;i--)
        {
                DQ=0;
                DQ=dat&0x01;
                delay(5);
               
                DQ=1;
                dat>>=1;
        }
}

read_temp()
{
   reset_18b20();
   write_18b20(0xcc);// 跳过读序列号
   write_18b20(0x44);// 启动温度转换

   reset_18b20();
   write_18b20(0xcc);//跳过读序列号
   write_18b20(0xbe);//读取温度寄存器

   temperature = read_18b20();   //温度低8位
   temperature = read_18b20();   //温度高8位
}

disp_temp()
{       
        uchar temp;
/*-----------------------------------------------------------*/
        if(temperature&0xf0)                           //负温度判断(可省略)
        {
                negative=1;

                temperature=~temperature+1;
                if(temperature==0)
                        temperature=~temperature+1;
                else
                        temperature=~temperature;
        }
                       
/*-----------------------------------------------------------*/
        temp=temperature&0x0f;                       
        temp_data=dec_tab;   //查表得小数位的值
       
        temp=((temperature&0xf0)>>4)|((temperature&0x0f)<<4);

        temp_data=temp/100+0x30;                  
        temp_data=temp%100/10+0x30;
        temp_data=temp%100%10+0x30;
       

    if(temp_data==0x30)      //高位为0,不显示
        {
                temp_data=0x20;
/*-----------------------------------------------------------*/
                if(negative)                                //如为负温度,百位显示“-”
                {
                        temp_data=0x2d;
                        negative=0;                       
                }
/*-----------------------------------------------------------*/                              
                if(temp_data==0x30)      //次高位为0,不显示
                        temp_data=0x20;
        }

        write_com(0xc9);
            
        write_dat(temp_data);      //百位数显示
//        delay(125);                                                //1ms
                
        write_dat(temp_data);      //十位数显示
//        delay(125);
                   
        write_dat(temp_data);      //个位数显示
//        delay(125);
                   
        write_dat(0x2e);
//        delay(125);

        write_dat(temp_data);      //小数位数显示
}
//------------------keyscan--------------------------------------
key_scan()
{
        DQ=1;
        if(!DQ)
        {
                delay(12500);                        //100ms

                while(!DQ);

                num++;
                DQ=1;                       

                if(num==1)
                {
                        write_1302(0x8e,0x00); //WP=0
                        write_1302(0x80,0x80|time_data);        //CH=1
                        write_com(0x0f);                   //显光标,闪烁
                        write_com(0xc7);        //指针指向秒                       
//                        key_ready();
                }

                if(num==2)
                {
                        write_com(0xc4);//指针指向分
//                        key_ready();
                }

                if(num==3)
                {
                        write_com(0xc1);//指针指向时
//                        key_ready();
                }

                if(num==4)
                {
                        write_com(0x8d);//指针指向week
//                        key_ready();
                }

                if(num==5)
                {
                        write_com(0x89);//指针指向day
//                        key_ready();
                }

                if(num==6)
                {
                        write_com(0x86);//指针指向month
//                        key_ready();
                }

                if(num==7)
                {
                        write_com(0x83);//指针指向年
//                        key_ready();
                }
               
                if(num==8)                        //扩展功能此处应改为num==9
                {
                        write_com(0x8f);//指针指向apm
//                        key_ready();
                }                                       

                if(num==9)
                {
                        num=0;
                        write_com(0x0c);//不显示光标
                        write_time();
                        write_1302(0x80,time_data);        //CH=0                       
                        write_1302(0x8e,0x80); //WP=1                       
                }
                delay(12500);
        }


        if(num!=0)
        {
                if(!plus)
                {
                        delay(25000);
                        while(!plus);                       
                        if(num==1)                                           //sec
                        {
                                time_data+=1;

                                if((time_data&0x0f)==10)
                                {       
                                        time_data=(time_data&0xf0)+0x10;
                                        if(time_data==0x60)
                                                time_data=0x00;
                                }
                       
                                disp_sec();
                                write_com(0xc7);        //指针指向秒
//                                key_ready();                                       
                        }

                        if(num==2)                                                       //min
                        {
                                time_data+=1;

                                if((time_data&0x0f)==10)
                                {       
                                        time_data=(time_data&0xf0)+0x10;
                                        if(time_data==0x60)
                                                time_data=0x00;
                                }
                       
                                disp_min();
                                write_com(0xc4);//指针指向分
//                                key_ready();                               
                        }
                                                                                               
                        if(num==3)                                                       //hr
                        {                                                                       //12
                                time_data+=1;
                       
                                if(hr_7)
                                {                                       
                                        if((time_data&0x0f)==10)       
                                                time_data=(time_data&0xe0)+0x10;
       
                                        if((time_data&0x1f)>0x12)
                                                time_data=(time_data&0xe0)+0x01;
                               }

                               else                                                        //24
                               {
                                        if((time_data&0x0f)==10)       
                                                time_data=(time_data&0xf0)+0x10;
       
                                        if(time_data==0x24)
                                                time_data=0x00;
                               }

                                disp_hr();
                                write_com(0xc1);//指针指向时
//                                key_ready();
                        }
                       
                        if(num==4)                                                           //week
                        {
                                time_data+=1;
                                if(time_data==7)
                                        time_data=0;

                                disp_week();
                                write_com(0x8d);//指针指向week
//                                key_ready();
                        }
                       
                        if(num==5)                                                       //day
                        {
                                time_data+=1;

                                if((time_data&0x0f)==10)
                                        time_data=(time_data&0xf0)+0x10;

                                if(time_data==0x32)
                                        time_data=0x01;
                       
                                disp_day();
                                write_com(0x89);//指针指向day
//                                key_ready();
                        }
                       
                        if(num==6)                                                       //month
                        {
                                time_data+=1;

                                if((time_data&0x0f)==10)       
                                        time_data=0x10;

                                if((time_data&0x1f)==0x13)
                                        time_data=0x01;
                       
                                disp_month();
                                write_com(0x86);//指针指向month
//                                key_ready();
                        }
                       
                        if(num==7)                                           //year
                        {
                                time_data+=1;

                                if((time_data&0x0f)==10)
                                {                                       
                                        time_data=(time_data&0xf0)+0x10;
                                        if(time_data==0xa0)
                                                time_data=0x00;
                                }
                       
                                disp_year();
                                write_com(0x83);        //指针指向年
//                                key_ready();
                                       
                        }
/*---------------------------------------------------------------*/                               
                        if(num==8)                                           //ap24
                        {
                                ap24++;
                                if(ap24==3)                                        //24->am
                                {
                                        ap24=0;

                                        hr_7=1;

                                        if(time_data<=0x12)                       //00-11
                                        {                                       
                                                if(time_data==0)                       //00->12/am               
                                                        time_data=0x92;
                                               
                                                else
                                                        time_data|=0x80;
                                        }
                       
                                        else                                                       
                                        {                                                                                               
                                                time_data-=0x12;
                               
                                                if((time_data&0x0f)>0x09)
                                                        time_data-=0x06;
                               
                                                time_data|=0x80;
                                        }
                                }
                               
                                if(ap24==1)                                                       
                                        time_data|=0xa0;

                                if(ap24==2)                                                       //pm->24
                                {
                                        hr_7=0;
                                        if((time_data&0x1f)==0x12)
                                                time_data=0x12;

                                        else
                                        {
                                                time_data=(time_data&0x1f)+0x12;
               
                                                if((time_data&0x0f)>0x09)               
                                                        time_data=((time_data&0x10)+0x10)|((time_data&0x0f)-0x0a);
                                        }
                                }
                               
                                disp_hr();
                                disp_hr_mode();
                                write_com(0x8f);        //指针指向ap24
//                                key_ready();
                        }                                               
/*---------------------------------------------------------------*/       
                }


                if(!minus)
                {
                        delay(25000);                               //200ms
                        while(!minus);
                        if(num==1)                                        //sec
                        {       
                                if(time_data==0)                                                                               
                                        time_data=0x59;

                                else
                                {       
                                        time_data-=1;
                                        if((time_data&0x0f)==0x0f)
                                                time_data=(time_data&0xf0)|0x09;
                                }       
                                       
                                disp_sec();
                                write_com(0xc7);        //指针指向秒
//                                key_ready();
                        }

                        if(num==2)                                                          //min
                        {
                                if(time_data==0)                                                                               
                                        time_data=0x59;

                                else
                                {       
                                        time_data-=1;
                                        if((time_data&0x0f)==0x0f)
                                                time_data=(time_data&0xf0)|0x09;
                                }
               
                                disp_min();
                                write_com(0xc4);//指针指向分
//                                key_ready();
                        }
                       
                        if(num==3)                                                        //hr
                        {
                                if(hr_7)                                                //12
                                {
                                        time_data-=1;                       

                                        if((time_data&0x1f)==0)                                                                               
                                                time_data=(time_data&0xe0)+0x12;
       
                                        if((time_data&0x0f)>0x09)
                                                time_data=(time_data&0xf0)|0x09;
                                }
       
                                else                                                        //24
                                {
                                        if(time_data==0)                                                                               
                                                time_data=0x23;

                                        else
                                        {
                                                time_data-=1;
                                                if((time_data&0x0f)>0x09)
                                                        time_data=(time_data&0xf0)|0x09;
                                        }
                                }

                                disp_hr();
                                write_com(0xc1);//指针指向时
//                                key_ready();
                        }                               
                       
                        if(num==4)
                        {
                                if(time_data==0)
                                        time_data=6;
                                else
                                        time_data-=1;

                                disp_week();
                                write_com(0x8d);//指针指向week
//                                key_ready();
                        }
                       
                        if(num==5)                                                       //day
                        {
                                if(time_data==0)                                                                               
                                        time_data=0x31;
                                else
                                {
                                        time_data-=1;

                                        if((time_data&0x0f)==0x0f)
                                                time_data=(time_data&0xf0)+0x09;
       
                                        if((time_data&0xf0)==0xf0)
                                                time_data=(time_data&0x0f)+0x30;
                                }
                                disp_day();
                                write_com(0x89);//指针指向day
//                                key_ready();
                        }
                       
                        if(num==6)                                                        //month
                        {
                                if(time_data==0)                                                                               
                                        time_data=0x12;

                                else
                                {
                                        time_data-=1;
       
                                        if((time_data&0x0f)==0x0f)
                                                time_data=0x09;
                                }
                                disp_month();
                                write_com(0x86);//指针指向时
//                                key_ready();
                        }
                       
                        if(num==7)                                                        //year
                        {
                                if(time_data==0)                                                                               
                                        time_data=0x99;

                                else
                                {       
                                        time_data-=1;
                                        if((time_data&0x0f)==0x0f)
                                                time_data=(time_data&0xf0)|0x09;
                                }
               
                                disp_year();
                                write_com(0x83);//指针指向年
//                                key_ready();
                        }
                       
/*                        if(num==8)                                           //year
                        {
                                ap24--;
                                if(ap24==-1)                                        //am->24
                                {
                                        ap24=2;

                                        hr_7=0;

                                        if((time_data&0x1f)==0x12)
                                                time_data=0x00;
                                        else
                                                time_data&=0x1f;
                                }
                               
                                if(ap24==1)                                                //24->pm       
                                {
                                        hr_7=1;
                                        if(time_data>0x12)
                                        {
                                                time_data-=0x12;
                                                if((time_data&0x0f)>9)
                                                        time_data=(time_data|0xa0)|((time_data&0x0f)-0x06);
                                        }
                                        else if(time_data==0x12)
                                                time_data=0x12;
                                        else
                                                time_data|=0xa0;
                                }

                                if(ap24==0)                                                       //pm->am
                                        time_data|=0x80;
                               
                                disp_hr();
                                disp_hr_mode();
                                write_com(0x8f);        //指针指向年
//                                key_ready();
                        }                                                */
                                                                       
                }                                                  
        }
}                                                               

//=====================main============================================


main()                       
{       
//        delay(125);

//        init_timer0();

        write_cgram();

        lcd_init();

        write_1302(0x8e,0x00); //WP=0

        write_1302(0x90,0x00);        //ban TCS

        write_1302(0x80,0x00);        //CH=0

        write_1302(0x8e,0x80); //WP=1

        while(1)
        {
                if(num==0)
                {
                        read_time();

                        hr_mode();
               
                        if(time_data%2==0)                               //设定2秒读一次温度值
                               flag=1;

                        if(flag)
                        {
                                read_temp();
                                disp_temp();
                       
                                flag=0;                       
                        }                          

                        display_time();
                }

                key_scan();
        }
}

micropower 发表于 2008-5-2 03:25:33

不知是不是我色盲还是色弱了,看到P00~P04跟P1P2口的一样都是红色电平啊!

lusson 发表于 2008-5-2 08:58:50

同上,另外楼主真有意思,传这么大段程序,弄得我下拉了好久才拉到底。

lyhummer 发表于 2008-5-2 09:29:36

P00-P05,红色,P06-P07,蓝色,一楼micropower 流浪的飘没有色盲,难道我也色盲?

仿真的时候没有任何出错提示?

juruqiang 发表于 2008-5-2 09:48:52

呵,不好意思了,昨晚弄的有点晕了,只知道截个图上来.俺是学生,刚刚接触这东西,请大家帮忙下!图重新传上去.

juruqiang 发表于 2008-5-2 09:50:47

不知道程序是对错,就传上去了

fylue 发表于 2008-5-8 22:33:34

楼主没有色盲

funghome 发表于 2008-5-8 23:34:22

黃色我也見過,當高電平口接地後就會出現

lord 发表于 2011-3-7 15:28:41

黄色一般代表短路。 估计是你搞错了接线。
页: [1]
查看完整版本: protues仿真出现黄色电平,到底是怎么回事!