74LS165求助

[复制链接]
 楼主| 西安周公 发表于 2008-4-25 12:31 | 显示全部楼层 |阅读模式
硬件这样连的:<br />8个并行输入上拉10K到电源,并联按键到地;1(LOAD)、2(CLK)、9(Qh)分别接单片机P2.0、2.1、2.2;165的7脚空,10(串行输入)、15(时钟抑制)接地。<br />程序:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KDAT&nbsp;=&nbsp;1&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;KEY&nbsp;=&nbsp;0&nbsp;&nbsp;;&nbsp;&nbsp;/*&nbsp;变量赋&nbsp;0&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KLOAD&nbsp;=&nbsp;0&nbsp;&nbsp;;/*锁存按键状态*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KLOAD&nbsp;=&nbsp;1&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DO&nbsp;&nbsp;N&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;TO&nbsp;&nbsp;7&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;&nbsp;KDAT&nbsp;=&nbsp;0&nbsp;&nbsp;THEN&nbsp;&nbsp;KEY&nbsp;=&nbsp;KEY&nbsp;OR&nbsp;01H&nbsp;&nbsp;;;/*读口状态*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KCLK&nbsp;=&nbsp;1&nbsp;&nbsp;;/*时钟变高*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KEY&nbsp;=&nbsp;ROL&nbsp;(&nbsp;KEY&nbsp;,&nbsp;1&nbsp;)&nbsp;&nbsp;;/*字节左移*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KCLK&nbsp;=&nbsp;0&nbsp;&nbsp;;;/*时钟变低*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END&nbsp;&nbsp;;<br />现在的问题是:H、E、G有变化(对应位变低),其余均看见在最后变低,而不是在相应位置变低。<br />| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|&nbsp;&nbsp;/*&nbsp;没有键按下,8个连续的‘1’&nbsp;*/<br /><br />|_| ̄ ̄ ̄ ̄ ̄ ̄ ̄|&nbsp;&nbsp;/*&nbsp;理想状态H键按下&nbsp;*/<br /><br />| ̄|_| ̄ ̄ ̄ ̄ ̄ ̄|&nbsp;&nbsp;/*&nbsp;理想状态G键按下&nbsp;*/<br /><br />| ̄ ̄|_| ̄ ̄ ̄ ̄ ̄|&nbsp;&nbsp;/*&nbsp;理想状态F键按下&nbsp;*/<br /><br />| ̄ ̄ ̄|_| ̄ ̄ ̄ ̄|&nbsp;&nbsp;/*&nbsp;理想状态E键按下&nbsp;*/<br /><br />| ̄ ̄ ̄ ̄|_| ̄ ̄ ̄|&nbsp;&nbsp;/*&nbsp;理想状态D键按下&nbsp;*/<br /><br />| ̄ ̄ ̄ ̄ ̄|_| ̄ ̄|&nbsp;&nbsp;/*&nbsp;理想状态C键按下&nbsp;*/<br /><br />| ̄ ̄ ̄ ̄ ̄ ̄|_| ̄|&nbsp;&nbsp;/*&nbsp;理想状态B键按下&nbsp;*/<br /><br />| ̄ ̄ ̄ ̄ ̄ ̄ ̄|_|&nbsp;&nbsp;/*&nbsp;理想状态A键按下&nbsp;*/<br />现在情况:<br />| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|&nbsp;&nbsp;/*&nbsp;没有键按下&nbsp;*/<br /><br />|_| ̄ ̄ ̄ ̄ ̄ ̄ ̄|&nbsp;&nbsp;/*&nbsp;H键按下&nbsp;*/<br /><br />| ̄ ̄ ̄ ̄ ̄ ̄ ̄|&nbsp;&nbsp;/*&nbsp;后几个键任一按下,‘0’被排在后边&nbsp;*/<br />哪位出出主意:什么原因、怎么解决?在此致谢。<br />
hotpower 发表于 2008-4-25 12:34 | 显示全部楼层

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

