打印

PIC16F818的IO.不能位操作

[复制链接]
1685|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
PIC16F818的IO.不能位操作 那位大佬指点一下!谢谢


/*
* File:   main.c
* Author: Administrator
*
* Created on 2021年6月15日, 上午10:15
*/

// PIC16F818 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB3/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB2      // CCP1 Pin Selection bit (CCP1 function on RB2)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <PIC16F818.H>
void main(void) {
    OSCCON=0x74;
    TRISB=0b00000000;//SEG:a~h
    TRISA=0b00010000;//NTC-RA4
    RA0=1;
    RA1=1;
    RA3=1;
    RA6=1;
    RA7=1;
    while(1){
        TRISB=0b00000000;//SEG:a~h
        TRISA=0b00010000;//NTC-RA4
        PORTB=0xff;
        PORTA=0b01111011;//0x7f;//RA0=0;RA1=RA3=RA6=RA7=1;
    }
    return;
}

使用特权

评论回复
沙发
lcczg| | 2021-6-16 09:55 | 只看该作者
本帖最后由 lcczg 于 2021-6-16 09:56 编辑

你好,PORT上电后默认是模拟口。数字模拟是通过ADCON1控制的,请看手册https://ww1.microchip.com/downloads/en/DeviceDoc/39598F.pdf
39页表TABLE5-2。

所以要置为数字口,代码如下   
    TRISA = 0;
    ADCON1 = 6;
    RA0 = 1;

使用特权

评论回复
板凳
CoolSilicon| | 2021-6-16 10:36 | 只看该作者
ANSELx寄存器没有初始化...
如果IO口复用有模拟功能, 上电后,默认是模拟功能的,用作数字IO口的话, 需要初始化.

使用特权

评论回复
地板
chinamcu|  楼主 | 2021-6-17 07:49 | 只看该作者
非常谢谢高手指点,困惑了我一天。用这个是解决了,本人还有下面的疑惑,不知能否帮助解惑一下,谢谢!
1,如果没有定义ADCON1,PORTA端口按字节操作是没有问题
    //置高电平RA0
    TempPORTA=TempPORTA|0b00000001;
     PORTA=TempPORTA;
    //置低电平RA0
     TempPORTA=TempPORTA&0b11111110;
     PORTA=TempPORTA;
2,再请教一个问题关于只是要RA4(AN4),RA0(AN0)~RA3(AN3)做数字IO的话,根据82页的ADCON1的PCFG<3:0>: A/D Port Configuration Control bits,需要AN4-A,AN3-D,AN2-D,AN1-D,AN0-D,表格中无此选项。该如何操作,才能实现只使用AN4为模拟输入


使用特权

评论回复
5
LM莫| | 2021-6-17 09:01 | 只看该作者
上电后,默认是模拟功能的,用作数字IO口的话, 需要初始化.

使用特权

评论回复
6
huarana| | 2021-6-17 09:07 | 只看该作者
很多年没有接触过PIC单片机了。  很是怀念啊,pic单片机的datasheet就是一本教材,跟编程有关的里面都有答案还有例子。  而且大多都有中文版,非常友好哈。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

74

帖子

2

粉丝