找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机标志位出错,新手请求指导

[复制链接]
跳转到指定楼层
楼主
本帖最后由 H方与圆H 于 2019-9-17 23:34 编辑

新手向大家请教一个关于标志位的问题,当直接给P1口赋值时,无任何问题。当使用标志位时出错,按下按键后0xfe与0xf7交替闪烁,再次按按键停在0xf7。
单片机源程序如下:
#include<reg52.h>           //头文件
#define uchar unsigned char //宏定义,定义无符号字符型变量数据
#define uint unsigned int   //宏定义,定义无符号字符型变量数据
uchar a,b,c;
void delay(uint z);         //带无符号整型变量子函数
void bc();
void key();
void main()
{
    P1=0x7f;                //P1口赋初值
    b=1;                    //标志位赋初值
    c=1;                    //标志位赋初值
    while(1)
    {
        key();
        bc();
    }
}

void delay(uint z)          //带无符号整型变量延时子函数
{
    uint x,y;               //声明无符号整型变量
    for(x=z;x>0;x--)        //求解表达式一;求解表达式二,若为真则执行内部
        for(y=110;y>0;y--); //语句,然后求解表达式三,反之则结束跳出
}

void bc()
{
    if(b==0)                 //检测标志位值
        P1=0xfe;
    if(c==0)                //检测标志位值
        P1=0xf7;

}

void key()
{
    P3=0xfe;               //P3口赋初值,扫描P3口
    a=P3;                  //声明,a等于P3,将P3的值赋给a
    a=a&0xf0;              //“与”运算,检测是否有按键按下
    if(a!=0xf0)            //“!=”测试a不等于0xf0,再次测试是否有键按下
   {
        delay(5);          //延时五毫秒   
        a=P3;              //将现在的a重新赋给P3
        a=a&0xf0;          //再次与运算,以确认按键是否被按下
        if(a!=0xf0)        //检测是否有键按下,若有则执行内部语句若无则结束跳出
        {   
          //P1=0xfe;
          b=0;             //标志位赋值
        }   
        while(a!=0xf0)         //检测按键是否松开
        {                  
             a=P3;              //赋值
             a=a&0xf0;          //与运算                      if(a==0xf0)
            {
                //  P1=0xf7;
                  c=0;         //标志位赋值
             }   
         }         

     }
}  

-3ca6ad3fd30b49b9.jpg (69.32 KB, 下载次数: 42)

松开按键(P1直接赋值)

松开按键(P1直接赋值)

18f6fbe548c3d299.jpg (85.85 KB, 下载次数: 46)

按下按键(P1直接赋值)

按下按键(P1直接赋值)

1ecc535b05718c0f.jpg (106.66 KB, 下载次数: 44)

进入程序(P1直接赋值)

进入程序(P1直接赋值)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:462827 发表于 2019-9-18 09:31 | 只看该作者
把文件全打包了发上来呀,包括仿真文件和项目文件、源码。
回复

使用道具 举报

板凳
ID:275826 发表于 2019-9-18 11:01 | 只看该作者
你这程序,标志位都没有复位,当然有问题
回复

使用道具 举报

地板
ID:601863 发表于 2019-9-18 21:34 | 只看该作者
tyrl800 发表于 2019-9-18 11:01
你这程序,标志位都没有复位,当然有问题

谢谢指点,但是我现在将标志位复位,依然有问题。
void bc()
{
    if(b==0)                 //检测标志位值
    {              
        P1=0xfe;
        if(P1==0xfe)       //检测LED状态
        {     
             b=1;            //标志位复位
         }
     }
    if(c==0)                //检测标志位值
    {        
        P1=0xf7;
        if(P1==0xf7)      //检测LED状态
        {
            c=1;            //标志位复位
        }
     }   
}
  
我改成这样之后,开始没问题,当我按下按键无任何反应变化,松开按键直接点亮0xf7然后常亮。不论怎么按按键都无任何反应变化。
中间按下按键这部分看上去是被跳过了,但是我用直接给P1口赋值和把C屏蔽掉测试发现这部分并没被跳过。但是仿真实际表现是跳过了。
回复

使用道具 举报

5#
ID:601863 发表于 2019-9-18 21:37 | 只看该作者
hantu 发表于 2019-9-18 09:31
把文件全打包了发上来呀,包括仿真文件和项目文件、源码。

上传压缩包?我没注意到在哪儿上传呀?
回复

使用道具 举报

6#
ID:213173 发表于 2019-9-19 09:28 | 只看该作者
H方与圆H 发表于 2019-9-18 21:34
谢谢指点,但是我现在将标志位复位,依然有问题。
void bc()
{

楼主去掉所有多余语句加标志复位就行了
  1. #include<reg52.h>           
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar a,b,c;

  5. void delay(uint z)
  6. {
  7.     uint x,y;   
  8.     for(x=z;x>0;x--)
  9.         for(y=110;y>0;y--);
  10. }
  11. void key()
  12. {
  13.         P3=0x0f;
  14.         if(P3!=0x0f)
  15.         {
  16.                 delay(5);
  17.                 if(P3!=0x0f)
  18.                 {   
  19.                         if(P3==0x0e)
  20.                                 b=0;
  21.                         if(P3==0x0d)
  22.                                 c=0;
  23.                 }
  24.         }
  25. }
  26. void bc()
  27. {
  28.     if(b==0)
  29.     {              
  30.                 P1=0xfe;
  31.                 b=1;
  32.         }
  33.     if(c==0)
  34.         {        
  35.                 P1=0xf7;
  36.                 c=1;
  37.         }   
  38. }
  39. void main()
  40. {
  41.     P1=0x7f;                //P1口赋初值
  42.     b=1;                    //标志位赋初值
  43.     c=1;                    //标志位赋初值
  44.     while(1)
  45.     {
  46.         key();
  47.         bc();
  48.     }
  49. }
  50.   
复制代码
回复

使用道具 举报

7#
ID:601863 发表于 2019-9-19 15:43 | 只看该作者
wulin 发表于 2019-9-19 09:28
楼主去掉所有多余语句加标志复位就行了

非常感谢您的热心指点,不过您是让它第二个按键按下去亮0xf7,我是想利用标志位让它松手的时候亮0xf7。谢谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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