王昱顺 发表于 2023-9-26 16:35:07

本帖最后由 王昱顺 于 2023-9-26 16:40 编辑

朱家臣 发表于 2023-9-26 15:19
STC90C52RC,三极管是数码管驱动,其他电路看懂了,也调试好了,主要是按键电路,不知是矩阵还是独立,还是 ...
这么老的单片机是没有ADC功能的,所以必须要用矩阵或者独立按键。
矩阵按键代码写着稍微麻烦一点,独立按键写代码较为容易。
如果用独立按键的话,可以使用
if(P01==0)
{
    //此处写按键处理程序
}
判断引脚低电平进行实现,老的单片机最好外部加入上拉电阻
具体电路如图所示,KEY1连接单片机引脚
(当然了,这是在改动你的原理图的情况下实现的)





王昱顺 发表于 2023-9-26 16:55:05

朱家臣 发表于 2023-9-26 15:19
STC90C52RC,三极管是数码管驱动,其他电路看懂了,也调试好了,主要是按键电路,不知是矩阵还是独立,还是 ...

我仔细看了一下,如果用你这个电路原理图的话。

按键的这个接法应该是用来在扫描数码管的间隙实现读取按键状态。
我简化了一下你的单路状态原理图


那么程序流程应该是:
首先P01控制数码管单段动态刷新,在P01为0的时候如果按键SW2按下,则D17的负极为0,正极因为按键按下导通而得到1。
所以D17导通,此时因为D17正极的1是通过10K上拉电阻实现的,不如P01的0驱动能力强,所以P17被拉到0。
所以此时读到P17为0就可以判断是SW2按下。
以此类推,只要保证动态扫描的时候P00到P06同时只有一个端口为0,就可以通过为零的端口判断是哪一个按键按下了。

朱家臣 发表于 2023-9-26 18:52:16

王昱顺 发表于 2023-9-26 16:55
我仔细看了一下,如果用你这个电路原理图的话。

按键的这个接法应该是用来在扫描数码管的间隙实现读取按 ...

void main ()
{

if( P17==0)
        {
          P0=0x82;
          P1=0xfb;
        }
        else
        {
          P0=0x92;
          P1=0xf7;

        }
       
}按你的理解,我主程序中写了这个代码结果我安下按键显示没有变化一直显示5

朱家臣 发表于 2023-9-26 18:54:41

我认为按下P17是0的话应显示6,不按显示5,结果不论按不按都 显示是5

王昱顺 发表于 2023-9-26 19:18:57

朱家臣 发表于 2023-9-26 18:52
void main ()
{



用静态显示的方案肯定是不能兼顾同时扫描按键和显示的
如果你单纯想要测试按键的话,可以试一下这段代码
if(P17==0)
    {
      P0 = 0xfd;//P01口拉低
    }else
    {
      P0 = 0xfe;//P00口拉低
    }
这个需要使用万用表量一下P01是否在按下S1后从高电平变化为低电平

朱家臣 发表于 2023-9-27 11:09:38

王昱顺 发表于 2023-9-26 19:18
用静态显示的方案肯定是不能兼顾同时扫描按键和显示的
如果你单纯想要测试按键的话,可以试一下这段代码
...

P01就是低电平,控不控下都是低电平,只是P17控下S1P17电平从5V变为3.6V

王昱顺 发表于 2023-9-27 14:53:52

本帖最后由 王昱顺 于 2023-9-27 14:55 编辑

朱家臣 发表于 2023-9-27 11:09
P01就是低电平,控不控下都是低电平,只是P17控下S1P17电平从5V变为3.6V
"P17电平从5V变为3.6V"
==那证明你这个端口上用的上拉电阻有点小了,上拉效果太强,导致电平无法被识别为0,3.6V的话肯定会被识别成高电平1的
”P01就是低电平,控不控下都是低电平“
==不能控制那么就没办法分辨出来到底是哪个按键按下了,只能识别按下这个操作

朱家臣 发表于 2023-9-27 18:36:10

是的这样的王工.但想不通原设计者是如何达到的,这个是别人成熟的产品用别人编译的代码是可以的

朱家臣 发表于 2023-9-27 18:37:03

论如何也要谢谢王工这几天解答

朱家臣 发表于 2023-9-27 18:38:12

王工现在哪个城市,我在宁波有机会来宁来找我玩
页: 1 [2] 3
查看完整版本: 单片机按键