找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 861|回复: 6
收起左侧

各位大佬这单片机电路怎么按键了没反应?麻烦帮我看看程序

[复制链接]
ID:1052650 发表于 2022-11-23 20:07 | 显示全部楼层 |阅读模式
50黑币
开始时,第一个灯闪烁,时间间隔为1s。当按下按键后,八个灯闪烁,时间间隔为 2s;若在时间间隔为4s时按下按键,则进入呼吸灯模式,八个灯从亮到暗,再由暗到亮如此循环;再次按下按键,则恢复最初状态(第一个灯闪烁,间隔1s)。要求是这样子的,仿真图在最后,感谢各位
0.png

单片机源程序如下:
  1. #include <REGX51.H>

  2. unsigned char a[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  3. int count0=0,count1=0,count=0,num0=0,num1=0;
  4. int temp=1,temp1=1,temp2=1,n=0,flag=0;

  5. void delay()
  6. {
  7.         unsigned char i,j;
  8.         for(i=0;i<20;i++){
  9.                 for(j=0;j<120;j++);
  10.         }
  11. }
  12. void inittimer0()
  13. {
  14.         TMOD=0x01;
  15.         TH0=(65536-50000)/256;
  16.         TL0=(65536-50000)%256;
  17.         TR0=1;
  18.         EA=1;
  19.         ET0=1;
  20. }
  21. void display(){
  22.         int i;
  23.         for(i=0;i<8;i++){
  24.                 delay();
  25.                 delay();
  26.                 delay();
  27.                 delay();
  28.                 delay();
  29.                 P2=~a[i];
  30.         }
  31.         for(i=7;i>1;i--){
  32.                 delay();
  33.                 delay();
  34.                 delay();
  35.                 delay();
  36.                 delay();
  37.                 P2=~a[i];
  38.         }
  39. }

  40. void button_scan(){
  41.         delay();
  42.         if(P1_0!=1&&n>3) {temp=temp?0:1;}
  43.         else if(P1_0!=1){flag=1;temp2=0;}
  44.         while(P1_0==0);
  45. }

  46. void main(){
  47.         inittimer0();
  48.         while(1){
  49.                 button_scan();
  50.                 if(temp==1){
  51.                         P2=0xff; //±£3ÖLEDè«°μ
  52.                         P2_0=num0;
  53.                 }
  54.                 else if(temp1!=temp ){
  55.                         display();
  56.                 }
  57.                 else if(flag){
  58.                         P2=num1;
  59.                 }
  60.         }
  61. }
  62. void timer0_isr() interrupt 1
  63. {
  64.         TH0=(65536-50000)/256;
  65.         TL0=(65536-50000)%256;
  66.         count0++;
  67.         count1++;
  68.         count++;
  69.         if(count>=20) {
  70.                 n++;
  71.                 count=0;
  72.                 if(n>=4) {n=0;}
  73.         }
  74.         if(count0>=20&&!temp2){
  75.                 num0=num0?0:1;
  76.                 count0=0;
  77.         }
  78.         else if(count1>=40){
  79.                 num1=~num1;
  80.                 count1=0;
  81.         }
  82. }
复制代码

回复

使用道具 举报

ID:1034262 发表于 2022-11-24 09:51 | 显示全部楼层
示波器看看按键时IO有变化吗?有变化就是电路有反应。
回复

使用道具 举报

ID:1052650 发表于 2022-11-24 16:18 来自手机 | 显示全部楼层
coody_sz 发表于 2022-11-24 09:51
示波器看看按键时IO有变化吗?有变化就是电路有反应。

按了后p1.0口有反应,但是p2口没反应。。没有变化成下面俩种模式,
回复

使用道具 举报

ID:161164 发表于 2022-11-24 17:58 | 显示全部楼层
代码逻辑太混乱了
理一下逻辑,画一画流程图
回复

使用道具 举报

ID:1052650 发表于 2022-11-24 19:44 来自手机 | 显示全部楼层
lkc8210 发表于 2022-11-24 17:58
代码逻辑太混乱了
理一下逻辑,画一画流程图

终于找到哪里逻辑错了。大佬有没有优化的方法
回复

使用道具 举报

ID:1049152 发表于 2023-1-12 14:59 | 显示全部楼层
把你要实现的状态分几个函数写好,定义一个变量,按一下按键变量加1,有几种状态就加到几,大于之后清零如此循环。
回复

使用道具 举报

ID:1049152 发表于 2023-1-12 15:00 | 显示全部楼层
变量是几就执行第几个函数就行了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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