标题: logic contention detected on net +5v [打印本页]
作者: 18834001845 时间: 2017-5-4 20:41
标题: logic contention detected on net +5v
这是我的电路和错误还有我的程序
#include<reg52.h>
//#include<config.h>
#include<intrins.h>
#defineuchar unsigned char
#defineunint unsigned int
externvoid Key_Data(void);
unsignedchar data dis_digit;
unsignedchar key_s,key_v;//定义数码管显示段码
unsignedchar codedis_code[12]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff,0xfd};
ucharLED_flag1=0x01;//定义20个发光二极管
ucharLED_flag2=0x01;
ucharLED_flag3=0x01;
ucharLED_flag4=0x01;
ucharLED_flag5=0x01;
ucharLED_flag6=0x01;
ucharLED_flag7=0x01;
ucharLED_flag8=0x01;
ucharLED_flag9=0x01;
ucharLED_flag10=0x01;
ucharLED_flag11=0x01;
ucharLED_flag12=0x01;
ucharLED_flag13=0x01;
ucharLED_flag14=0x01;
ucharLED_flag15=0x01;
ucharLED_flag16=0x01;
ucharLED_flag17=0x01;
ucharLED_flag18=0x01;
ucharLED_flag19=0x01;
ucharLED_flag20=0x01;
ucharSUIJI1=0;
ucharSUIJI2=0;
ucharSUIJI3=0;
ucharMIMAI1,MIMAI2,MIMAI3=0;
ucharKKSJD=0;
ucharflagy1=0;
ucharKKSL=0;
ucharKT_LED1=0xff;
ucharKT_LED2=0xff;
ucharKT_LED3=0xff;
unsignedchar dis_buf[8];
unsignedchar dis_index;
unsignedchar sec100;
charKSJD=1;
sbitK1=P3^6; //小时增加
sbitK2=P3^7; //分钟增加
sbitK3=P3^5;
sbitLLL1=P2^0;
sbitLLL2=P2^1;
sbitLLL3=P1^6;
sbitLLL4=P1^7;
sbitLLL5=P2^2;
sbitLLL6=P2^5;
sbitLLL7=P2^6;
sbitLLL8=P2^7;
sbitLLL9=P1^5;
charMMJSASJ=0;
charKKKSJJ=0;
charJI0S=0;
bitflag_guanli=1;
ucharPPOP[60];
unsignedchar KKS1;
unsignedchar KKS2;
externunsigned char Count_165[2];
charMMMSW=0;
chardisp_Pattern; //
bitflag_light=0;
voiddisplay( ) ;
voiddelayms(unsigned char ms) ;
unsignedint KKSM=0;
bitflag_hhs=1;
ucharLLLS1,LLLS2,LLLS3;
charKSLEE[6]={0,0,0,0,0,0};
bitKKS_flag=1;
//延时1ms
voiddelay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
//延时子程序
voiddelay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
//4*4扫描键盘
voidKey_scan() //键盘扫描函数Key_scan()
{
unsignedchar X,Y,Z;
P3=0xff;
P3=0x0f; //先对P3置数 行扫描
if(P3!=0x0f) //判断是否有键按下
{
delay(1); //延时10ms,软件去干扰
if(P3!=0x0f) //确认按键按下
{
X=P3; //保存行扫描时有键按下时状态
P3=0xf0; //列扫描
Y=P3; //保存行扫描时有键按下时状态
Z=X|Y; //取出键值
while(P3!=0xf0); //按键防止抖动
switch (Z) //判断键值(那一个键按下)
{
case0x77:KKS2=4;break; //取消
case0x7b:KKS2=3;break; //确定
case0x7d:KKS2=2;break; //取包
case0x7e:KKS2=1;break; //存包
case0xbd:KKS1=9,KKS_flag=0;break; //数字【5】
case0xbe:KKS1=8,KKS_flag=0;break; //数字【8】
case0xd7:KKS1=7,KKS_flag=0;break; //字符【F=】
case0xdb:KKS1=6,KKS_flag=0;break; //数字【3】
case0xdd:KKS1=5,KKS_flag=0;break; //数字【3】
case0xde:KKS1=4,KKS_flag=0;break; //数字【9】
case0xe7:KKS1=3,KKS_flag=0;break; //字符【B+】
case0xeb:KKS1=2,KKS_flag=0;break; //字符【C-】
case0xed:KKS1=1,KKS_flag=0;break; //字符【D*】
case0xee:KKS1=0,KKS_flag=0;break; //字符【E/】
}
}
}
}
/*************************************************************
主 函 数
说 明:
入口参数:无
返 回 值:
设 计: 日 期:
修 改: 日 期:
*************************************************************/
voidmain(void)
{
P0=0xff;
P2=0xff;
TMOD=0x11; //定时器0,1工作模式1,16位定时器
TH0=0xFC;
TL0=0x17;
TCON=0x01;
IE=0x8a; //使能timer0,1中断
TR0=1;
KSLEE[0]=KSLEE[1]=KSLEE[2]=KSLEE[3]=KSLEE[4]=KSLEE[5]=10;//密码位数清零
KKSM=5;
flagy1=0;//显示等待存包状态
KKKSJJ=0;//显示密码变量清零
while(1)
{
if(MMJSASJ>3)flag_guanli=0;
Key_scan();//调用键盘检测程序
if(KKS2==2)flagy1=2; //有取包按键显示取包的状态
if(KKS2==1)//显示存包密码显示状态
{
flagy1=1;
}
MIMAI1=KSLEE[1]*10+KSLEE[0];
MIMAI2=KSLEE[3]*10+KSLEE[2];
MIMAI3=KSLEE[5]*10+KSLEE[4];
if(flagy1==0)//存包取密码
{
if(KKSJD==1)PPOP[0]=SUIJI1,PPOP[1]=SUIJI2,PPOP[2]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存1号柜,密码到数组1
if(KKSJD==2)PPOP[3]=SUIJI1,PPOP[4]=SUIJI2,PPOP[5]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存2号柜,密码到数组2
if(KKSJD==3)PPOP[6]=SUIJI1,PPOP[7]=SUIJI2,PPOP[8]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存3号柜,密码到数组3
if(KKSJD==4)PPOP[9]=SUIJI1,PPOP[10]=SUIJI2,PPOP[11]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存4号柜,密码到数组4
if(KKSJD==5)PPOP[12]=SUIJI1,PPOP[13]=SUIJI2,PPOP[14]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存5号柜,密码到数组5
if(KKSJD==6)PPOP[15]=SUIJI1,PPOP[16]=SUIJI2,PPOP[17]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存6号柜,密码到数组6
if(KKSJD==7)PPOP[18]=SUIJI1,PPOP[19]=SUIJI2,PPOP[20]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存7号柜,密码到数组7
if(KKSJD==8)PPOP[21]=SUIJI1,PPOP[22]=SUIJI2,PPOP[23]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存8号柜,密码到数组8
if(KKSJD==9)PPOP[24]=SUIJI1,PPOP[25]=SUIJI2,PPOP[26]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存9号柜,密码到数组9
if(KKSJD==10)PPOP[27]=SUIJI1,PPOP[28]=SUIJI2,PPOP[29]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存10号柜,密码到数组10
if(KKSJD==11)PPOP[30]=SUIJI1,PPOP[31]=SUIJI2,PPOP[32]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存11号柜,密码到数组11
if(KKSJD==12)PPOP[33]=SUIJI1,PPOP[34]=SUIJI2,PPOP[35]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存12号柜,密码到数组12
if(KKSJD==13)PPOP[36]=SUIJI1,PPOP[37]=SUIJI2,PPOP[38]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存13号柜,密码到数组13
if(KKSJD==14)PPOP[39]=SUIJI1,PPOP[40]=SUIJI2,PPOP[41]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存14号柜,密码到数组14
if(KKSJD==15)PPOP[42]=SUIJI1,PPOP[43]=SUIJI2,PPOP[44]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存15号柜,密码到数组15
if(KKSJD==16)PPOP[45]=SUIJI1,PPOP[46]=SUIJI2,PPOP[47]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存16号柜,密码到数组16
if(KKSJD==17)PPOP[48]=SUIJI1,PPOP[49]=SUIJI2,PPOP[50]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存17号柜,密码到数组17
if(KKSJD==18)PPOP[51]=SUIJI1,PPOP[52]=SUIJI2,PPOP[53]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存18号柜,密码到数组18
if(KKSJD==19)PPOP[54]=SUIJI1,PPOP[55]=SUIJI2,PPOP[56]=SUIJI3,LED_flag1=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存19号柜,密码到数组19
if(KKSJD==20)PPOP[57]=SUIJI1,PPOP[58]=SUIJI2,PPOP[59]=SUIJI3,LED_flag20=0,KKSJD=0,SUIJI1=SUIJI2=SUIJI3=0;//存20号柜,密码到数组20
}
KT_LED2=LED_flag1|(LED_flag2<<1)|(LED_flag3<<2)|(LED_flag4<<3)|(LED_flag5<<4)|(LED_flag6<<5)| (LED_flag7<<6);//显示不同灯的状态
KT_LED1=LED_flag8|(LED_flag9<<1)|(LED_flag10<<2)|(LED_flag11<<3)|(LED_flag12<<4)|(LED_flag13<<5)| (LED_flag14<<6);
KT_LED3=LED_flag15|(LED_flag16<<1)|(LED_flag17<<2)|(LED_flag18<<3)|(LED_flag19<<4)|(LED_flag20<<5);
if(KKS2==3)//等待输入密码,然后进行密码比较
{
if(flag_guanli)//等待输入密码,然后进行密码比较
{
MMJSASJ++;
if((PPOP[0]==MIMAI1)&&(PPOP[1]==MIMAI2)&&(PPOP[2]==MIMAI3))MMJSASJ=0,LED_flag1=1;//比较1号柜密码
if((PPOP[3]==MIMAI1)&&(PPOP[4]==MIMAI2)&&(PPOP[5]==MIMAI3))MMJSASJ=0,LED_flag2=1;//比较2号柜密码
if((PPOP[6]==MIMAI1)&&(PPOP[7]==MIMAI2)&&(PPOP[8]==MIMAI3))MMJSASJ=0,LED_flag3=1;//比较3号柜密码
if((PPOP[9]==MIMAI1)&&(PPOP[10]==MIMAI2)&&(PPOP[11]==MIMAI3))MMJSASJ=0,LED_flag4=1;//比较4号柜密码
if((PPOP[12]==MIMAI1)&&(PPOP[13]==MIMAI2)&&(PPOP[14]==MIMAI3))MMJSASJ=0,LED_flag5=1;//比较5号柜密码
if((PPOP[15]==MIMAI1)&&(PPOP[16]==MIMAI2)&&(PPOP[17]==MIMAI3))MMJSASJ=0,LED_flag6=1;//比较6号柜密码
if((PPOP[18]==MIMAI1)&&(PPOP[19]==MIMAI2)&&(PPOP[20]==MIMAI3))MMJSASJ=0,LED_flag7=1;//比较7号柜密码
if((PPOP[21]==MIMAI1)&&(PPOP[22]==MIMAI2)&&(PPOP[23]==MIMAI3))MMJSASJ=0,LED_flag8=1;//比较8号柜密码
if((PPOP[24]==MIMAI1)&&(PPOP[25]==MIMAI2)&&(PPOP[26]==MIMAI3))MMJSASJ=0,LED_flag9=1;//比较9号柜密码
if((PPOP[27]==MIMAI1)&&(PPOP[28]==MIMAI2)&&(PPOP[29]==MIMAI3))MMJSASJ=0,LED_flag10=1;//比较10号柜密码
if((PPOP[30]==MIMAI1)&&(PPOP[31]==MIMAI2)&&(PPOP[32]==MIMAI3))MMJSASJ=0,LED_flag11=1;//比较11号柜密码
if((PPOP[33]==MIMAI1)&&(PPOP[34]==MIMAI2)&&(PPOP[35]==MIMAI3))MMJSASJ=0,LED_flag12=1;//比较12号柜密码
if((PPOP[36]==MIMAI1)&&(PPOP[37]==MIMAI2)&&(PPOP[38]==MIMAI3))MMJSASJ=0,LED_flag12=1;//比较13号柜密码
if((PPOP[39]==MIMAI1)&&(PPOP[40]==MIMAI2)&&(PPOP[41]==MIMAI3))MMJSASJ=0,LED_flag14=1;//比较14号柜密码
if((PPOP[42]==MIMAI1)&&(PPOP[43]==MIMAI2)&&(PPOP[44]==MIMAI3))MMJSASJ=0,LED_flag15=1;//比较15号柜密码
if((PPOP[45]==MIMAI1)&&(PPOP[46]==MIMAI2)&&(PPOP[47]==MIMAI3))MMJSASJ=0,LED_flag16=1;//比较16号柜密码
if((PPOP[48]==MIMAI1)&&(PPOP[49]==MIMAI2)&&(PPOP[50]==MIMAI3))MMJSASJ=0,LED_flag17=1;//比较17号柜密码
if((PPOP[51]==MIMAI1)&&(PPOP[52]==MIMAI2)&&(PPOP[53]==MIMAI3))MMJSASJ=0,LED_flag18=1;//比较18号柜密码
if((PPOP[54]==MIMAI1)&&(PPOP[55]==MIMAI2)&&(PPOP[56]==MIMAI3))MMJSASJ=0,LED_flag19=1;//比较19号柜密码
if((PPOP[57]==MIMAI1)&&(PPOP[58]==MIMAI2)&&(PPOP[59]==MIMAI3))MMJSASJ=0,LED_flag20=1;//比较20号柜密码
}
flagy1=0;
KSLEE[0]=KSLEE[1]=KSLEE[2]=KSLEE[3]=KSLEE[4]=KSLEE[5]=10;//密码位数清零
if((MIMAI1=10)&&(MIMAI2=10)&& (MIMAI3=10))//管理员密码比较,101010
{
flag_guanli=1;
LED_flag1=LED_flag2=LED_flag3=LED_flag4=LED_flag5=LED_flag6=LED_flag7= LED_flag8= LED_flag9= LED_flag10=0x01;
LED_flag11=LED_flag12=LED_flag13=LED_flag14=LED_flag15=LED_flag16=LED_flag17=LED_flag18=LED_flag19=LED_flag20=0x01;
}
}
if(KKS2==4)//取消返回等待存包状态
{
flagy1=0;
KSLEE[0]=KSLEE[1]= KSLEE[2]= KSLEE[3]= KSLEE[4]= KSLEE[5]=10;//密码位数清零
KKSM=5;
}
}
}
/********************************************************
函 数 名:
说 明:中断程序,显示时间
入口参数:无
//定时器0中断服务程序,用于数码管的动态扫描
//dis_index---显示索引,用于标识当前显示的数码管和缓冲区的偏移量
//dis_digit---位选通值,传送到P2口用于选通当前数码管的数值,如等于0xfe时,
// 选通P2口数码管
//dis_buf --- 显示缓冲区基地址
*********************************************************/
voidtimer0( ) interrupt 1
{
TH0=0xFa;
TL0=0x17;
P2=0xff;
MMMSW++;
if(flagy1==0)
{
SUIJI1++;
if(SUIJI1>99)SUIJI1=0, SUIJI2++; //低
if(SUIJI2>99)SUIJI2=0, SUIJI3++; //中
if(SUIJI3>99)SUIJI3=0; //高
}
if(flagy1==0) //显示"……"等待存包
{
if(MMMSW==5)LLL5=0,LLL1=LLL2=LLL3=LLL4=LLL9=LLL6=LLL7=LLL8=1,P0=dis_code[11]; //显示
if(MMMSW==6)LLL6=0,LLL2=LLL3=LLL4=LLL5=LLL9=LLL7=LLL1=LLL8=1,P0=dis_code[11]; //显示
if(MMMSW==7)LLL7=0,LLL2=LLL3=LLL4=LLL9=LLL5=LLL6=LLL1=LLL8=1,P0=dis_code[11]; //显示
if(MMMSW==8)LLL8=0,LLL2=LLL3=LLL4=LLL9=LLL5=LLL6=LLL7=LLL1=1,P0=dis_code[11]; //显示
if(MMMSW==1)LLL1=0,LLL2=LLL3=LLL4=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=dis_code[11]; //显示
if(MMMSW==2)LLL2=0,LLL1=LLL3=LLL4=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=dis_code[11]; //显示
if(MMMSW==3)LLL3=0,LLL1=LLL2=LLL4=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=KT_LED1; //第1行
if(MMMSW==9)MMMSW=0,LLL9=0,LLL1=LLL2=LLL3=LLL4=LLL5=LLL6=LLL7=LLL8=1,P0=KT_LED2; //第2行
if(MMMSW==4)LLL4=0,LLL1=LLL2=LLL3=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=KT_LED3; //第3行
KKSM=5;
}
if(flagy1==1) //显示存包显示密码的状态
{
if(MMMSW==5)LLL5=0,LLL1=LLL2=LLL3=LLL4=LLL9=LLL6=LLL7=LLL8=1,P0=dis_code[SUIJI1%10]; //显示
if(MMMSW==6)LLL6=0,LLL2=LLL3=LLL4=LLL5=LLL9=LLL7=LLL1=LLL8=1,P0=dis_code[SUIJI1/10]; //显示
if(MMMSW==7)LLL7=0,LLL2=LLL3=LLL4=LLL9=LLL5=LLL6=LLL1=LLL8=1,P0=dis_code[SUIJI2%10]; //显示
if(MMMSW==8)LLL8=0,LLL2=LLL3=LLL4=LLL9=LLL5=LLL6=LLL7=LLL1=1,P0=dis_code[SUIJI2/10]; //显示
if(MMMSW==1)LLL1=0,LLL2=LLL3=LLL4=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=dis_code[SUIJI3%10]; //显示
if(MMMSW==2)LLL2=0,LLL1=LLL3=LLL4=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=dis_code[SUIJI3/10]; //显示
if(MMMSW==3)LLL3=0,LLL1=LLL2=LLL4=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=KT_LED1; //第1行
if(MMMSW==9)MMMSW=0,LLL9=0,LLL1=LLL2=LLL3=LLL4=LLL5=LLL6=LLL7=LLL8=1,P0=KT_LED2; //第2行
if(MMMSW==4)LLL4=0,LLL1=LLL2=LLL3=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=KT_LED3; //第3行
KKS2=0;
KKSM++;
if(KKSM>2000)KKSM=0,KKKSJJ++,KKSJD=KKKSJJ,flagy1=0;//KKSJD++,flagy1=0;
}
if(flagy1==2)//显示输入密码状态
{
if(!KKS_flag)KKS_flag=1,KSLEE[KKSM]=KKS1,KKSM--;
if(KKSM<1)KKSM=0;
if(MMMSW==5)LLL5=0,LLL1=LLL2=LLL3=LLL4=LLL9=LLL6=LLL7=LLL8=1,P0=dis_code[KSLEE[0]]; //显示
if(MMMSW==6)LLL6=0,LLL2=LLL3=LLL4=LLL5=LLL9=LLL7=LLL1=LLL8=1,P0=dis_code[KSLEE[1]]; //显示
if(MMMSW==7)LLL7=0,LLL2=LLL3=LLL4=LLL9=LLL5=LLL6=LLL1=LLL8=1,P0=dis_code[KSLEE[2]]; //显示
if(MMMSW==8)LLL8=0,LLL2=LLL3=LLL4=LLL9=LLL5=LLL6=LLL7=LLL1=1,P0=dis_code[KSLEE[3]]; //显示
if(MMMSW==1)LLL1=0,LLL2=LLL3=LLL4=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=dis_code[KSLEE[4]]; //显示
if(MMMSW==2)LLL2=0,LLL1=LLL3=LLL4=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=dis_code[KSLEE[5]]; //显示
if(MMMSW==3)LLL3=0,LLL1=LLL2=LLL4=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=KT_LED1; //第1行
if(MMMSW==9)MMMSW=0,LLL9=0,LLL1=LLL2=LLL3=LLL4=LLL5=LLL6=LLL7=LLL8=1,P0=KT_LED2; //第2行
if(MMMSW==4)LLL4=0,LLL1=LLL2=LLL3=LLL9=LLL5=LLL6=LLL7=LLL8=1,P0=KT_LED3; //第3行
}
}
/********************************************************
函 数 名:delayms(unsigned char ms)
说 明:延时程序
入口参数:无
返 回 值:
设 计: 日 期:
修 改: 日 期:
*********************************************************/
voiddelayms(unsigned char ms)
//延时子程序
{ unsigned char i;
while(ms--)
{ for(i=0;i<120;i++);
}
}
/********************************************************
*模块名称:165数据的检测
*函数功能:
*出口函数:void Key_Data(void)
*出口参数:Count_165[1]放低8位,Count_165[2]放高8位
*模块说明:
*********************************************************/
#include<reg52.h> //SFR declarations
#include<stdio.h>
#include<intrins.h>
#defineuchar unsigned char
#defineuint unsigned int
sfrWDT_CONTR=0xE1;
sbitCLK=P1^3; //时钟,上升沿有效
sbitSO=P1^5; //数据输出
sbitSH_LD=P1^4; //移位/置入控制,为低电平时,并行数据A-H被移入寄存器;为高时,并行置数被禁止
sbitCLK1=P2^3; //时钟,上升沿有效
sbitSO1=P3^2; //数据输出
sbitSH_LD1=P2^2; //移位/置入控制,为低电平时,并行数据A-H被移入寄存器;为高时,并行置数被禁止
uintKeyPort(void); //申明进行数据传送
voidKey_Data(void); //申明读取165端数据
externvoid dog(); //定义
uintLedData=0xFFFF;
ucharCount_165[2]; //定义输出
/********************************************************
*模块名称:uint KeyPort(void)
*函数功能:
*出口函数:无
*出口参数:无
*模块说明:进行数据传送
*********************************************************/
uintKeyPort(void)
{ uchar i;
uint key;
WDT_CONTR=0x3d;
SH_LD=0;
_nop_();_nop_();
SH_LD=1;
for(i=0;i<16;i++) //低位开始
{ CLK=0;
key>>=1;
if(SO)
key|=0x7fff;
CLK=1;}
returnkey;
}
/********************************************************
*模块名称:void Key_Data(void)
*函数功能:
*入口函数:key
*出口参数:HC_165_H,HC165_L
*模块说明:读取165端数据
*********************************************************/
voidKey_Data(void) //读取165端数据程序
{ uint buff_data;
buff_data=KeyPort();
Count_165[0]=buff_data&0xff;
Count_165[1]=(buff_data>>8)&0xff;}
#include<reg52.h>
#include<ABSACC.H>
#definea8255_PA XBYTE[0x7F7C] /*PA口地址*/
#definea8255_PB XBYTE[0x7F7D] /*PB口地址*/
#definea8255_PC XBYTE[0x7F7E] /*PC口地址*/
#definea8255_CON XBYTE[0x7F7F] /*控制字口地址*/
unsignedchar IO_flags; /*用于表示PA、PB、PC的当前输入壮体内容不能被其他程序改写,操作时ACC= IO_flags */
sbit IO_flagsA=ACC^0; /*PA的当前输入输出状态,置位表示输入,复位表示输出*/
sbit IO_flagsB=ACC^1; /*PB的当前输入输出状态*/
sbit IO_flagsC=ACC^2; /*PC的当前输入输出状态*/
unsignedchar const cfg_table[8]={
0x80, /*10000000b, ;c=out b=out a=out*/
0x90, /*10010000b, ;c=out b=out a=in*/
0x82, /*10000010b, ;c=out b=in a=out*/
0x92, /*10010010b, ;c=out b=in a=in*/
0x89, /*10001001b, ;c=in b=out a=out*/
0x99, /*10011001b, ;c=in b=out a=in*/
0x8B, /*10001011b, ;c=in b=in a=out*/
0x9B, /*10011011b, ;c=in b=in a=in*/};
charrd_PA(void); /*读PA口*/
charrd_PB(void); /*读PB口*/
charrd_PC(void); /*读PC口*/
voidwd_PA(unsigned char PA_data); /*写PA口*/
voidwd_PB(unsigned char PB_data); /*写PB口*/
voidwd_PC(unsigned char PC_data); /*写PC口*/
voidPABC_config(void) /*写8255控制字*/
{a8255_CON=cfg_table[IO_flags]; }
char rd_PA(void) /*读PA口*/
{ unsigned char PA_data;
ACC= IO_flags; /*把状态标志字读到ACC便于进行位操作*/
do { IO_flagsA=1; /*置PA状态标志位为高输入*/
IO_flags=ACC;
PABC_config(); /*调用配置子程序,完成对8255的设置*/
ACC= IO_flags; }
while(IO_flagsA==0); /*判断状态标志位是否为高*/
/*控制字设置完成*/
PA_data=a8255_PA; /*把PA口的数据读到PA_data*/
return(PA_data); /*返回PA_data*/ }
char rd_PB(void) /*读PB口*/
{ unsigned char PB_data;
ACC= IO_flags; /*把状态标志字读到ACC便于进行位操作*/
do { IO_flagsB=1; /*置PB状态标志位为高输入*/
IO_flags=ACC;
PABC_config(); /*调用配置子程序,完成对8255的设置*/
ACC= IO_flags; }
while(IO_flagsB==0); /*判断状态标志位是否为高*/
/*控制字设置完成*/
PB_data=a8255_PB; /*把PB口的数据读到PB_data*/
return(PB_data); /*返回PB_data*/ }
charrd_PC(void) /*读PC口*/
{ unsigned char PC_data;
ACC= IO_flags; /*把状态标志字读到ACC便于进行位操作*/
do { IO_flagsC=1; /*置PC状态标志位为高输入*/
IO_flags=ACC;
PABC_config(); /*调用配置子程序,完成对8255的设置*/
ACC= IO_flags; }
while(IO_flagsC==0); /*判断状态标志位是否为高*/
/*控制字设置完成*/
PC_data=a8255_PC; /*把PC口的数据读到PC_data*/
return(PC_data); /*返回PC_data*/ }
void wd_PA(unsigned char PA_data) /*写PA口*/
{ ACC= IO_flags; /*把状态标志字读到ACC便于进行位操作*/
{ IO_flagsA=0; /*置PA状态标志位为低输入*/
IO_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
PABC_config(); /*调用配置子程序,完成对8255的设置*/
ACC= IO_flags; }
while(IO_flagsA==1); /*判断状态标志位是否为高;为高,设置未完成,需重新设置*/
a8255_PA =PA_data; /*把PA_data的内容读到PA口*/
}
void wd_PB(unsigned char PB_data) /*写PB口*/
{ ACC= IO_flags; /*把状态标志字读到ACC便于进行位操作*/
{ IO_flagsB=0; /*置PB状态标志位为低输入*/
IO_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
PABC_config(); /*调用配置子程序,完成对8255的设置*/
ACC= IO_flags; }
while(IO_flagsB==1); /*判断状态标志位是否为高;为高,设置未完成,需重新设置*/
a8255_PB =PB_data; /*把PB_data的内容读到PB口*/
}
void wd_PC(unsigned char PC_data) /*写PB口*/
{ ACC= IO_flags; /*把状态标志字读到ACC便于进行位操作*/
{ IO_flagsC=0; /*置PC状态标志位为低输入*/
IO_flags=ACC; /*位操作完成,把ACC的内容写回状态标志字*/
PABC_config(); /*调用配置子程序,完成对8255的设置*/
ACC= IO_flags; }
while(IO_flagsC==1); /*判断状态标志位是否为高;为高,设置未完成,需重新设置*/
a8255_PC =PC_data; /*把PC_data的内容读到PB口*/
}
voidset_PC(unsigned char PC_num)
{ ACC= IO_flags;
IO_flagsC=0;
ACC= IO_flags;
PC_num=PC_num<<1;
PC_num=(PC_num|0x01);
a8255_CON=PC_num; }
voidclr_PC(unsigned char PC_num)
{ ACC= IO_flags;
IO_flagsC=1;
ACC= IO_flags;
PC_num=PC_num<<1;
PC_num=(PC_num&0xFE);
a8255_CON=PC_num; }
voidmain1(void)
{set_PC(0x01) ; }
-
2222.png
(35.89 KB, 下载次数: 59)
电路图
-
错误.png
(75.17 KB, 下载次数: 76)
错误
-
2222.png
(35.89 KB, 下载次数: 74)
作者: 18834001845 时间: 2017-5-4 20:42
该怎么解决呢?请大神指教
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |