S
shanishp
Guest
안녕하세요.
전 모드로 공급 16F877A에 하나의 PIC가 함께하는 인터페이스 나침반 Honeywells HMC를 5843, 문제와 함께 그 경험을 더 연결 LCD는 디스플레이하는 데 하나는 어떤 내게도 및 180도, 더 각도가 획득, 제발 도와 360대로에 동일한 각도가 보여주는 표제 이 IC에서.
이걸로 내 C 프로그램을 부착 오전
/****************************************/
#은 <pic.h> 포함
#은 <math.h> 포함
# 포함 "877_i2c.h"
# 포함 "delay.h"
# 포함 "lcd.h"
) __CONFIG (HS & WDTDIS & LVPDIS & PWRTEN & 지켜주시길;
# 57.29577 one_eighty_by_pi 정의
# (PORTBIT를 정의 adr, 비트) ((서명) (& adr) * 8 (비트))
/ / 정적 @ PORTBIT 비트 (PORTB, 1);
무효 write_HMC5843 (서명 번째 문자) 서명되지 않은 번째 문자;
무효 read_HMC5843 (서명 번째 문자);
무효의 write_HMC5843_new (무효);
서명되지 않은 int 표제;
mag_z 서명 int mag_x를 mag_y,;
더블 각도;
서명되지 않은 번째 문자 lcd_val, 합계, VL;
무효의 main ()
(
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISD = 0;
TRISE = 0;
TRISC3 = 0;
TRISC4 = 1;
ADCON1 = 0x07;
간이 = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
PORTE = 0;
0 표제 =;
i2c_init ();
lcd_init ();
lcd_clear ();
lcd_goto (0);
lcd_puts ( "HMC 5843");
lcd_goto (0x40);
lcd_puts ( "제목 :"); / / 지하 4 층에서을
DelayMs (150);
/ /) write_HMC5843_new (;
write_HMC5843 (0,0가 x10); / / 구성 등록 : 설정된 기본값
write_HMC5843 (1,0가 x20); / / 구성 값을 등록 B : 설정 기본
write_HMC5843 (2,0 x00); / / 모드 선택 : 연속 모드를 선택
DelayMs (950)
동안 (1
(
read_HMC5843 (0x03);
각도 = (더블) (mag_x / mag_y);
)하면 ((mag_y <0) & & (mag_x> 0)
Atan 표제 = (서명 int) ((각도));
다른 경우 ((mag_y <0) & & (mag_x <0))
) 표제 = (서명 int) (360 Atan (각도);
다른 경우 ((mag_y> 0) & & (mag_x <0))
Atan 표제 = (서명 int) (180 (각도));
다른 경우 ((mag_y> 0) & & (mag_x> 0))
) 표제 = (서명 int) (180 Atan (각도);
lcd_goto (0x4b);
lcd_val = (heading/100) 48; / / 128 1
lcd_putch (lcd_val);
lcd_val = 표제 % 100; / / 28
lcd_val = (lcd_val/10) 48; / / 2
lcd_putch (lcd_val);
lcd_val = 표제 % 100; / / 28
lcd_val = (lcd_val % 10) 48; / / 8
lcd_putch (lcd_val);
/ / lcd_puts ( "");
/ /) i2c_start (;
/ /) i2c_write (0x3C;
/ /) i2c_write (0x09;
/ /) i2c_repStart (;
/ /) i2c_write (0x3D;
/ /
/ / 합계 = i2c_read (0);
/ /) i2c_stop (;
/ /면 (합계 & 나타내고 0x01)
/ / lcd_puts ( "1");
/ / 또
/ / lcd_puts ( "0");
/ / lcd_puts ( "");
/ /면 (합계 & 0x02)
/ / lcd_puts ( "1");
/ / 또
/ / lcd_puts ( "0");
/ /
DelayMs (950);
))
//------------------------------------------------ -------------
무효 write_HMC5843 (서명 번째 문자 주소, 서명 번째 문자 데이터)
(
i2c_start ();
) i2c_write (0x3C;
) i2c_write (주소;
) i2c_write (데이터;
i2c_stop ();
DelayMs (15);
)
//------------------------------------------------ -------------
무효 read_HMC5843 (서명 번째 문자 Addr)
(
i2c_start ();
) i2c_write (0x3C;
) i2c_write (Addr;
i2c_repStart ();
) i2c_write (0x3D;
mag_x은 =) i2c_read (1;
mag_x = (mag_x <<
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="시원한" border="0" />
i2c_read (1);
/ / mag_x 표제 =;
/ / lcd_goto (0x10);
/ / lcd_val = (heading/100) 48;
/ / lcd_putch (lcd_val);
/ /
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val/10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val % 10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_puts ( "");
mag_y은 =) i2c_read (1;
mag_y = (mag_x <<
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="시원한" border="0" />
i2c_read (1);
/ / mag_y으로 향하고 =;
/ / lcd_val = (heading/100) 48;
/ / lcd_putch (lcd_val);
/ /
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val/10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val % 10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_puts ( "");
mag_z은 =) i2c_read (1;
mag_z = (mag_x <<
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="시원한" border="0" />
i2c_read (0);
/ / mag_z 표제 =;
/ / lcd_val = (heading/100) 48;
/ / lcd_putch (lcd_val);
/ /
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val/10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val % 10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_puts ( "");
i2c_stop ();
)
//--------------------------
무효의 write_HMC5843_new (무효)
(
i2c_start ();
) i2c_write (0x3C;
) i2c_write (0x02;
) i2c_write (0x00;
i2c_stop ();
DelayMs (15);
)
전 모드로 공급 16F877A에 하나의 PIC가 함께하는 인터페이스 나침반 Honeywells HMC를 5843, 문제와 함께 그 경험을 더 연결 LCD는 디스플레이하는 데 하나는 어떤 내게도 및 180도, 더 각도가 획득, 제발 도와 360대로에 동일한 각도가 보여주는 표제 이 IC에서.
이걸로 내 C 프로그램을 부착 오전
/****************************************/
#은 <pic.h> 포함
#은 <math.h> 포함
# 포함 "877_i2c.h"
# 포함 "delay.h"
# 포함 "lcd.h"
) __CONFIG (HS & WDTDIS & LVPDIS & PWRTEN & 지켜주시길;
# 57.29577 one_eighty_by_pi 정의
# (PORTBIT를 정의 adr, 비트) ((서명) (& adr) * 8 (비트))
/ / 정적 @ PORTBIT 비트 (PORTB, 1);
무효 write_HMC5843 (서명 번째 문자) 서명되지 않은 번째 문자;
무효 read_HMC5843 (서명 번째 문자);
무효의 write_HMC5843_new (무효);
서명되지 않은 int 표제;
mag_z 서명 int mag_x를 mag_y,;
더블 각도;
서명되지 않은 번째 문자 lcd_val, 합계, VL;
무효의 main ()
(
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISD = 0;
TRISE = 0;
TRISC3 = 0;
TRISC4 = 1;
ADCON1 = 0x07;
간이 = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
PORTE = 0;
0 표제 =;
i2c_init ();
lcd_init ();
lcd_clear ();
lcd_goto (0);
lcd_puts ( "HMC 5843");
lcd_goto (0x40);
lcd_puts ( "제목 :"); / / 지하 4 층에서을
DelayMs (150);
/ /) write_HMC5843_new (;
write_HMC5843 (0,0가 x10); / / 구성 등록 : 설정된 기본값
write_HMC5843 (1,0가 x20); / / 구성 값을 등록 B : 설정 기본
write_HMC5843 (2,0 x00); / / 모드 선택 : 연속 모드를 선택
DelayMs (950)
(
read_HMC5843 (0x03);
각도 = (더블) (mag_x / mag_y);
)하면 ((mag_y <0) & & (mag_x> 0)
Atan 표제 = (서명 int) ((각도));
다른 경우 ((mag_y <0) & & (mag_x <0))
) 표제 = (서명 int) (360 Atan (각도);
다른 경우 ((mag_y> 0) & & (mag_x <0))
Atan 표제 = (서명 int) (180 (각도));
다른 경우 ((mag_y> 0) & & (mag_x> 0))
) 표제 = (서명 int) (180 Atan (각도);
lcd_goto (0x4b);
lcd_val = (heading/100) 48; / / 128 1
lcd_putch (lcd_val);
lcd_val = 표제 % 100; / / 28
lcd_val = (lcd_val/10) 48; / / 2
lcd_putch (lcd_val);
lcd_val = 표제 % 100; / / 28
lcd_val = (lcd_val % 10) 48; / / 8
lcd_putch (lcd_val);
/ / lcd_puts ( "");
/ /) i2c_start (;
/ /) i2c_write (0x3C;
/ /) i2c_write (0x09;
/ /) i2c_repStart (;
/ /) i2c_write (0x3D;
/ /
/ / 합계 = i2c_read (0);
/ /) i2c_stop (;
/ /면 (합계 & 나타내고 0x01)
/ / lcd_puts ( "1");
/ / 또
/ / lcd_puts ( "0");
/ / lcd_puts ( "");
/ /면 (합계 & 0x02)
/ / lcd_puts ( "1");
/ / 또
/ / lcd_puts ( "0");
/ /
DelayMs (950);
))
//------------------------------------------------ -------------
무효 write_HMC5843 (서명 번째 문자 주소, 서명 번째 문자 데이터)
(
i2c_start ();
) i2c_write (0x3C;
) i2c_write (주소;
) i2c_write (데이터;
i2c_stop ();
DelayMs (15);
)
//------------------------------------------------ -------------
무효 read_HMC5843 (서명 번째 문자 Addr)
(
i2c_start ();
) i2c_write (0x3C;
) i2c_write (Addr;
i2c_repStart ();
) i2c_write (0x3D;
mag_x은 =) i2c_read (1;
mag_x = (mag_x <<
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="시원한" border="0" />
i2c_read (1);
/ / mag_x 표제 =;
/ / lcd_goto (0x10);
/ / lcd_val = (heading/100) 48;
/ / lcd_putch (lcd_val);
/ /
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val/10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val % 10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_puts ( "");
mag_y은 =) i2c_read (1;
mag_y = (mag_x <<
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="시원한" border="0" />
i2c_read (1);
/ / mag_y으로 향하고 =;
/ / lcd_val = (heading/100) 48;
/ / lcd_putch (lcd_val);
/ /
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val/10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val % 10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_puts ( "");
mag_z은 =) i2c_read (1;
mag_z = (mag_x <<
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="시원한" border="0" />
i2c_read (0);
/ / mag_z 표제 =;
/ / lcd_val = (heading/100) 48;
/ / lcd_putch (lcd_val);
/ /
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val/10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_val = 100 표제 %를;
/ / lcd_val = (lcd_val % 10) 48;
/ / lcd_putch (lcd_val);
/ / lcd_puts ( "");
i2c_stop ();
)
//--------------------------
무효의 write_HMC5843_new (무효)
(
i2c_start ();
) i2c_write (0x3C;
) i2c_write (0x02;
) i2c_write (0x00;
i2c_stop ();
DelayMs (15);
)