找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机小白诚心向黑友请教几个程序问题 附程序

[复制链接]
SHANWAZI 发表于 2020-12-24 17:47 | 显示全部楼层 |阅读模式
诚心向师傅请教几个问题:程序实现的功能是按键按一下led样式切换一个,功能是实现了但是有几个问题
如下:
1按键按下的时候切换时响应速度延时较大大概为一秒钟切换不知道知道这是怎么回事?
2按键一直按下的时候如果不加按键松开检测计数值k会一直  +1 导致led变化变成流水作业一直循环如果要加按键松开检测的话要加在哪里呢?
以下为实验程序欢迎各位师傅来赐教。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define YSHUSL 4         
void delay(uint);
uchar a,b,c,d,e,f,g,k,i;


//*********************************************************************
sbit ANJXZ4=P3^3;
//*************************《按键函数》********************************
void key()
{
        if(ANJXZ4==0)
        {
                delay(2);
                        if(ANJXZ4==0)
                {
                                k++;
                                        if(k>YSHUSL)        
                                                k=1;
                }                                
        }
}
//*******************************************************************************//                          
void main(void)
{        
                i=1;
                k=1;
                a=0x3f;//
                b=0xfc;//
                c=0x3c;//
                d=0xe7;//


                g=0xff;//
                        
        while(i)
                {
                        switch(k)        
                        {
                        case(1):
                                        P2=a;
                                        delay(500);
                                        P2=g;
                                        delay(500);
                                        key();
                                        if(ANJXZ4==0)break;
                                        break;                        
//****************************************************************************//
                        case(2):
                                        P2=b;
                                        delay(500);
                                        P2=0xff;
                                        delay(500);
                                        key();
                                        if(ANJXZ4==0)break;
                                        break;
//***************************************************************************//
                                        case(3):
                                                P2=c;
                                                delay(500);
                                                P2=0xff;
                                                delay(500);
                                                key();
                                                if(ANJXZ4==0)break;
                                                break;
//*******************************************************************************//                        
                                        case(4):
                                                P2=d;
                                                delay(500);
                                                P2=0xff;
                                                delay(500);
                                                key();
                                                if(ANJXZ4==0)break;
                                                break;


//***************************************************************************//
                        }                                                
                }
        }
//********************************************************************//






//**************************《延时子程序》*********************************//                        
void delay(uint xms)
{
        uint k,p;
                for(k=xms;k>0;k--)
                        for(p=114;p>0;p--);


}
//********************************************************************//

回复

使用道具 举报

piaoyes 发表于 2020-12-24 19:32 来自手机 | 显示全部楼层
手机不方便写,具体如图
IMG_20201224_193052.jpg
IMG_20201224_192808.jpg
回复

使用道具 举报

 楼主| SHANWAZI 发表于 2020-12-25 08:53 | 显示全部楼层
piaoyes 发表于 2020-12-24 19:32
手机不方便写,具体如图

首先非常感谢您在百忙之中抽空来为我问题提供解答看见您在上面按键红色字体解答中小弟有以下不解还请指点迷津!
1:您的意思是按键松开检测放在按键确实按下的语句后面    当按键一直按下时则对按键进行取反让while();循环0被取反为1条件不成立导致程序停在while();里是吗?
2:按键松开后while();循环判断条件1被取反为0条件成立而跳出while();循环  此时则视为按键松开?
按键松开后跳出循环执行下面语句即:k++;不知道您上面红色字体意思是不是等按键松开后再执行k++?还是先判断k是否溢出后再k++?
3:奇怪了case里面的语句的延时怎么会影响按键切换呢?    key();按键函数只是对k就行k+1的操作并不会立即执行加完后还是会回到case里面来执行第一个break句号前的语句即if(ANJXZ4==0)那么这条语句是只有按键按下后才会执行第一次退出当前执行的case  跳出后再遇到break;再跳出到大循环while里面的的大括号中第一条语句即switch(k)重新匹配新的case是不是可以认为按键切换的延时来自于这个过程呢?
此时的k也加1了变为2将跳到第二个case里面执行因为k的值并没有进行清零大于4后清零所以会让第二个case一直循环执行。
回复

使用道具 举报

wufeng391 发表于 2020-12-25 09:35 | 显示全部楼层
应该说是你的按键检测程序的思路不太好。建议去看下其它视频教程上关于按键检测的内容。延时按键检测的思路会使整个程序的运行效率大大降低。如果通过扫描按键状态并进行判断的方法会好很多!
回复

使用道具 举报

 楼主| SHANWAZI 发表于 2020-12-25 12:26 | 显示全部楼层
wufeng391 发表于 2020-12-25 09:35
应该说是你的按键检测程序的思路不太好。建议去看下其它视频教程上关于按键检测的内容。延时按键检测的思路 ...

非常感谢您指出此程序的弊端    而后通过软件仿真得知是我的按键检测思路有问题目前还在学习阶段!!!!
回复

使用道具 举报

人人学会单片机 发表于 2020-12-25 12:48 | 显示全部楼层
《人人学会单片机》视频教程  原子哥网站全部投放
回复

使用道具 举报

 楼主| SHANWAZI 发表于 2020-12-25 14:43 | 显示全部楼层
人人学会单片机 发表于 2020-12-25 12:48
《人人学会单片机》视频教程  原子哥网站全部投放

非常感谢  我去补补脑去!!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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