想念周公之~~~
 楼主| 西安周公 发表于 2008-4-25 12:45 | 显示全部楼层

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

  
hotpower 发表于 2008-4-25 12:57 | 显示全部楼层

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

//接收键盘数据(读165)<br />unsigned&nbsp;char&nbsp;ReadKeyByte(void)&nbsp;using&nbsp;0<br />{<br />unsigned&nbsp;char&nbsp;i,&nbsp;key;<br />&nbsp;&nbsp;PL&nbsp;=&nbsp;0;//接收74HC165并行数据<br />&nbsp;&nbsp;RX&nbsp;=&nbsp;1;//延时<br />&nbsp;&nbsp;PL&nbsp;=&nbsp;1;//锁存74HC165并行数据<br />&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;8;&nbsp;i&nbsp;++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;TX&nbsp;=&nbsp;0;//拉低74HC165时钟&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;CY&nbsp;=&nbsp;RX;//读74HC165串行数据<br />&nbsp;&nbsp;&nbsp;&nbsp;_rlca_();<br />&nbsp;&nbsp;&nbsp;&nbsp;TX&nbsp;=&nbsp;1;//拉高74HC165时钟<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop_();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;key&nbsp;=&nbsp;~ACC;//存键盘串行数据<br />&nbsp;&nbsp;return&nbsp;key;//键值a..h(D7..D0)//无键压下0x00<br />}<br /><br />//执行键盘命令<br />void&nbsp;KeyCommandExec(unsigned&nbsp;char&nbsp;commgroup,&nbsp;unsigned&nbsp;char&nbsp;commnum)&nbsp;using&nbsp;0<br />{<br />unsigned&nbsp;int&nbsp;i;<br />unsigned&nbsp;key;<br />code&nbsp;void&nbsp;*KeyArray[3][4]&nbsp;=&nbsp;{//二维函数数组指针阵列表(散转命令地址表)<br />&nbsp;&nbsp;{(void&nbsp;*)Key00&nbsp;+&nbsp;0x5b7d,&nbsp;(void&nbsp;*)Key01&nbsp;+&nbsp;0xa6ea,&nbsp;(void&nbsp;*)Key02&nbsp;+&nbsp;0xf157,&nbsp;(void&nbsp;*)Key03&nbsp;+&nbsp;0x4cc4},<br />&nbsp;&nbsp;{(void&nbsp;*)Key10&nbsp;+&nbsp;0x9731,&nbsp;(void&nbsp;*)Key11&nbsp;+&nbsp;0xe2ae,&nbsp;(void&nbsp;*)Key12&nbsp;+&nbsp;0x3d1b,&nbsp;(void&nbsp;*)Key13&nbsp;+&nbsp;0x8888},<br />&nbsp;&nbsp;{(void&nbsp;*)Key00&nbsp;+&nbsp;0xd3f5,&nbsp;(void&nbsp;*)Key21&nbsp;+&nbsp;0x2e62,&nbsp;(void&nbsp;*)Key02&nbsp;+&nbsp;0x79df,&nbsp;(void&nbsp;*)Key23&nbsp;+&nbsp;0xc44c}&nbsp;<br />&nbsp;&nbsp;};<br />&nbsp;&nbsp;if&nbsp;((commgroup&nbsp;&lt&nbsp;3)&nbsp;&&&nbsp;(commnum&nbsp;&lt&nbsp;4))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;commgroup&nbsp;*&nbsp;4&nbsp;+&nbsp;commnum&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;((key&nbsp;*&nbsp;53&nbsp;&&nbsp;0xf)&nbsp;*&nbsp;0x1000)+&nbsp;((key&nbsp;*&nbsp;43&nbsp;&&nbsp;0xf)&nbsp;*&nbsp;0x100)&nbsp;+&nbsp;((key&nbsp;*&nbsp;23&nbsp;&&nbsp;0xf)&nbsp;*&nbsp;0x10)&nbsp;+&nbsp;(key&nbsp;*&nbsp;13&nbsp;&&nbsp;0xf);<br />&nbsp;&nbsp;&nbsp;&nbsp;_icall_((void&nbsp;*)KeyArray[commgroup][commnum]&nbsp;-&nbsp;i);//键盘命令散转<br />&nbsp;&nbsp;}<br />}<br /><br /><br /><br /><br />/*------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;定时器T0中断服务程序(5mS)<br />------------------------------------*/<br />void&nbsp;t0proc()&nbsp;interrupt&nbsp;TF0_VECTOR&nbsp;using&nbsp;0<br />{<br />unsigned&nbsp;char&nbsp;key;<br />code&nbsp;unsigned&nbsp;char&nbsp;KeyPosTab[]&nbsp;=&nbsp;{0x80,&nbsp;0x40,&nbsp;0x20,&nbsp;0x10};<br />&nbsp;&nbsp;TL0&nbsp;=&nbsp;T0_5mS&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;TH0&nbsp;=&nbsp;T0_5mS&nbsp;&gt&gt&nbsp;8;<br />&nbsp;&nbsp;key&nbsp;=&nbsp;ReadKeyByte();//接收键盘数据(读74HC165)(每次可取多键)<br />&nbsp;&nbsp;if&nbsp;(key&nbsp;&&nbsp;KeyPosTab[SystemBuffers.TimeCount&nbsp;&&nbsp;0x03])&nbsp;{//有键压下(每次只取1键以实现“零耗时消除键盘抖动”)<br />&nbsp;&nbsp;&nbsp;&nbsp;SystemBuffers.KeyCount[SystemBuffers.TimeCount&nbsp;&&nbsp;0x03]&nbsp;++;//压键计数<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SystemBuffers.KeyCount[SystemBuffers.TimeCount&nbsp;&&nbsp;0x03]&nbsp;==&nbsp;2)&nbsp;{//短压键<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemBuffers.WaitTime&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyCommandExec(0,&nbsp;SystemBuffers.TimeCount&nbsp;&&nbsp;0x03);//单击键Key00()~Key03()<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SystemBuffers.LedWorkPosition)&nbsp;key&nbsp;=&nbsp;SysFastPushKeyTime;//50<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;key&nbsp;=&nbsp;SysPushKeyTime;//150//3S<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SystemBuffers.KeyCount[SystemBuffers.TimeCount&nbsp;&&nbsp;0x03]&nbsp;&gt=&nbsp;key)&nbsp;{//长压键X&nbsp;*&nbsp;20mS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemBuffers.WaitTime&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyCommandExec(2,&nbsp;SystemBuffers.TimeCount&nbsp;&&nbsp;0x03);//长压键Key20()~Key23()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemBuffers.KeyCount[SystemBuffers.TimeCount&nbsp;&&nbsp;0x03]&nbsp;=&nbsp;3;//清除长压键计数器(躲过单击键)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else&nbsp;{//无键压下(包括放键)<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SystemBuffers.KeyCount[SystemBuffers.TimeCount&nbsp;&&nbsp;0x03]&nbsp;&gt=&nbsp;2)&nbsp;{//放键事件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemBuffers.WaitTime&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyCommandExec(1,&nbsp;SystemBuffers.TimeCount&nbsp;&&nbsp;0x03);//键释放Key10()~Key13()<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;SystemBuffers.KeyCount[SystemBuffers.TimeCount&nbsp;&&nbsp;0x03]&nbsp;=&nbsp;0;//清除压键计数器<br />&nbsp;&nbsp;}<br />//...............................<br />}
 楼主| 西安周公 发表于 2008-4-25 13:06 | 显示全部楼层

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

  
hotpower 发表于 2008-4-25 13:12 | 显示全部楼层

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

  
yewuyi 发表于 2008-4-25 13:16 | 显示全部楼层

