仙人老球 仙人老球
我是仙人老球
关注数: 95 粉丝数: 1,007 发帖数: 1,189 关注贴吧数: 140
51单片机代码问题 #include<reg51.h> #define uchar unsigned char **it dula=P2^6; **it wela=P2^7; **it beep=P2^3; uchar key,j,k,temp,daojishi=5,wei; bit begin,end,clear,fangui,show; uchar a0,b0=16;c0=16;d0=16;e0=16;f0=5,n[8]=0,g0=16,h0=16; unsigned int pp; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; void delay(unsigned char i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h) { dula=0; P0=table[a]; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5); P0=table[b]; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); P0=table[c]; dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(5); P0=table[d]; dula=1; dula=0; P0=0xf7; wela=1; wela=0; delay(5); P0=table[e]; dula=1; dula=0; P0=0xef; wela=1; wela=0; delay(5); P0=table[f]; dula=1; dula=0; P0=0xdf; wela=1; wela=0; delay(5); P0=table[g]; dula=1; dula=0; P0=0xbf; wela=1; wela=0; delay(5); P0=table[h]; dula=1; dula=0; P0=0x7f; wela=1; wela=0; delay(5); } void keyscan() { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=1; wei++; break; case 0xde: key=2; wei++; break; case 0xbe: key=3; wei++; break; case 0x7e: key=4; wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: key=5; wei++; break; case 0xdd: key=6; wei++; break; case 0xbd: key=7; wei++; break; case 0x7d: key=8; wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: clear=1; break; case 0xdb: begin=1; break; case 0xbb: show=1; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } } void main() { TMOD=0x01; TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。 TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12 ET0=1; EA=1; while(1) { keyscan(); if(begin) { if(!end) { TR0=1; //if(!daojishi)daojishi=5; //begin=0; //daojishi=5; if(pp==20) { pp=0; daojishi--; } f0=daojishi; if(key!=0) a0=key; n[key-1]++; //a1=a0; //if(a0!=0)end=1; if(!daojishi|a0) { end=1; TR0=0; //daojishi=5; //begin=0; pp=0; } } } else { if(key!=0) { switch(wei) { case 1: a0=key;break; case 2: b0=key;break; case 3: c0=key;break; case 4: d0=key;break; case 5: e0=key;break; } //if(!fangui) fangui=1; beep=0; n[key-1]--; } } if(clear) { a0=0;key=0;begin=0;end=0;fangui=0;beep=1;daojishi=5;f0=5;clear=0; b0=16;c0=16;d0=16;e0=16;wei=0; P1=0xff;show=0; } display(a0,b0,c0,d0,e0,f0,g0,h0); if(show) { display(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]); } if(fangui) { beep=0; P1=0x00; } } } void time0() interrupt 1 {TH0=(65536-46080)/256; TL0=(65536-46080)%256; pp++; } 是一个8路抢答器。问题在上板之后按显示所有人的分数那个键的时候 数码管会显示 00000800 然后第一位也不能正常加减和显示,求大神指教
1 下一页