找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1076|回复: 11
收起左侧

PIC16F616单片机程序编译哪里出了问题?

[复制链接]
ID:72649 发表于 2023-2-20 15:09 | 显示全部楼层 |阅读模式
#include "pic.h"
//__CONFIG(INTIO&WDTDIS&BOREN);                        //PICC9.80版本配置字写法
//__CONFIG(FOSC_INTRCIO&WDTE_OFF&BOREN_ON&MCLRE_ON);                //PICC9.83版本配置字写法0000   0000  0101
#define __CONFIG(ox0005)                //芯片PIC16F616
/*使用内部RC振荡器,关闭看门狗,*/

#define L_KEY1 RC3  //E3
#define M_KEY1 RC4  //E2
#define H_KEY1 RC5  //E1

#define JR1_JDQ  RC0
#define JS_JDQ   RC1
#define FMQ      RC2

#define uchar unsigned char                //无符号字符型简写成uchar
#define uint unsigned int                //无符号整形简写成uint
uint  i=0,j=0;

uint ledFlashCnt = 0;        //ERR_LED指示灯闪烁周期计数
uchar Flag2ms = 0;
uchar u8Flag15min = 0;        //15分钟到标志

void delay_1ms(void);                                //函数声明
void delay_nms(uint var);

void delay_1ms(void)     //此函数在4M晶体下产生10003us的延时,也就是10MSus
{
        unsigned int d=1000;
        while(--d){;}
}


void delay_nms(uint var)//延时单位为毫秒,最多延时65.535秒(65535mS)
{
        while(var--)
        {
                delay_1ms();
                CLRWDT(); //喂狗
        }
}

void init()
{
    TRISC = 0x38;                //RB0、RB1、RB2设为输出,RB3、RB4、RB5设为输入0011 1000
    PORTC = 0x3a;                //RB初始值0011 1100
}

#define d_s(s) delay_nms((s)*100ul)//延时单位为秒

void main(void)
{
    INTCON = 0;             //暂禁止所有中断
    init();

        while(1)
        {        
            if(L_KEY1==1 & M_KEY1==1 & H_KEY1 ==1)    //一、 三个开关全部断开高电平 111,
                       
                        {
                                JS_JDQ = 0;           //JS_JDQ关闭
                                d_s(1);//延时1秒
                FMQ = 1;                 //JS_JDQ打开
                d_s(1);//延时1秒
                                JR1_JDQ = 0;          //JR1_JDQ关闭
                                                               
                                if(!u8Flag15min)
                                {
                                        if(Flag2ms)
                                         {
                                                Flag2ms=0;

                                                if(i<0xFFFF)
                                                        i++;
                                                if(i>=30000)   //60000ms,1分钟
                                                {
                                                        i=0;
                                                        j++;
                                                }
                                                if(j>=15)  
                                                {
                                                        u8Flag15min = 1;
                                                        JS_JDQ = 0;
                                                        JR1_JDQ = 0;
                                                }
                                    }
                                }
                                else        //15分钟到,开关没有动作
                                                            //也就是开关一直断开高电平,则        FMQ工作JS_JDQ、JR1_JDQ关
                                {
                                        if (ledFlashCnt>=500) //500*2=1000ms
                                        {
                                                ledFlashCnt = 0;
                                                 FMQ ^= 1;
                                        }
                                }
                        }
                       
                        else if(L_KEY1==0 & M_KEY1==1 & H_KEY1 ==1)    //二、开关011时, JS_JDQ开,FMQ、JR1_JDQ关
                        {   
                            d_s(3);//延时3秒
                                JS_JDQ = 1;                              
                            d_s(1);//延时1秒
                              
                FMQ = 0;
                                d_s(5);//延时5秒
                              
                                JR1_JDQ = 0;
                            d_s(3);//延时3秒
                        }
                       
                        else if(L_KEY1==0 & M_KEY1==0 & H_KEY1 ==1)    //三、开关001时, JS_JDQ、JR1_JDQ开,FMQ关
                        {
                            d_s(3);//延时1秒
                                JS_JDQ = 1;
                FMQ = 0;
                                d_s(5);//延时1秒
                                JR1_JDQ = 1;
                        }

                        else if(L_KEY1==0 & M_KEY1==0 & H_KEY1 ==0)    //四、开关000时,JR1_JDQ开,FMQ、JS_JDQQ关
                       
                        {
                            d_s(5);//延时1秒
                            JR1_JDQ =1;
                            d_s(3);//延时1秒
                                JS_JDQ = 0;FMQ = 0;
                d_s(1);//延时1秒
                        }                       
        }
}
回复

