打印
[PIC®/AVR®/dsPIC®产品]

发现PIC185F4520一个并行从动端口奇怪现象

[复制链接]
1449|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蓝色傻兔子|  楼主 | 2014-9-2 18:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我这个小菜鸟之前一直误把PORTD设置成为并行从动端口,之前的数码管可以正常使用,今天的1602不能用,PORTD就是1602的数据位,之前PORTD是为数码管输送位选,不知道为什么之前可以正常用?有知道的坛子么?程序如下:/*
* File:   1602.c
* Author: lenovo
*
* Created on 2014年9月2日, 上午10:56
*/


#include <pic18.h>
#include <htc.h>
__CONFIG(1,HS);
__CONFIG(2,WDTDIS);
__CONFIG(3,PBADDIS);
__CONFIG(4,XINSTDIS);
#define uint unsigned int
#define uchar unsigned char
#define RS RB5
#define RW RB4
#define E RB3
void delay(uchar i)//延迟函数
{
    uchar x,y;
    for(x=i;x>0;x--)
        for(y=10;y>0;y--);
}
void busy()
{
    TRISD7=1;
    E=0;
    RS=0;
    RW=1;
    E=1;
    while(RD7==1);
    E=0;
    TRISD7=0;
}
void lcd_write_com(uchar com)
{
   
    E=0;
    RS=0;
    RW=0;
    PORTD=com;
    E=1;
    delay(3);
    E=0;
}
void lcd_write_data(uchar data)
{
    busy();
    E=0;
    RS=1;
    RW=0;
    PORTD=data;
    E=1;
    delay(3);
    E=0;
}

void lcd_write_com_busy(uchar com)
{
    busy();
    lcd_write_com(com);
}

void lcdinint()
{
    delay(150);
    lcd_write_com(0x38);
    delay(50);
    lcd_write_com(0x38);
    delay(50);
    lcd_write_com(0x38);
    lcd_write_com_busy(0x38);
    lcd_write_com_busy(0x08);
    lcd_write_com_busy(0x01);
    lcd_write_com_busy(0x06);
    lcd_write_com_busy(0x0c);
}
void main()
{
    OSCCON=0X00;
    ADCON1=0X0F;
    TRISA=0XFF;
    TRISB=0B11000111;
    TRISC=0XFF;
    TRISD=0X00;
    TRISE=0Xff;//误将PORTD设置为并行从动

    lcdinint();
    lcd_write_com_busy(0x80+0x01);
    lcd_write_data(0x45);
    while(1){}
}//这是将PORTD设置为从动端口,不可正常使用

/*
* File:   AD.c
* Author: lenovo
*
* Created on 2014?8?20?, ??5:15
*/


#include <pic18.h>
#include <htc.h>
__CONFIG(1,HS);         //晶振4MHZ
__CONFIG(2,WDTDIS) ;     //关闭看门狗
__CONFIG(3,PBADDIS) ;     //复位时PORTB<4:0>设为数字I/O
__CONFIG(4,XINSTDIS) ;     //禁止使用指令集扩展和变址寻址模式

#define uint unsigned int
#define uchar unsigned char
#define key1 RC0
#define key2 RC1
uint ad;//存储AD转换结果
const uchar LED[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
};
void delay(uchar i)//延迟函数
{
    uchar x,y;
    for(x=i;x>0;x--)
        for(y=10;y>0;y--);
}
void display(uint num)//数码管显示函数
{
    uchar qian,bai,shi,ge;
    ge=num%10;//分离个位
    shi=num%100/10;//分离十位
    bai=num/100%10;//分离百位
    qian=num/1000;//分离千位
    PORTD=0X00;;//作消影处理
    PORTB=0XF8;//位选,选择第一位
    PORTD=LED[qian];//送段选信号
    delay(10);

    PORTD=0X00;
    PORTB=0XF9;
    PORTD=LED[bai];
    delay(10);

    PORTD=0X00;
    PORTB=0XFA;
    PORTD=LED[shi];
    delay(10);

    PORTD=0X00;
    PORTB=0XFB;
    PORTD=LED[ge];
    delay(10);
}
void main(void)
{
    OSCCON=0X00;//选择主振荡器
    ADCON1=0X0F;//所有IO均为数字口,模拟量输入禁止
    TRISA=0XFF;//PORTA设置为输入
    TRISB=0X00;//PORTB设置位选
    TRISC=0XFF;//PORTC设置为输入
    TRISD=0X00;// TRISD=0X00/PORTD设置段选
    TRISE=0XFF;//PORTE设置为输入
   
    ADCON1=0X07;//配置参考电压为VCFG1和VCFG0将PORTTA端口均配置为模拟输入
    ADCON2=0X8c;//数据选择右对齐方式,A/D转换时间为2TAD,A/D转换时钟选择位FOSC/2
    ADIF=0;//清零中断标志位
    ADIE=0;//关闭A/D中断
    GIE=0;//关闭总中断
   
    while(1)
    {
        display(ad);
        ADCON0=0X01;//选择模拟通道0,使能A/D,A/D转换转换状态位GODONE置为0,
        GODONE=1;//启动A/D转换
        while(GODONE)
        { display(ad);}
        ad=ADRESH*256+ADRESL;//提取A/D  转换结果
        ad=(ad*5.0)/1023.0*1000;
        display(ad);

    }
   

   
}

沙发
wangch_sh| | 2014-9-4 15:08 | 只看该作者
改成普通IO口试一下吗!

使用特权

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

本版积分规则

2

主题

21

帖子

0

粉丝