打印

74LS165求助

[复制链接]
7977|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
西安周公|  楼主 | 2008-4-25 12:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件这样连的:
8个并行输入上拉10K到电源,并联按键到地;1(LOAD)、2(CLK)、9(Qh)分别接单片机P2.0、2.1、2.2;165的7脚空,10(串行输入)、15(时钟抑制)接地。
程序:
         KDAT = 1  ;
    KEY = 0  ;  /* 变量赋 0  */
    KLOAD = 0  ;/*锁存按键状态*/
    KLOAD = 1  ;
     DO  N = 0    TO  7  ;
    IF  KDAT = 0  THEN  KEY = KEY OR 01H  ;;/*读口状态*/
    KCLK = 1  ;/*时钟变高*/
    KEY = ROL ( KEY , 1 )  ;/*字节左移*/
    KCLK = 0  ;;/*时钟变低*/
      END  ;
现在的问题是:H、E、G有变化(对应位变低),其余均看见在最后变低,而不是在相应位置变低。
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|  /* 没有键按下,8个连续的‘1’ */

|_| ̄ ̄ ̄ ̄ ̄ ̄ ̄|  /* 理想状态H键按下 */

| ̄|_| ̄ ̄ ̄ ̄ ̄ ̄|  /* 理想状态G键按下 */

| ̄ ̄|_| ̄ ̄ ̄ ̄ ̄|  /* 理想状态F键按下 */

| ̄ ̄ ̄|_| ̄ ̄ ̄ ̄|  /* 理想状态E键按下 */

| ̄ ̄ ̄ ̄|_| ̄ ̄ ̄|  /* 理想状态D键按下 */

| ̄ ̄ ̄ ̄ ̄|_| ̄ ̄|  /* 理想状态C键按下 */

| ̄ ̄ ̄ ̄ ̄ ̄|_| ̄|  /* 理想状态B键按下 */

| ̄ ̄ ̄ ̄ ̄ ̄ ̄|_|  /* 理想状态A键按下 */
现在情况:
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|  /* 没有键按下 */

|_| ̄ ̄ ̄ ̄ ̄ ̄ ̄|  /* H键按下 */

| ̄ ̄ ̄ ̄ ̄ ̄ ̄|  /* 后几个键任一按下,‘0’被排在后边 */
哪位出出主意:什么原因、怎么解决?在此致谢。

相关帖子

沙发
hotpower| | 2008-4-25 12:34 | 只看该作者

倒塌了~~~165也要求助???

想念周公之~~~

使用特权

评论回复
板凳
西安周公|  楼主 | 2008-4-25 12:45 | 只看该作者

谢谢你,有主意出个主意,没主意捧个 人场!

使用特权

评论回复
地板
hotpower| | 2008-4-25 12:57 | 只看该作者

哈哈~~~找到以前做过的C51读165键盘程序~~~

//接收键盘数据(读165)
unsigned char ReadKeyByte(void) using 0
{
unsigned char i, key;
  PL = 0;//接收74HC165并行数据
  RX = 1;//延时
  PL = 1;//锁存74HC165并行数据
  for (i = 0; i < 8; i ++) {
    TX = 0;//拉低74HC165时钟 
    _nop_();
    CY = RX;//读74HC165串行数据
    _rlca_();
    TX = 1;//拉高74HC165时钟
    _nop_();
  }
  key = ~ACC;//存键盘串行数据
  return key;//键值a..h(D7..D0)//无键压下0x00
}

//执行键盘命令
void KeyCommandExec(unsigned char commgroup, unsigned char commnum) using 0
{
unsigned int i;
unsigned key;
code void *KeyArray[3][4] = {//二维函数数组指针阵列表(散转命令地址表)
  {(void *)Key00 + 0x5b7d, (void *)Key01 + 0xa6ea, (void *)Key02 + 0xf157, (void *)Key03 + 0x4cc4},
  {(void *)Key10 + 0x9731, (void *)Key11 + 0xe2ae, (void *)Key12 + 0x3d1b, (void *)Key13 + 0x8888},
  {(void *)Key00 + 0xd3f5, (void *)Key21 + 0x2e62, (void *)Key02 + 0x79df, (void *)Key23 + 0xc44c} 
  };
  if ((commgroup < 3) && (commnum < 4)) {
    key = commgroup * 4 + commnum + 1;
    i = ((key * 53 & 0xf) * 0x1000)+ ((key * 43 & 0xf) * 0x100) + ((key * 23 & 0xf) * 0x10) + (key * 13 & 0xf);
    _icall_((void *)KeyArray[commgroup][commnum] - i);//键盘命令散转
  }
}