使用道具 举报

ID:86926 发表于 2023-2-21 08:20 | 显示全部楼层
按照语法,if(L_KEY1==0 & M_KEY1==1 & H_KEY1 ==1)应该是用逻辑与&&,而不是位与&;还有FMQ ^= 1;不知道编译器是按照0x01来异或,还是一位异或;用FMQ ~= FMQ;应该也是可以的
回复

使用道具 举报

ID:72649 发表于 2023-2-21 19:24 来自手机 | 显示全部楼层
蓝魄 发表于 2023-2-21 08:20
按照语法,if(L_KEY1==0 & M_KEY1==1 & H_KEY1 ==1)应该是用逻辑与&&,而不是位与&;还有FMQ ^= 1;不知道编 ...

用逻辑与&&不是改变判断条件了?另外这种语句在九齐单片机编译环境能通过。
回复

使用道具 举报

ID:72649 发表于 2023-2-21 19:25 来自手机 | 显示全部楼层
蓝魄 发表于 2023-2-21 08:20
按照语法,if(L_KEY1==0 & M_KEY1==1 & H_KEY1 ==1)应该是用逻辑与&&,而不是位与&;还有FMQ ^= 1;不知道编 ...

为什么: if(L_KEY1==1 & M_KEY1==1 & H_KEY1 ==1)  这句语句没有错误?
回复

使用道具 举报

ID:72649 发表于 2023-2-21 19:28 来自手机 | 显示全部楼层
蓝魄 发表于 2023-2-21 08:20
按照语法,if(L_KEY1==0 & M_KEY1==1 & H_KEY1 ==1)应该是用逻辑与&&,而不是位与&;还有FMQ ^= 1;不知道编 ...

用FMQ ~= FMQ;应该也是可以的,是不是FMQ延时一秒间隔接通?
回复

使用道具 举报

ID:146878 发表于 2023-2-21 21:11 | 显示全部楼层
首先,提问题请说明你想实现什么功能,实际什么现象。
让后关于楼上提的 if(L_KEY1==1 & M_KEY1==1 & H_KEY1 ==1)问题,正确是要用&&的,因为语句的本意是要进行逻辑判断,并非位运算。一些编译器回提示你这里有问题,一些不会。
回复

使用道具 举报

ID:86926 发表于 2023-2-22 08:12 | 显示全部楼层
hjx5548 发表于 2023-2-21 19:24
用逻辑与&&不是改变判断条件了?另外这种语句在九齐单片机编译环境能通过。

不会改变判断条件的,因为L_KEY1==0的运算结果是 真或假,而不是十六进制等,所以用逻辑与&&运算才对;能不能编译通过要看编译器;并不是所有的编译器都是一样的;
回复

使用道具 举报

ID:1063483 发表于 2023-2-22 09:18 | 显示全部楼层
同意楼上的说法,消抖时间是不是太短了?
回复

使用道具 举报

ID:72649 发表于 2023-2-24 05:31 来自手机 | 显示全部楼层
蓝魄 发表于 2023-2-22 08:12
不会改变判断条件的,因为L_KEY1==0的运算结果是 真或假,而不是十六进制等,所以用逻辑与&&运算才对;能 ...

MPLAB-IDE编译器
回复

使用道具 举报

ID:72649 发表于 2023-2-24 05:32 来自手机 | 显示全部楼层
pdwdzz 发表于 2023-2-21 21:11
首先,提问题请说明你想实现什么功能,实际什么现象。
让后关于楼上提的 if(L_KEY1==1 & M_KEY1==1 & H_KE ...

是逻辑运算,同时满足三个条件,才能输出。
回复

使用道具 举报

ID:72649 发表于 2023-2-24 05:34 来自手机 | 显示全部楼层
pdwdzz 发表于 2023-2-21 21:11
首先,提问题请说明你想实现什么功能,实际什么现象。
让后关于楼上提的 if(L_KEY1==1 & M_KEY1==1 & H_KE ...

功能就是同时满足if条件,才输出下面的结果
回复

使用道具 举报

ID:72649 发表于 2023-2-24 05:36 来自手机 | 显示全部楼层
watsonbu 发表于 2023-2-22 09:18
同意楼上的说法,消抖时间是不是太短了?

但是在九齐单片机运行都正常,移植到picMPLAB-IDE的编译环境就出现问题。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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