Kod: Zaznacz cały
#include <avr/io.h>
#include "lcd.h"
#define OW_PIN PD1
#define OW_IN PIND
#define OW_OUT PORTD
#define OW_DDR DDRD
#define OW_GET_IN() ( OW_IN & (1<<OW_PIN))
#define OW_OUT_LOW() ( OW_OUT &= (~(1 << OW_PIN)) )
#define OW_OUT_HIGH() ( OW_OUT |= (1 << OW_PIN) )
#define OW_DIR_IN() ( OW_DDR &= (~(1 << OW_PIN )) )
#define OW_DIR_OUT() ( OW_DDR |= (1 << OW_PIN) )
#define F_CPU 8000000ul
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
void delay_us(unsigned int us) //parametr t od 0 do 255.
{
do{asm("nop");}while(--us);
}
void delay_ms(unsigned int ms)
{
unsigned int i;
for (i=0;i<ms;i++)
{
delay_us(999);
asm volatile (
"WDR"::);
}
}
unsigned char ow_reset(void)
{
uint8_t err=1;
OW_DIR_OUT();
OW_OUT_LOW();
delay_us(480);
OW_DIR_IN();
delay_us(70);
//err = OW_GET_IN();
if (bit_is_clear(OW_IN,OW_PIN)) {err=0;}
delay_us(410);
return err;
}
unsigned char ow_read_bit(void)
{
uint8_t b=1;
OW_DIR_OUT();
OW_OUT_LOW();
delay_us(6);
OW_DIR_IN();
delay_us(9);
//b = OW_GET_IN();
if (bit_is_clear(OW_IN,OW_PIN)) {b=0;}
delay_us(55);
return b;
}
void ow_write_bit(char b)
{
if (b)
{
OW_DIR_OUT();
OW_OUT_LOW();
delay_us(6);
OW_DIR_IN();
delay_us(64);
}
else
{
OW_DIR_OUT();
OW_OUT_LOW();
delay_us(60);
OW_DIR_IN();
delay_us(10);
}
}
void ow_write_byte(char data)
{
unsigned char i, temp;
for(i=0;i<8;i++)
{
temp=data>>1;
temp &= 0x01;
ow_write_bit(temp);
}
}
unsigned char ow_read_byte (void)
{
unsigned char i;
unsigned char value=0;
for (i=0;i<8;i++)
{
if(ow_read_bit()) value |= 0x01<<i;
delay_us(6);
}
return (value);
}
void lcd_putuint8(uint8_t a){
uint8_t z;
z = a / 100;
if (z) lcd_putc(z + 0x30);
a -= z * 100;
z = a / 10;
if (z) lcd_putc(z + 0x30);
a -= z * 10;
lcd_putc(a + 0x30);
}
int main (void)
{
uint8_t n;
char dat[9];
lcd_init(LCD_DISP_ON);
lcd_puts("Test HD44780");
delay_ms(1500);
lcd_clrscr();
if (!ow_reset())
{
lcd_puts("OK");
delay_ms(1500);
lcd_clrscr();
ow_reset();
ow_write_byte(0x33);
for (n=0;n<8;n++) { dat[n]=ow_read_byte();}
for (n=0;n<8;n++)
{
lcd_putuint8(dat[n]);
if (n==3) { lcd_puts("\n");}
else lcd_puts(" ");
}
}
else
{
lcd_puts("Brak czujnika");
delay_ms(1500);
lcd_clrscr();
}
return(0);
}
Z pozdrowieniami
gadula88