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();
}
} 不知是不是我色盲还是色弱了,看到P00~P04跟P1P2口的一样都是红色电平啊! 同上,另外楼主真有意思,传这么大段程序,弄得我下拉了好久才拉到底。 P00-P05,红色,P06-P07,蓝色,一楼micropower 流浪的飘没有色盲,难道我也色盲?
仿真的时候没有任何出错提示? 呵,不好意思了,昨晚弄的有点晕了,只知道截个图上来.俺是学生,刚刚接触这东西,请大家帮忙下!图重新传上去. 不知道程序是对错,就传上去了 楼主没有色盲 黃色我也見過,當高電平口接地後就會出現 黄色一般代表短路。 估计是你搞错了接线。
页:
[1]