找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 950|回复: 7
打印 上一主题 下一主题
收起左侧

新手小白求助,为什么按键不能正常工作

[复制链接]
跳转到指定楼层
楼主
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1138816 发表于 2024-12-7 09:05 | 只看该作者
AT89C51的Proteus仿真
回复

使用道具 举报

板凳
ID:277550 发表于 2024-12-7 09:16 | 只看该作者
数码管、led太占时间,key 应该使用中断、连接到中断的PIN,如P3^2。程序中使用全局变量定义是否按键了,然后中断函数改变就是值,l数码管程判断、…………。
回复

使用道具 举报

地板
ID:583948 发表于 2024-12-7 11:14 | 只看该作者
程序是顺序执行的,你的led函数里面执行的时间至少大于3000ms了,很简单来说,当你按按键的时候,其实单片机正在执行led函数里面的内容,所以你的按键程序并没有执行,也就不会起作用了。解决办法:
如评论区所言,按键修改为中断,最直接有效;
其次就是降低led函数执行时间,可以采用时间片、状态机等程序结构,加按键扫描一样能实现你想要的功能
回复

使用道具 举报

5#
ID:1138816 发表于 2024-12-7 14:37 | 只看该作者
devcang 发表于 2024-12-7 09:16
数码管、led太占时间,key 应该使用中断、连接到中断的PIN,如P3^2。程序中使用全局变量定义是否按键了,然 ...

谢谢佬
回复

使用道具 举报

6#
ID:1138816 发表于 2024-12-7 14:37 | 只看该作者
zpwgf 发表于 2024-12-7 11:14
程序是顺序执行的,你的led函数里面执行的时间至少大于3000ms了,很简单来说,当你按按键的时候,其实单片 ...

明白了,谢谢佬
回复

使用道具 举报

7#
ID:1133081 发表于 2024-12-7 15:33 | 只看该作者


  1. #include <reg52.h>

  2. sbit key0 = P2^7;

  3. unsigned char code table[]={//共阳数码管段码
  4.                 0xc0,0xf9,0xa4,0xb0,
  5.                 0x99,0x92,0x82,0xf8,
  6.                 0x80,0x90,0x88,0x83,
  7.                 0xc6,0xa1,0x86,0x8e};
  8. unsigned char num=0;
  9. unsigned int temp=0;
  10. bit flag=0;
  11. bit mark=0;

  12. void InitTimer0(void)
  13. {
  14.     TMOD = 0x01;
  15.     TH0 = 0xD8;
  16.     TL0 = 0xF0;
  17.     EA = 1;
  18.     ET0 = 1;
  19.     TR0 = 1;
  20. }

  21. void key()
  22. {
  23.         static int count=0;
  24.         static bit sign=0;
  25.         if(!key0)
  26.         {
  27.                 if(++count>=100 && sign==0)//消抖+自锁       
  28.                 {
  29.                         sign=1;
  30.                         flag=~flag;
  31.                 }
  32.         }
  33.         else
  34.         {
  35.                 count=0;
  36.                 sign=0;
  37.         }
  38. }

  39. void Timer0Interrupt(void) interrupt 1//中断周期10ms
  40. {
  41.         static int i;
  42.         TH0 = 0xD8;
  43.         TL0 = 0xF0;
  44.         if(++i>=100)//1秒
  45.         {
  46.                 i=0;
  47.                 if(!flag)num=++num%10;//循环计数0~9       
  48.                 mark=~mark;
  49.         }
  50. }

  51. void main(void)
  52. {
  53.     InitTimer0();
  54.     while (1)
  55.     {
  56.                 key();
  57.                 if(!flag)
  58.                 {
  59.                         temp=0x01<<num;
  60.                         P0=temp;                                //P0显示temp的低8位
  61.                         P1=temp>>8|0xfc;        //P1.0、P1.1显示temp的9、10位,P1.2~1.7保持原来电平不变
  62.                         P2=table[num]|0x80;//P2.7保持高电平不变
  63.                 }
  64.                 else
  65.                 {
  66.                         if(mark)
  67.                         {
  68.                                 P0=0x00;
  69.                                 P1&=0xfc;//P1.2~1.7保持原来电平不变
  70.                         }
  71.                         else
  72.                         {
  73.                                 P0=0xff;
  74.                                 P1|=0x03;//P1.2~1.7保持原来电平不变
  75.                         }
  76.                 }
  77.    }
  78. }
复制代码



回复

使用道具 举报

8#
ID:1138816 发表于 2024-12-7 16:18 | 只看该作者
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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