#include<p18cxxx.h>
#include<delays.h>
#include<xlcd.h>                     //Подключим библиотеку от Microchip для LCD
//Конфигурацию взял из PICDEM FS USB
#pragma config PLLDIV   = 5          // (20 MHz кварцевый резонатор)
#pragma config CPUDIV   = OSC1_PLL2   
#pragma config USBDIV   = 2          // Clock source from 96MHz PLL/2
#pragma config FOSC     = HSPLL_HS
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config PWRT     = OFF
#pragma config BOR      = ON
#pragma config BORV     = 3
#pragma config VREGEN   = ON         //USB Voltage Regulator
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
//#pragma config CCP2MX   = ON
#pragma config STVREN   = ON
#pragma config LVP      = OFF
//#pragma config ICPRT    = OFF      // Dedicated In-Circuit Debug/Programming
#pragma config XINST    = OFF        // Extended Instruction Set
#pragma config CP0      = OFF
#pragma config CP1      = OFF
//#pragma config CP2      = OFF
//#pragma config CP3      = OFF
#pragma config CPB      = OFF
#pragma config CPD      = OFF
#pragma config WRT0     = OFF
#pragma config WRT1     = OFF
//#pragma config WRT2     = OFF
//#pragma config WRT3     = OFF
#pragma config WRTB     = OFF        // Boot Block Write Protection
#pragma config WRTC     = OFF
//#pragma config WRTD     = OFF
#pragma config EBTR0    = OFF
#pragma config EBTR1    = OFF
//#pragma config EBTR2    = OFF
//#pragma config EBTR3    = OFF
#pragma config EBTRB    = OFF
//###################################################################
#define tris_dallas     TRISAbits.TRISA3
#define dallas          LATAbits.LATA3
#define dallas_port     PORTAbits.RA3
//###################################################################
#pragma udata
char dallas_ok[]="OK";
char dallas_error[]="Error Dallas";
char error_dallas;                   //Флаг для датчика температуры
char HexBuf[3]={0x30,0x30,0x00};
char DRomBuf[7]={0x30,0x30,0x30,0x30,0x30,0x30,0x00};
char com_reg;
//###################################################################
#pragma code
void DelayFor18TCY(void)             //provides a 18 Tcy delay
{
    Delay10TCYx(60);
}
void DelayPORXLCD(void)             //provides at least 15ms delay
{
    Delay1KTCYx(200);
}
void DelayXLCD(void)                // provides at least 5ms delay
{
    Delay1KTCYx(70);
}
//**********Прототипы функций для датчика температуры***************
void Delay480us(void);
void Delay60us(void);
void HowDelay(int);
char ResetDallas(void);
void DoutLow(void);
void DoutHigh(void);
char DRecive(void);
void DSend(char);
void HexToASCII(char );
//###################################################################
void main(void)
{
       ADCON1 |= 0x0F;
    OpenXLCD(FOUR_BIT&LINES_5X7);
    WriteCmdXLCD(SHIFT_CUR_RIGHT);
    WriteCmdXLCD(CURSOR_OFF&BLINK_OFF); 
    while(1)
    {
       
       WriteCmdXLCD(0x01);
       while(BusyXLCD());
       HowDelay(6);
       ResetDallas();
       if(error_dallas){                 //Если датчик не ответил
           SetDDRamAddr(0x80);
           putsXLCD(dallas_error);
       }
       else{                             //Если датчик ответил
           SetDDRamAddr(0x80);
           putsXLCD(dallas_ok);
       }
       DSend(0x33);
       SetDDRamAddr(0xC0);
       HexToASCII(DRecive());
       putsXLCD(HexBuf);
       HexToASCII(DRecive());
       putsXLCD(HexBuf);
       HexToASCII(DRecive());
       putsXLCD(HexBuf);
       HexToASCII(DRecive());
       putsXLCD(HexBuf);
       HexToASCII(DRecive());
       putsXLCD(HexBuf);;
       HexToASCII(DRecive());
       putsXLCD(HexBuf);
       HexToASCII(DRecive());
       putsXLCD(HexBuf);
       HexToASCII(DRecive());
       putsXLCD(HexBuf);
       
       HowDelay(12);                      //Здаржка на большое время
       
    }
}
//Функция сохраняет в буффере HexBuf представление в ASCII hex-числа 
void HexToASCII(char ch)
{
    char tmp=ch;
    
    tmp=tmp &= 0x0f;
    if(tmp<=9){
        HexBuf[1]=tmp+0x30;
    }
    else if(tmp>=0x0A && tmp<=0x0F){
        HexBuf[1]=tmp+0x37;
    }
    tmp=((ch>>4)&0x0f);
    if(tmp<=9){
        HexBuf[0]=tmp+0x30;
    }
    else if(tmp>=0x0A && tmp<=0x0F){
        HexBuf[0]=tmp+0x37;
    }
}
//**********Функции для работы с датчиком температуры**************** 
char ResetDallas(void){                  //Сброс датчика
    char err=1;
    error_dallas=1;
    DoutLow();
    Delay480us();
    DoutHigh();
    Delay60us();
    if(!dallas_port){
        error_dallas=0;
        err=0;
    }
    Delay480us();
    return err;
}
//Функции протокола 1-wire    
void DoutLow(void){          //устанавливает линию передачи в 0
    dallas_port=0;
    tris_dallas=0;
    Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
    Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
    Nop();Nop();Nop();Nop();
}
void DoutHigh(void){         //отпускает линию в 1 (+5В от резистора)
    tris_dallas=1;
    Nop();Nop();Nop();Nop();Nop();Nop();
}
//Принимает байт
char DRecive(void){
int i;
for(i=0;i<8;i++){
DoutLow();
DoutHigh();
if(dallas_port){
STATUSbits.C=1;
}
else{
STATUSbits.C=0;
}
Rrcf(com_reg,1,1);
Delay60us();
}
return com_reg;
}
//Передает байт далласу
void DSend(char data){
int i;
com_reg=data;
for(i=0;i<8;i++){
DoutLow();
Rrcf(com_reg,1,1);
if(STATUSbits.C){
DoutHigh();
}
else{
DoutLow();
}
Delay60us();
DoutHigh();
}
}
//Функции задержки
void Delay480us(void){
    Delay100TCYx(58);
}
void Delay60us(void){
    Delay10TCYx(70);
}
void HowDelay(int i){
    int j=0;
    for(;j<i;j++){
        Delay10KTCYx(0);
    }
}

