各位兄弟! 下面是我写的一段键盘扫描程序,帮忙看看哪里有问题啊 多谢了! 我在单步执行的时候,当执行到row=6的时候,P1|=0xFF;这句执行的结果不是FF而是FD 然而row从0到5循环 这句话执行的结果都是FF 偏偏当row=6的时候就不对了! 不明白这是为什么啊?还望高手指点一下!
#include <REG52.H> #include <MATH.H> #include <intrins.h> #define uchar unsigned char #define uint unsigned int
void Init_T0( ); void Watchdog(); void Init_TGC(); void Init_Encoder(); void BeepOn(); void BeepOff(); void Send_Data(uchar bite); void Delay40us();
sfr PWM0=0xFC; sfr P4=0xC0;
sbit CLK=P2^5; sbit P16=P1^6; sbit P17=P1^7; uchar ActiveJob; uchar KeyData;
void mdelay(uint delaytime) { int j=0; for(;delaytime>0;delaytime--) { for(j=0;j<1000;j++) _nop_(); } }
void main() {
uchar row,Table,scan,col; uchar code KeyCode[]= { 0,35,8,9,25,10,11,23, 121,36,0,7,24,119,34,22, 0,37,123,6,26,120,118,21, 0,33,124,5,122,38,117,20, 0,32,0,4,0,39,50,19, 0,47,15,3,31,0,49,18, 133,0,115,125,75,0,0,17, 0,46,116,114,0,52,0,48, 0,81,80,0,0,51,0,16, 0,86,85,0,43,0,61,30, 0,107,113,110,112,101,102,2 };
for(;;) { P4&=0x00; CLK=0; for(row=0;row<8;row++) { P4=~(1<<row); // check every row P1|=0xFF; scan=0x01; for(col=0;col<8;col++) { if((P1&scan)==0) // scan every collume { ActiveJob=1; Table=row+8*col; goto lable; } scan=_irol_(scan,1); }
mdelay(30); CLK=!CLK; mdelay(30); } } lable: if(ActiveJob) { KeyData=KeyCode[Table]; } }
PS: 1.是键盘扫描的那部分! 我用的P87C552那个芯片,模拟仿真的时候,P1|=0xFF 这句话执行是对的 ,在线仿真的时候就出现了上述现象!望各多多指点啊!小弟为此调了一天多! 2. 这款单片机的P1.6 P1.7 为SDA 和SCL 口 ,不晓得多大的上拉电阻比较好 还望热心人士伸出援助之手啊 多谢咯!!
|