找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1898|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

PIC16F616單片機程序編譯哪里出了問題?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72649 發(fā)表于 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
/*使用內(nèi)部RC振蕩器,關(guān)閉看門狗,*/

#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指示燈閃爍周期計數(shù)
uchar Flag2ms = 0;
uchar u8Flag15min = 0;        //15分鐘到標志

void delay_1ms(void);                                //函數(shù)聲明
void delay_nms(uint var);

void delay_1ms(void)     //此函數(shù)在4M晶體下產(chǎn)生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設(shè)為輸出,RB3、RB4、RB5設(shè)為輸入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)    //一、 三個開關(guān)全部斷開高電平 111,
                       
                        {
                                JS_JDQ = 0;           //JS_JDQ關(guān)閉
                                d_s(1);//延時1秒
                FMQ = 1;                 //JS_JDQ打開
                d_s(1);//延時1秒
                                JR1_JDQ = 0;          //JR1_JDQ關(guān)閉
                                                               
                                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分鐘到,開關(guān)沒有動作
                                                            //也就是開關(guān)一直斷開高電平,則        FMQ工作JS_JDQ、JR1_JDQ關(guān)
                                {
                                        if (ledFlashCnt>=500) //500*2=1000ms
                                        {
                                                ledFlashCnt = 0;
                                                 FMQ ^= 1;
                                        }
                                }
                        }
                       
                        else if(L_KEY1==0 & M_KEY1==1 & H_KEY1 ==1)    //二、開關(guān)011時, JS_JDQ開,F(xiàn)MQ、JR1_JDQ關(guān)
                        {   
                            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)    //三、開關(guān)001時, JS_JDQ、JR1_JDQ開,F(xiàn)MQ關(guān)
                        {
                            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)    //四、開關(guān)000時,JR1_JDQ開,F(xiàn)MQ、JS_JDQQ關(guān)
                       
                        {
                            d_s(5);//延時1秒
                            JR1_JDQ =1;
                            d_s(3);//延時1秒
                                JS_JDQ = 0;FMQ = 0;
                d_s(1);//延時1秒
                        }                       
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:86926 發(fā)表于 2023-2-21 08:20 | 只看該作者
按照語法,if(L_KEY1==0 & M_KEY1==1 & H_KEY1 ==1)應(yīng)該是用邏輯與&&,而不是位與&;還有FMQ ^= 1;不知道編譯器是按照0x01來異或,還是一位異或;用FMQ ~= FMQ;應(yīng)該也是可以的
回復(fù)

使用道具 舉報

板凳
ID:72649 發(fā)表于 2023-2-21 19:24 來自觸屏版 | 只看該作者
藍魄 發(fā)表于 2023-2-21 08:20
按照語法,if(L_KEY1==0 & M_KEY1==1 & H_KEY1 ==1)應(yīng)該是用邏輯與&&,而不是位與&;還有FMQ ^= 1;不知道編 ...

用邏輯與&&不是改變判斷條件了?另外這種語句在九齊單片機編譯環(huán)境能通過。
回復(fù)

使用道具 舉報

地板
ID:72649 發(fā)表于 2023-2-21 19:25 來自觸屏版 | 只看該作者
藍魄 發(fā)表于 2023-2-21 08:20
按照語法,if(L_KEY1==0 & M_KEY1==1 & H_KEY1 ==1)應(yīng)該是用邏輯與&&,而不是位與&;還有FMQ ^= 1;不知道編 ...

為什么: if(L_KEY1==1 & M_KEY1==1 & H_KEY1 ==1)  這句語句沒有錯誤?
回復(fù)

使用道具 舉報

5#
ID:72649 發(fā)表于 2023-2-21 19:28 來自觸屏版 | 只看該作者
藍魄 發(fā)表于 2023-2-21 08:20
按照語法,if(L_KEY1==0 & M_KEY1==1 & H_KEY1 ==1)應(yīng)該是用邏輯與&&,而不是位與&;還有FMQ ^= 1;不知道編 ...

用FMQ ~= FMQ;應(yīng)該也是可以的,是不是FMQ延時一秒間隔接通?
回復(fù)

使用道具 舉報

6#
ID:146878 發(fā)表于 2023-2-21 21:11 | 只看該作者
首先,提問題請說明你想實現(xiàn)什么功能,實際什么現(xiàn)象。
讓后關(guān)于樓上提的 if(L_KEY1==1 & M_KEY1==1 & H_KEY1 ==1)問題,正確是要用&&的,因為語句的本意是要進行邏輯判斷,并非位運算。一些編譯器回提示你這里有問題,一些不會。
回復(fù)

使用道具 舉報

7#
ID:86926 發(fā)表于 2023-2-22 08:12 | 只看該作者
hjx5548 發(fā)表于 2023-2-21 19:24
用邏輯與&&不是改變判斷條件了?另外這種語句在九齊單片機編譯環(huán)境能通過。

不會改變判斷條件的,因為L_KEY1==0的運算結(jié)果是 真或假,而不是十六進制等,所以用邏輯與&&運算才對;能不能編譯通過要看編譯器;并不是所有的編譯器都是一樣的;
回復(fù)

使用道具 舉報

8#
ID:1063483 發(fā)表于 2023-2-22 09:18 | 只看該作者
同意樓上的說法,消抖時間是不是太短了?
回復(fù)

使用道具 舉報

9#
ID:72649 發(fā)表于 2023-2-24 05:31 來自觸屏版 | 只看該作者
藍魄 發(fā)表于 2023-2-22 08:12
不會改變判斷條件的,因為L_KEY1==0的運算結(jié)果是 真或假,而不是十六進制等,所以用邏輯與&&運算才對;能 ...

MPLAB-IDE編譯器
回復(fù)

使用道具 舉報

10#
ID:72649 發(fā)表于 2023-2-24 05:32 來自觸屏版 | 只看該作者
pdwdzz 發(fā)表于 2023-2-21 21:11
首先,提問題請說明你想實現(xiàn)什么功能,實際什么現(xiàn)象。
讓后關(guān)于樓上提的 if(L_KEY1==1 & M_KEY1==1 & H_KE ...

是邏輯運算,同時滿足三個條件,才能輸出。
回復(fù)

使用道具 舉報

11#
ID:72649 發(fā)表于 2023-2-24 05:34 來自觸屏版 | 只看該作者
pdwdzz 發(fā)表于 2023-2-21 21:11
首先,提問題請說明你想實現(xiàn)什么功能,實際什么現(xiàn)象。
讓后關(guān)于樓上提的 if(L_KEY1==1 & M_KEY1==1 & H_KE ...

功能就是同時滿足if條件,才輸出下面的結(jié)果
回復(fù)

使用道具 舉報

12#
ID:72649 發(fā)表于 2023-2-24 05:36 來自觸屏版 | 只看該作者
watsonbu 發(fā)表于 2023-2-22 09:18
同意樓上的說法,消抖時間是不是太短了?

但是在九齊單片機運行都正常,移植到picMPLAB-IDE的編譯環(huán)境就出現(xiàn)問題。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表