//Добавил Функцию чтения ROM и буферы для хранения ROM
#include<p18cxxx.h>
#include<delays.h>
#include<xlcd.h>                     //Подключим библиотеку от Microchip для LCD
//Конфигурацию взял из PICDEM FS USB
#pragma config PLLDIV   = 5          // (20 MHz кварцевый резонатор)
#pragma config CPUDIV   = OSC1_PLL2   
#pragma config USBDIV   = 2          // Clock source from 96MHz PLL/2
#pragma config FOSC     = HSPLL_HS
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config PWRT     = OFF
#pragma config BOR      = ON
#pragma config BORV     = 3
#pragma config VREGEN   = ON         //USB Voltage Regulator
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
//#pragma config CCP2MX   = ON
#pragma config STVREN   = ON
#pragma config LVP      = OFF
//#pragma config ICPRT    = OFF      // Dedicated In-Circuit Debug/Programming
#pragma config XINST    = OFF        // Extended Instruction Set
#pragma config CP0      = OFF
#pragma config CP1      = OFF
//#pragma config CP2      = OFF
//#pragma config CP3      = OFF
#pragma config CPB      = OFF
#pragma config CPD      = OFF
#pragma config WRT0     = OFF
#pragma config WRT1     = OFF
//#pragma config WRT2     = OFF
//#pragma config WRT3     = OFF
#pragma config WRTB     = OFF        // Boot Block Write Protection
#pragma config WRTC     = OFF
//#pragma config WRTD     = OFF
#pragma config EBTR0    = OFF
#pragma config EBTR1    = OFF
//#pragma config EBTR2    = OFF
//#pragma config EBTR3    = OFF
#pragma config EBTRB    = OFF
//###################################################################
#define tris_dallas     TRISAbits.TRISA3
#define dallas          LATAbits.LATA3
#define dallas_port     PORTAbits.RA3
//###################################################################
#pragma udata
char dallas_ok[]="OK";
char dallas_error[]="Error Dallas";
char error_dallas;                   //Флаг для датчика температуры
char HexBuf[3]={0x31,0x32,0x00};
char DRomBuf[9]={0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00};
char DRomBufASCII[17]={0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00};
char com_reg;
//###################################################################
#pragma code
void DelayFor18TCY(void)             //provides a 18 Tcy delay
{
    Delay10TCYx(60);
}
void DelayPORXLCD(void)             //provides at least 15ms delay
{
    Delay1KTCYx(200);
}
void DelayXLCD(void)                // provides at least 5ms delay
{
    Delay1KTCYx(70);
}
//**********Прототипы функций для датчика температуры***************
void Delay480us(void);
void Delay60us(void);
void HowDelay(int);
char ResetDallas(void);
void DoutLow(void);
void DoutHigh(void);
char DRecive(void);
void DSend(char);
void HexToASCII(char );
void DReadRom(void);
//###################################################################
void main(void)
{
// DReadRom();
ADCON1 |= 0x0F;
    OpenXLCD(FOUR_BIT&LINES_5X7);
    WriteCmdXLCD(SHIFT_CUR_RIGHT);
    WriteCmdXLCD(CURSOR_OFF&BLINK_OFF);
    while(1)
    {
       
       WriteCmdXLCD(0x01);
       while(BusyXLCD());
       HowDelay(6);
       ResetDallas();
       if(error_dallas){                 //Если датчик не ответил
           SetDDRamAddr(0x80);
           putsXLCD(dallas_error);
       }
       else{                             //Если датчик ответил
           SetDDRamAddr(0x80);
           putsXLCD(dallas_ok);
       }
       DReadRom();                       //Читаем ROM и сохраняем в в 2-ух буфферах
       SetDDRamAddr(0xC0);
       putsXLCD(DRomBufASCII);
       HowDelay(12);                      //Здаржка на большое время
       
    }
}
//Функция сохраняет в буффере HexBuf представление в ASCII hex-числа 
void HexToASCII(char ch)
{
    char tmp=ch;
    
    tmp=tmp &= 0x0f;
    if(tmp<=9){
        HexBuf[1]=tmp+0x30;
    }
    else if(tmp>=0x0A && tmp<=0x0F){
        HexBuf[1]=tmp+0x37;
    }
    tmp=((ch>>4)&0x0f);
    if(tmp<=9){
        HexBuf[0]=tmp+0x30;
    }
    else if(tmp>=0x0A && tmp<=0x0F){
        HexBuf[0]=tmp+0x37;
    }
}
//**********Функции для работы с датчиком температуры**************** 
char ResetDallas(void){                  //Сброс датчика
    char err=1;
    error_dallas=1;
    DoutLow();
    Delay480us();
    DoutHigh();
    Delay60us();
    if(!dallas_port){
        error_dallas=0;
        err=0;
    }
    Delay480us();
    return err;
}
//Чтение ROM датчика - сохраняет 8 байт ROM датчика в массиве DRomBuf[7] и в буффере DRomBufASCII строку для LCD
void DReadRom(void){
int i;
int j=0;
DoutLow();
DoutHigh();
if(!dallas_port){
return;
}
if(ResetDallas()){
return;
}
DSend(0x33);
for(i=0;i<8;i++){
DRomBuf[i]=DRecive();
HexToASCII(DRomBuf[i]);
DRomBufASCII[j]=HexBuf[0];
j++;
DRomBufASCII[j]=HexBuf[1];
j++;
}
}
//Функции протокола 1-wire    
void DoutLow(void){          //устанавливает линию передачи в 0
    dallas=0;
    tris_dallas=0;
    Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
    Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
    Nop();Nop();Nop();Nop();
}
void DoutHigh(void){         //отпускает линию в 1 (+5В от резистора)
    tris_dallas=1;
    Nop();Nop();Nop();Nop();Nop();Nop();
}
//Принимает байт
char DRecive(void){
int i;
for(i=0;i<8;i++){
DoutLow();
DoutHigh();
if(dallas_port){
STATUSbits.C=1;
}
else{
STATUSbits.C=0;
}
Rrcf(com_reg,1,1);
Delay60us();
}
return com_reg;
}
//Передает байт далласу
void DSend(char data){
int i;
com_reg=data;
for(i=0;i<8;i++){
DoutLow();
Rrcf(com_reg,1,1);
if(STATUSbits.C){
DoutHigh();
}
else{
DoutLow();
}
Delay60us();
DoutHigh();
}
}
//Функции задержки
void Delay480us(void){
    Delay100TCYx(58);
}
void Delay60us(void){
    Delay10TCYx(72);
}
void HowDelay(int i){
    int j=0;
    for(;j<i;j++){
        Delay10KTCYx(0);
    }
}