是正牌的周公吗?

印象里正牌的周公应该不会被这个问题困住把……
hotpower 发表于 2008-4-25 13:19 | 显示全部楼层

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

可以理解~~~
 楼主| 西安周公 发表于 2008-4-25 14:20 | 显示全部楼层

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

没办法,不知道的东西总是比知道的东西多。知之为知之,不知为不知。有玩过的说说经验当然是好事情了。<br />我的硬件连线有没有问题?
hotpower 发表于 2008-4-25 17:37 | 显示全部楼层

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

先发个并行数据锁存脉冲,再进行串行数据的2线SPI数据读取。
 楼主| 西安周公 发表于 2008-4-26 10:01 | 显示全部楼层

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

原发于WAVE6000说明书。
hotpower 发表于 2008-4-26 11:55 | 显示全部楼层

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

对不级联的电路,SER无用~~~<br /> 相关链接:<a href='http://www.zlgmcu.com/philips/yingrong/80c51/spi.pdf'>http://www.zlgmcu.com/philips/yingrong/80c51/spi.pdf</a>
 楼主| 西安周公 发表于 2008-4-26 12:40 | 显示全部楼层

非常感谢,已收藏

好象接法没什么不同,只是挂在串口。
hotpower 发表于 2008-4-26 18:15 | 显示全部楼层

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

  
 楼主| 西安周公 发表于 2008-4-26 20:45 | 显示全部楼层

