找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1145|回复: 13
收起左侧

想看看自己的单片机程序哪里错了,求大神指教

[复制链接]
ID:1061638 发表于 2023-1-27 19:12 | 显示全部楼层 |阅读模式
程序
#include    "reg51.h"

sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^3;
typedef unsigned char u16;
typedef  unsigned int  u8;
sbit LED1=P2^0;

#define KEY1_PRESS  1;
#define KEY2_PRESS  2;
#define KEY3_PRESS  3;
#define KEY1_UNPRESS  0;
void delay_10us(u8 ten_us)
{
回复

使用道具 举报

ID:883242 发表于 2023-1-27 21:33 | 显示全部楼层
#define 那一行不可以加;
回复

使用道具 举报

ID:155507 发表于 2023-1-27 22:13 | 显示全部楼层
语焉不详、去头掐尾也是爱莫能助的了。。。

代码只有片段,这样没法完整去找问题

寻求解决问题的正确方式:
问题背景描述
问题现象
为解决问题做了哪些尝试?有啥效果?
回复

使用道具 举报

ID:1061638 发表于 2023-1-28 12:27 | 显示全部楼层
angmall 发表于 2023-1-27 22:13
语焉不详、去头掐尾也是爱莫能助的了。。。

代码只有片段,这样没法完整去找问题

#include    "reg51.h"

sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
typedef unsigned char u16;
typedef  unsigned int  u8;
sbit LED1=P2^0;

#define KEY1_PRESS  1;
#define KEY2_PRESS  2;
#define KEY3_PRESS  3;
#define KEY_UNPRESS  0;
void delay_10us(u8 ten_us)
{
        while(ten_us--);
       
}
u16 key_scan(u16  mode)
{
     static  u16 key=1;
           if(mode)key=1;
       
        if(key=1&&(KEY1==0||KEY2==0||KEY3==0))
  {
                delay_10us(1000);
        key=0;
  if(KEY1==0)
                return  KEY1_PRESS;
   else if(KEY2==0)
                 return KEY2_PRESS;
         else if(KEY3==0)
         return  KEY3_PRESS;
         
}
else if(KEY1==1&&KEY2==1&&KEY3==1)
{
         key=1;
       
}
return KEY_UNPRESS;

               
        }



void main()
{
        u16 key=0;
       
        while(1)
        {
               
         key=key_scan(0);
               
                if (key==KEY1_PRESS)
                LED1=!LED1;
                       
                       
                }
        }
回复

使用道具 举报

ID:1061638 发表于 2023-1-28 12:31 | 显示全部楼层
angmall 发表于 2023-1-27 22:13
语焉不详、去头掐尾也是爱莫能助的了。。。

代码只有片段,这样没法完整去找问题

哥我又发了一个完整的请您帮看一下呗,拜托了
回复

使用道具 举报

ID:155507 发表于 2023-1-28 13:39 | 显示全部楼层
我能骗你吗 发表于 2023-1-28 12:31
哥我又发了一个完整的请您帮看一下呗,拜托了

给你改了,对比一下就知道哪里错了。




  1. #include "reg51.h"

  2. sbit KEY1=P3^1;
  3. sbit KEY2=P3^0;
  4. sbit KEY3=P3^2;
  5. typedef unsigned char u16;
  6. typedef  unsigned int  u8;
  7. sbit LED1=P2^0;

  8. #define KEY1_PRESS   1  //; <----#define 那一行不可以加;
  9. #define KEY2_PRESS   2  //; <----#define 那一行不可以加;
  10. #define KEY3_PRESS   3  //; <----#define 那一行不可以加;
  11. #define KEY_UNPRESS  0  //; <----#define 那一行不可以加;
  12. void delay_10us(u8 ten_us)
  13. {
  14.     while(ten_us--);
  15.       
  16. }
  17. u16 key_scan(u16  mode)
  18. {
  19.     static  u16 key=1;
  20.     if(mode)key=1;
  21.       
  22.     if(key=1&&(KEY1==0||KEY2==0||KEY3==0))
  23.     {
  24.         delay_10us(1000);
  25.         key=0;
  26.           if(KEY1==0)
  27.                 return  KEY1_PRESS;
  28.           else if(KEY2==0)
  29.                  return KEY2_PRESS;
  30.       else if(KEY3==0)
  31.          return  KEY3_PRESS;
  32.          
  33.         }
  34.         else if(KEY1==1&&KEY2==1&&KEY3==1)
  35.         {
  36.                          key=1;
  37.       
  38.         }
  39.         return KEY_UNPRESS;

  40.                
  41. }



  42. void main()
  43. {
  44.     u16 key=0;
  45.    
  46.     while(1)
  47.     {
  48.            
  49.        key=key_scan(0);
  50.            
  51.         if (key==KEY1_PRESS)
  52.         LED1=!LED1;
  53.                
  54.                
  55.     }
  56. }
  57.                
复制代码
回复

使用道具 举报

ID:213173 发表于 2023-1-28 14:56 | 显示全部楼层
我能骗你吗 发表于 2023-1-28 12:27
#include    "reg51.h"

sbit KEY1=P3^1;

要看你想达到什么目的
回复

使用道具 举报

ID:723161 发表于 2023-1-28 15:54 | 显示全部楼层
u16是int一般 u8是char
回复

使用道具 举报

ID:723161 发表于 2023-1-28 16:05 | 显示全部楼层
第20行那里     if(key=1&&(KEY1==0||KEY2==0||KEY3==0))

是不是应该是key==1
回复

使用道具 举报

ID:1061638 发表于 2023-1-28 17:18 | 显示全部楼层
angmall 发表于 2023-1-28 13:39
给你改了,对比一下就知道哪里错了。

谢谢哥,这个主函数我没太理解,能不能帮忙讲一下
回复

使用道具 举报

ID:1061638 发表于 2023-1-28 17:22 | 显示全部楼层

为啥那兄弟
回复

使用道具 举报

ID:723161 发表于 2023-1-29 09:38 | 显示全部楼层
这个不影响 主要是20行那里if(key=1&&(KEY1==0||KEY2==0||KEY3==0))      key==1  不是key=1   一个等于号是赋值 不是判断
回复

使用道具 举报

ID:596109 发表于 2023-1-29 10:46 | 显示全部楼层
if(key=1&&(KEY1==0||KEY2==0||KEY3==0))  &&前面应该是key==1
    {
        delay_10us(1000);
        key=0;
          if(KEY1==0)
                return  KEY1_PRESS;  
回复

使用道具 举报

ID:596109 发表于 2023-1-29 11:14 | 显示全部楼层
key_scan函数里的delay_10us(1000);应该换到main函数的循环里,否则按下按键1后,因为key值一直为KEY1_PRESS,所以函数会一直执行if (key==KEY1_PRESS)    LED1=!LED1;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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