//Улучшенный вариант преобразования Hex to ASCII
#include<p18cxxx.h>
#include<delays.h>
#include<xlcd.h>                     //Подключим библиотеку от Microchip для LCD
//Конфигурацию взял из PICDEM FS USB
#pragma config PLLDIV   = 5          // (20 MHz кварцевый резонатор)
#pragma config CPUDIV   = OSC1_PLL2   
#pragma config USBDIV   = 2          // Clock source from 96MHz PLL/2
#pragma config FOSC     = HSPLL_HS
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config PWRT     = OFF
#pragma config BOR      = ON
#pragma config BORV     = 3
#pragma config VREGEN   = ON         //USB Voltage Regulator
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
//#pragma config CCP2MX   = ON
#pragma config STVREN   = ON
#pragma config LVP      = OFF
//#pragma config ICPRT    = OFF      // Dedicated In-Circuit Debug/Programming
#pragma config XINST    = OFF        // Extended Instruction Set
#pragma config CP0      = OFF
#pragma config CP1      = OFF
//#pragma config CP2      = OFF
//#pragma config CP3      = OFF
#pragma config CPB      = OFF
#pragma config CPD      = OFF
#pragma config WRT0     = OFF
#pragma config WRT1     = OFF
//#pragma config WRT2     = OFF
//#pragma config WRT3     = OFF
#pragma config WRTB     = OFF        // Boot Block Write Protection
#pragma config WRTC     = OFF
//#pragma config WRTD     = OFF
#pragma config EBTR0    = OFF
#pragma config EBTR1    = OFF
//#pragma config EBTR2    = OFF
//#pragma config EBTR3    = OFF
#pragma config EBTRB    = OFF
//###################################################################
#define tris_dallas     TRISAbits.TRISA3
#define dallas          LATAbits.LATA3
#define dallas_port     PORTAbits.RA3
//###################################################################
#pragma udata
char dallas_ok[]="OK";
char dallas_error[]="Error Dallas";
char error_dallas;                   //Флаг для датчика температуры
char DRomBuf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
char DRomBufASCII[17];
char com_reg;
//###################################################################
#pragma code
void DelayFor18TCY(void)             //provides a 18 Tcy delay
{
    Delay10TCYx(60);
}
void DelayPORXLCD(void)             //provides at least 15ms delay
{
    Delay1KTCYx(200);
}
void DelayXLCD(void)                // provides at least 5ms delay
{
    Delay1KTCYx(70);
}
//**********Прототипы функций для датчика температуры***************
void Delay480us(void);
void Delay60us(void);
void HowDelay(int);
char ResetDallas(void);
void DoutLow(void);
void DoutHigh(void);
char DRecive(void);
void DSend(char);
char* HexToASCII(char*,char*,int );
void DReadRom(void);
//###################################################################
void main(void)
{
ADCON1 |= 0x0F;
    OpenXLCD(FOUR_BIT&LINES_5X7);
    WriteCmdXLCD(SHIFT_CUR_RIGHT);
    WriteCmdXLCD(CURSOR_OFF&BLINK_OFF);
    while(1)
    {
       
       WriteCmdXLCD(0x01);
       while(BusyXLCD());
       HowDelay(6);
       ResetDallas();
       if(error_dallas){                 //Если датчик не ответил
           SetDDRamAddr(0x80);
           putsXLCD(dallas_error);
       }
       else{                             //Если датчик ответил
           SetDDRamAddr(0x80);
           putsXLCD(dallas_ok);
       }
       DReadRom();                                   //Читаем ROM
       SetDDRamAddr(0xC0);                           //Устанавливаем адрес куда будем выводить ROM
       putsXLCD(HexToASCII(DRomBuf,DRomBufASCII,8)); //Печатаем на LCD ROM
       HowDelay(12);                                 //Здаржка на большое время
       
    }
}
//Функция возвращает адрес массива символов в памяти, куда запишет
//преобразованные в строку шеснадцатиричные значения байтов в массиве,
//переданном ей параметром sour(адрес массива байтов, который надо преобразовать)
//len -колличество байтов в sour,dest-адрес массива, куда запишем преобразованную 
//строку, равную len*2.
char* HexToASCII(char *sour,char *dest,int len)
{
int i;
char tmp;
int j=0;
for(i=0;i<len;i++){
tmp=((sour[i]>>4)&0x0f);
if(tmp<=9){
dest[j]=tmp+0x30;
}
else if(tmp>=0x0A && tmp<=0x0F){
dest[j]=tmp+0x37;
}
j++;
tmp=sour[i];
tmp=tmp &= 0x0f;
if(tmp<=9){
dest[j]=tmp+0x30;
}
else if(tmp>=0x0A && tmp<=0x0F){
dest[j]=tmp+0x37;
}
j++;
}
return dest;
}
//**********Функции для работы с датчиком температуры**************** 
char ResetDallas(void){                  //Сброс датчика
    char err=1;
    error_dallas=1;
    DoutLow();
    Delay480us();
    DoutHigh();
    Delay60us();
    if(!dallas_port){
        error_dallas=0;
        err=0;
    }
    Delay480us();
    return err;
}
//Чтение ROM датчика - сохраняет 8 байт ROM датчика в массиве DRomBuf[7]
void DReadRom(void){
int i;
int j=0;
DoutLow();
DoutHigh();
if(!dallas_port){
return;
}
if(ResetDallas()){
return;
}
DSend(0x33);
for(i=0;i<8;i++){
DRomBuf[i]=DRecive();
}
}
//Функции протокола 1-wire    
void DoutLow(void){          //устанавливает линию передачи в 0
    dallas=0;
    tris_dallas=0;
    Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
    Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
    Nop();Nop();Nop();Nop();
}
void DoutHigh(void){         //отпускает линию в 1 (+5В от резистора)
    tris_dallas=1;
    Nop();Nop();Nop();Nop();Nop();Nop();
}
//Принимает байт
char DRecive(void){
int i;
for(i=0;i<8;i++){
DoutLow();
DoutHigh();
if(dallas_port){
STATUSbits.C=1;
}
else{
STATUSbits.C=0;
}
Rrcf(com_reg,1,1);
Delay60us();
}
return com_reg;
}
//Передает байт далласу
void DSend(char data){
int i;
com_reg=data;
for(i=0;i<8;i++){
DoutLow();
Rrcf(com_reg,1,1);
if(STATUSbits.C){
DoutHigh();
}
else{
DoutLow();
}
Delay60us();
DoutHigh();
}
}
//Функции задержки
void Delay480us(void){
    Delay100TCYx(58);
}
void Delay60us(void){
    Delay10TCYx(72);
}
void HowDelay(int i){
    int j=0;
    for(;j<i;j++){
        Delay10KTCYx(0);
    }
}



НАЗАД                                                                         ДАЛЬШЕ