打印

C51 求救!

[复制链接]
1819|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyhkerry|  楼主 | 2007-6-11 14:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C51, TI, CAN, AN, BLE
各位兄弟!
下面是我写的一段键盘扫描程序,帮忙看看哪里有问题啊 多谢了!
 我在单步执行的时候,当执行到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 口 ,不晓得多大的上拉电阻比较好 还望热心人士伸出援助之手啊  多谢咯!!

相关帖子

沙发
ayb_ice| | 2007-6-11 15:18 | 只看该作者

P1|=0xFF;

P1|=0xFF;真是高手,直接P1=0xFF不就得了(虽然结果是一样的)。。。

使用特权

评论回复
板凳
wyhkerry|  楼主 | 2007-6-11 16:52 | 只看该作者

谢谢

刚开始我也是P1=0xFF的,就是因为发生了上面的问题 所以才改成这样的,兄弟是高手吗 可以分析一下为什么吗?

使用特权

评论回复
地板
wjy1107| | 2007-6-11 16:57 | 只看该作者

检查外围电路吧

估计是当P4 改变的时候引起了P1 输入的变化,那么P1就会不听话啦。
也就是当P1的输入被强制拉低后,用程序置高是没用的。呵呵!

使用特权

评论回复
5
gyt| | 2007-6-11 17:19 | 只看该作者

楼上,高!

使用特权

评论回复
6
wjy1107| | 2007-6-11 18:59 | 只看该作者

呵呵!

使用特权

评论回复
7
wyhkerry|  楼主 | 2007-6-11 20:48 | 只看该作者

谢谢

哦  多谢 四楼的兄弟 ! 我用的是P87C552 这个P1口还有第二功能的  
他的 P1.7  P1.6 就是I2C的 SDA 和SCL的信号输入  开始的时候 我没有加上拉电阻  输入总是为低电平 不晓得这怎么回事
兄弟可否留个联系方式啊  把原理图发给你  有空帮忙看看一下  非常感谢 !
   

使用特权

评论回复
8
wyhkerry|  楼主 | 2007-6-11 20:50 | 只看该作者

谢谢 !

再问一下 
为什么我执行前6吃循环得时候 都不会有问题  每次到 第7次得时候 就出错了 好郁闷!

使用特权

评论回复
9
ayb_ice| | 2007-6-12 09:31 | 只看该作者

用正反扫描法,又快又好。。。

使用特权

评论回复
10
lws| | 2007-6-12 16:45 | 只看该作者

随便说说

SDA SCL线是一定要加上拉电阻的,看看I2C的规范

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

92

帖子

1

粉丝