這是我的電路和錯誤還有我的程序
#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) ; }
|