/*------------------------------------
         定时器T0中断服务程序(5mS)
------------------------------------*/
void t0proc() interrupt TF0_VECTOR using 0
{
unsigned char key;
code unsigned char KeyPosTab[] = {0x80, 0x40, 0x20, 0x10};
  TL0 = T0_5mS & 0xff;
  TH0 = T0_5mS >> 8;
  key = ReadKeyByte();//接收键盘数据(读74HC165)(每次可取多键)
  if (key & KeyPosTab[SystemBuffers.TimeCount & 0x03]) {//有键压下(每次只取1键以实现“零耗时消除键盘抖动”)
    SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] ++;//压键计数
    if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] == 2) {//短压键
      SystemBuffers.WaitTime = 0;
      KeyCommandExec(0, SystemBuffers.TimeCount & 0x03);//单击键Key00()~Key03()
    }
    else {
      if (SystemBuffers.LedWorkPosition) key = SysFastPushKeyTime;//50
      else key = SysPushKeyTime;//150//3S
      if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] >= key) {//长压键X * 20mS
        SystemBuffers.WaitTime = 0;
        KeyCommandExec(2, SystemBuffers.TimeCount & 0x03);//长压键Key20()~Key23()
        SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] = 3;//清除长压键计数器(躲过单击键)
      }
    }
  }
  else {//无键压下(包括放键)
    if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] >= 2) {//放键事件
      SystemBuffers.WaitTime = 0;
      KeyCommandExec(1, SystemBuffers.TimeCount & 0x03);//键释放Key10()~Key13()
    }
    SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] = 0;//清除压键计数器
  }
//...............................
}

使用特权

评论回复
5
西安周公|  楼主 | 2008-4-25 13:06 | 只看该作者

人场钱场都有了,感谢。我去试试先。

使用特权

评论回复
6
hotpower| | 2008-4-25 13:12 | 只看该作者

哈哈~~~记得还有gccavr的,要否???

使用特权

评论回复
7
yewuyi| | 2008-4-25 13:16 | 只看该作者

是正牌的周公吗?

印象里正牌的周公应该不会被这个问题困住把……

使用特权

评论回复
8
hotpower| | 2008-4-25 13:19 | 只看该作者

哈哈~~~最近我也被CPLD/DSP所困了数日~~~

可以理解~~~

使用特权

评论回复
9
西安周公|  楼主 | 2008-4-25 14:20 | 只看该作者

呵呵,好象没有冒牌的吧!

没办法,不知道的东西总是比知道的东西多。知之为知之,不知为不知。有玩过的说说经验当然是好事情了。
我的硬件连线有没有问题?

使用特权

评论回复
10
hotpower| | 2008-4-25 17:37 | 只看该作者

调不通肯定是硬件的问题了~~~这应该是很简单的应用

先发个并行数据锁存脉冲,再进行串行数据的2线SPI数据读取。

使用特权

评论回复
11
西安周公|  楼主 | 2008-4-26 10:01 | 只看该作者

和这个图一样,出问题才搜着的。只是接线改为P2.0、2.1、2.2

原发于WAVE6000说明书。

使用特权

评论回复
12
hotpower| | 2008-4-26 11:55 | 只看该作者

N个8位并行输入口的扩展

对不级联的电路,SER无用~~~
相关链接:http://www.zlgmcu.com/philips/yingrong/80c51/spi.pdf

使用特权

评论回复
13
西安周公|  楼主 | 2008-4-26 12:40 | 只看该作者

非常感谢,已收藏

好象接法没什么不同,只是挂在串口。

使用特权

评论回复
14
hotpower| | 2008-4-26 18:15 | 只看该作者

把程序帖出来,估计是移位时钟和读数的错误

使用特权

评论回复
15
西安周公|  楼主 | 2008-4-26 20:45 | 只看该作者

主帖有了。

使用特权

评论回复
16
hotpower| | 2008-4-26 20:59 | 只看该作者

加NOP

是PLM51???

使用特权

评论回复
17
西安周公|  楼主 | 2008-4-27 15:37 | 只看该作者

是PLM51。最长加到100VS、1mS,效果一样。

使用特权

评论回复
18
西安周公|  楼主 | 2008-4-30 14:27 | 只看该作者

还是没玩转,改用164。

使用特权

评论回复
19
awey| | 2008-4-30 15:27 | 只看该作者

没理由的

         KDAT = 1  ;
    KEY = 0  ;  /* 变量赋 0  */
    KLOAD = 0  ;/*锁存按键状态*/
    KLOAD = 1  ;
     DO  N = 0    TO  7  ;
    IF  KDAT = 0  THEN  KEY = KEY OR 01H  ;;/*读口状态*/
    KCLK = 1  ;/*时钟变高*/
    KEY = ROL ( KEY , 1 )  ;/*字节左移*/
    KCLK = 0  ;;/*时钟变低*/
      END  ;
============================================================
不懂你上面的程序,与下面的C程序有何不同?

for(N=0;N<8;N++){
    if(!KDAT) KEY = KEY | 01H;
    KCLK = 1  ;/*时钟变高*/
    KEY = KEY<<1   ;/*字节左移*/
    KCLK = 0  ;/*时钟变低*/     
}

使用特权

评论回复
20
西安周公|  楼主 | 2008-4-30 16:37 | 只看该作者

一样。前面多了个锁存。

使用特权

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

本版积分规则

4

主题

157

帖子

0

粉丝