搜索
bottom↓
回复: 20

PIC16LF1503 代码查了2天都查不出来,求大神指点迷津!

[复制链接]

出0入0汤圆

发表于 2017-2-10 08:47:15 | 显示全部楼层 |阅读模式
根据RC2的电平控制RC0的电平,可是实际上不管RC2的电平高低,RC0都是低电平!!查了2天都查不到原因  TT

#include <htc.h>
//__CONFIG(FOSC_ECL&WDTE_OFF);
__CONFIG(0x3fe4);
//内部晶振,禁止看门狗

void init_gpio()
{
        TRISA0=1;   //ICSPDAT        
        TRISA1=1;        //ICSPCLK
        TRISA2=1;        //DIM  INT
        TRISA3=1;         //VPP
        TRISA4=1;         //DIM  SAMP
        TRISA5=1;        //NC

        SDOSEL = 1;
        ANSELC |= 0X04;
        TRISC = 0X04;

        INTCON = 0x00;   //关闭所有中断
}

main()
{
        OSCCON=0B01101011;        //fosc=4Mhz; internal osc;
        WDTCON = 0;

        init_gpio();

        while(1)
        {
                if(PORTC & 0X04)
                        PORTC |= 0X01;
                else
                        PORTC &= ~0X01;       
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出5入14汤圆

发表于 2017-2-10 08:59:40 | 显示全部楼层
作为一个强迫症患者,看到楼主“if(PORTC & 0X04)”这种语句就异常难受!写成 if((PORTC & 0X04)!=0) 能咋的?

虽然这个可能跟楼主的问题无关!

出0入49汤圆

发表于 2017-2-10 09:01:05 | 显示全部楼层
EMC菜鸟 发表于 2017-2-10 08:59
作为一个强迫症患者,看到楼主“if(PORTC & 0X04)”这种语句就异常难受!写成 if((PORTC & 0X04)!=0) 能咋 ...

赞同楼上的说法,代码要写的规范一些,维护也相对容易

出0入4汤圆

发表于 2017-2-10 09:05:20 | 显示全部楼层
EMC菜鸟 发表于 2017-2-10 08:59
作为一个强迫症患者,看到楼主“if(PORTC & 0X04)”这种语句就异常难受!写成 if((PORTC & 0X04)!=0) 能咋 ...


这样写可以省4个byte的空间。

我试过。

我有可能我碰到了傻b编译器。

出0入0汤圆

发表于 2017-2-10 09:05:29 | 显示全部楼层
  ANSELC |= 0X04;  RC2 是个模拟输入口了,
if(PORTC & 0X04)  只能读到低电平了。

出0入0汤圆

发表于 2017-2-10 09:08:03 | 显示全部楼层
没用过这个芯片,估计像5楼所说是配置不对,肯定输出不了高。
至于是不是模拟输入查一下芯片手册,

做驱动时候,得到不是想要的现象多半是没配置多,多看几遍手册,一个一个寄存器查

出5入14汤圆

发表于 2017-2-10 09:10:00 | 显示全部楼层
laujc 发表于 2017-2-10 09:05
这样写可以省4个byte的空间。

我试过。

如果这样,还不如直接写:if(RC2) ,不是更省?

出0入42汤圆

发表于 2017-2-10 09:15:33 来自手机 | 显示全部楼层
5楼正解

出0入0汤圆

 楼主| 发表于 2017-2-10 09:41:31 | 显示全部楼层
EMC菜鸟 发表于 2017-2-10 08:59
作为一个强迫症患者,看到楼主“if(PORTC & 0X04)”这种语句就异常难受!写成 if((PORTC & 0X04)!=0) 能咋 ...

嗯嗯,下次会注意的,谢谢提醒

出0入0汤圆

 楼主| 发表于 2017-2-10 09:42:29 | 显示全部楼层
touch_mcu 发表于 2017-2-10 09:05
ANSELC |= 0X04;  RC2 是个模拟输入口了,
if(PORTC & 0X04)  只能读到低电平了。

的确是这样的,谢谢指点!我应该再认真仔细的看datasheeet

出0入4汤圆

发表于 2017-2-10 09:43:39 | 显示全部楼层
EMC菜鸟 发表于 2017-2-10 09:10
如果这样,还不如直接写:if(RC2) ,不是更省?

你有试过吗?自己去编译一下试试,看下反汇编代码。

不要臆想。说应该怎么怎么做。。。

出0入0汤圆

发表于 2017-2-10 09:48:22 | 显示全部楼层
RC2默认模拟引脚,你没有配置为数字引脚。
ANSELC |= 0X04;????

出0入0汤圆

发表于 2017-2-10 09:51:30 | 显示全部楼层
建议:
有点时候如果对单片机不太熟悉,可以尝试MPLAB X IDE的MCC功能自动生成代码,这样可以减少配置错误的问题。

出75入90汤圆

发表于 2017-2-10 10:30:29 | 显示全部楼层
ADC、比较器都关掉。
这里有两个1503的初始化,你参考一下:
-------------------------------------------
        OSCCON        =        0B1101010        ;        //4MHz内置振荡
        OPTION_REG        =        0x81        ;        //4分频
        PORTA        =        0        ;
        LATA        =        0        ;
        ANSELA        =        0        ;
        TRISA        =        0B11000                ; //RA5,RA2,RA1,RA0:OUTPUT;                RA4,RA3:INPUT
        PORTC        =        0        ;
        LATC        =        0        ;
        ANSELC        =        0        ;
        TRISC        =        0xFF        ;        //RC全部为输入脚
------------------------------------------------------------
INITIALIZATION
        BANKSEL OSCCON  ;;★设置RC/4M,选择1扇区
    MOVLW 6AH       ;H'01101010'
    MOVWF OSCCON    ;
        ;
    BANKSEL LATA    ;;★设置PA状态,选择0扇区
    CLRF LATA       ;PA输出缓存状态寄存器清零
    BANKSEL PORTA   ;
    CLRF PORTA                ;PORTA输出为低电平
    BANKSEL ANSELA  ;选择1扇区
    CLRF ANSELA     ;取消PA引脚和PC引脚的模拟输入功能,设置相应的引脚为数字IO
    BANKSEL TRISA   ;
    MOVLW B'00000100';
    MOVWF TRISA     ;设置PA引脚方向,PA0/1/5为输出,SYN/ALT/RED
        ;
    BANKSEL LATC    ;;★设置PC状态,
    CLRF LATC       ;PC输出缓存状态寄存器清零
        BANKSEL PORTC   ;;★设置PC状态,
    CLRF PORTC      ;设置PORTC输出为0
    BANKSEL ANSELC  ;选择1扇区
    CLRF ANSELC      ;取消PA引脚和PC引脚的模拟输入功能,设置相应的引脚为数字IO
    BANKSEL TRISC   ;
    MOVLW B'00000011';
    MOVWF TRISC     ;设置PC引脚方向,PC4/5为输出(BLUE/WHITE),PC0/1为输入(WHITE/GREEN)

;
    BANKSEL OPTION_REG;★设置TIM0,开始计时                    ;
    MOVLW 87H       ;关闭弱上拉,选择内部时钟作为TIM0时钟源,预分频分配给TIM0
    MOVWF OPTION_REG;256分频,0.00001s*256*256=0.065536s
    BANKSEL LAMP_STATE
        MOVLW 7FH                                ;
        MOVWF ADDRH                                ;
        MOVLW 0FDH                                ;
        MOVWF ADDRL                                ;
        ;
        CLRF GREEN_COUNT                  ;EQU 0X25,绿线计时寄存器
    CLRF SLAVE_SYN_COUNT        ;
        ;CLRF SLAVE_FLASH_COUNT
        ;
        CALL DATA_READ                        ;
        ;

        MOVLW 0AH                                ;
        SUBWF BANK_TEMP,W                ;
        BTFSS STATUS,Z                        ;
        GOTO GO_NEXT
        GOTO MAIN       

出5入14汤圆

发表于 2017-2-10 10:32:10 | 显示全部楼层
laujc 发表于 2017-2-10 09:43
你有试过吗?自己去编译一下试试,看下反汇编代码。

不要臆想。说应该怎么怎么做。。。


说这话之前先检验一下自己吧

if(RC2) 直接等同汇编的:BTFSS 0x7,0x2,你要是还能更省,算你NB!

出0入4汤圆

发表于 2017-2-10 10:53:15 | 显示全部楼层
EMC菜鸟 发表于 2017-2-10 10:32
说这话之前先检验一下自己吧

if(RC2) 直接等同汇编的:BTFSS 0x7,0x2,你要是还能更省,算你NB! ...

不同的编译器,处理方式不同,不和你讨论这个无意义的问题。

出5入14汤圆

发表于 2017-2-10 10:58:38 | 显示全部楼层
laujc 发表于 2017-2-10 10:53
不同的编译器,处理方式不同,不和你讨论这个无意义的问题。

如果不了解PIC的汇编,就不要乱现,PIC的BTFSS指令是可以直接对C2口操作的,跟哪个编译器都无关!

跟你这种半瓶子醋讨论才是无意义的事情,这里只不过借讨论给楼主提供个更好思路而已!

出0入4汤圆

发表于 2017-2-10 11:03:58 | 显示全部楼层
EMC菜鸟 发表于 2017-2-10 10:58
如果不了解PIC的汇编,就不要乱现,PIC的BTFSS指令是可以直接对C2口操作的,跟哪个编译器都无关!

跟你 ...

我也是想给LZ提供一个思路。

我针对的不单是PIC的C2口。我当时是想着所有的单片机。有些单片机的端口不支持位操作。

出0入0汤圆

发表于 2017-2-10 12:14:04 | 显示全部楼层
if((PORTC & 0X04)!=0)应该写出 if((0!=PORTC & 0X04) )

出0入0汤圆

发表于 2017-2-12 15:54:09 | 显示全部楼层
lzandyc 发表于 2017-2-10 09:42
的确是这样的,谢谢指点!我应该再认真仔细的看datasheeet

现在MCU厂家都有推出代码生成器,这样可以不用自己配置底层硬件驱动。
编程效率提高很多,可以多试试。

出0入0汤圆

发表于 2017-8-17 13:28:23 | 显示全部楼层
一大半原因就是配置问题,这个很重要的。不然永远只是纯粹的搬运工。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 01:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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