我这个小菜鸟之前一直误把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);
}
}
|