主帖有了。

  
hotpower 发表于 2008-4-26 20:59 | 显示全部楼层

加NOP

是PLM51???
 楼主| 西安周公 发表于 2008-4-27 15:37 | 显示全部楼层

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

  
 楼主| 西安周公 发表于 2008-4-30 14:27 | 显示全部楼层

还是没玩转,改用164。

  
awey 发表于 2008-4-30 15:27 | 显示全部楼层

没理由的

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KDAT&nbsp;=&nbsp;1&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;KEY&nbsp;=&nbsp;0&nbsp;&nbsp;;&nbsp;&nbsp;/*&nbsp;变量赋&nbsp;0&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KLOAD&nbsp;=&nbsp;0&nbsp;&nbsp;;/*锁存按键状态*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KLOAD&nbsp;=&nbsp;1&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DO&nbsp;&nbsp;N&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;TO&nbsp;&nbsp;7&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;&nbsp;KDAT&nbsp;=&nbsp;0&nbsp;&nbsp;THEN&nbsp;&nbsp;KEY&nbsp;=&nbsp;KEY&nbsp;OR&nbsp;01H&nbsp;&nbsp;;;/*读口状态*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KCLK&nbsp;=&nbsp;1&nbsp;&nbsp;;/*时钟变高*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KEY&nbsp;=&nbsp;ROL&nbsp;(&nbsp;KEY&nbsp;,&nbsp;1&nbsp;)&nbsp;&nbsp;;/*字节左移*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KCLK&nbsp;=&nbsp;0&nbsp;&nbsp;;;/*时钟变低*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END&nbsp;&nbsp;;<br />============================================================<br />不懂你上面的程序,与下面的C程序有何不同?<br /><br />for(N=0;N&lt8;N++){<br />&nbsp;&nbsp;&nbsp;&nbsp;if(!KDAT)&nbsp;KEY&nbsp;=&nbsp;KEY&nbsp;|&nbsp;01H;<br />&nbsp;&nbsp;&nbsp;&nbsp;KCLK&nbsp;=&nbsp;1&nbsp;&nbsp;;/*时钟变高*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KEY&nbsp;=&nbsp;KEY&lt&lt1&nbsp;&nbsp;&nbsp;;/*字节左移*/<br />&nbsp;&nbsp;&nbsp;&nbsp;KCLK&nbsp;=&nbsp;0&nbsp;&nbsp;;/*时钟变低*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}
 楼主| 西安周公 发表于 2008-4-30 16:37 | 显示全部楼层

一样。前面多了个锁存。

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

157

帖子

0

粉丝
快速回复 返回顶部 返回列表