C
charizard1987
Guest
Ahoj, já jsem plánování, aby můj robot vnímat teplotu, pak se při určité teplotě, LED světlo, ventilátor pracovat a na displeji LCD teplotu.I am using PIC16f877a, pin spojení mezi LCD a PIC vypadá to,
LCD => PIC
DB0 ~ DB7 => RB1 ~ RB7 (portB)
RS => RD7
E => RC7
Nicméně, když zkusím spustit, LCD prostě show pevný blok v první linii.Po Poradce při potížích pro docela někdy, nemohl jsem najít kořen problému, může mi někdo pomoct s tímto?Tady je můj kód.Dívám se na datasheet, se píše, že port B má slabé vytáhnout, musím vypnout?
Díky.
//================== Patří ============================= ====
# Include <pic.h>
//=============== Konfigurace ==============================
__CONFIG (0x3F32);
//=============== Definovat IO port =============================
# Define lcd PORTB / / RB1-RB7
# Define RS RD7
# Definovat E RC7
# Define CHANNEL0 0b10000001 / / AN0
# Define Fana RC1
# Define Leda RC2
# Define ledB RC3
//============== FUNCTION PTOTOTYPE =========================
neplatné e_pulse (void);
neplatné zpoždění (unsigned short i);
neplatné send_char (unsigned char data);
neplatné send_config (unsigned char data);
neplatné lcd_goto (unsigned char data);
neplatné lcd_clr (void);
neplatné dis_num (unsigned long data);
neplatné přírůstek (unsigned long data);
neplatné read_adc (void);
unsigned short read_temp (void);
//==================== HLAVNÍ =========================== =====
unsigned short výsledek;
unsigned short temp, tempa;
void main (void)
(
ADRESH = 0; / / jasné / D výsledek
ADRESL = 0; / / jasné / D výsledek
/ / Nastavení ADCON1 Registrace
ADCON1 = 0b11000101; / / A / D výsledek zarovnáno,
/ / Configure RA2 a RA5 například digitální I / O
TRISA = 0b11011011; / / configure PORTA I / O směr
TRISB = 0b00000000; / / configure PORTB jako výstup
TRISC = 0b00000000; / / configure PORTC jako výstup
TRISD = 0b00000000; / / configure PORTD jako výstup
TRISE = 0b00000000; / / set porte jako výstup
PORTA = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
/ / OPTION_REG = 0b11111111;
while (1)
(
send_config (0b00000001); / / jasný displej na LCD
send_config (0b00000010); / / LCD Návrat na hlavní stránku
send_config (0b00000110); / / vstupní režim-cursor nárůst 1
send_config (0b00001100); / / diplay dál, cursor off a kurzor bliká off
send_config (0b00111000) / / funkce nastavena
lcd_goto (0); / / kurzor začít od začátku
/ / Zobrazení znaků na LCD
send_char ('');
send_char ('T');
send_char ('E');
send_char ('M');
send_char ('P');
send_char ('.');
send_char ('=');while (1) / / nekonečno smyčka
(
/ / Čidlo
ADCON0 = CHANNEL0; / / Channel1 = 0b10001001
lcd_goto (
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Chladný" border="0" />
;
read_adc ();
temp = read_temp ();
dis_num (temp/10);
send_char ('.');
dis_num (temp% 10);
send_char (0b11011111);
send_char ('C');
send_char ('');
send_char ('');
tempa = temp;if (tempa> 400)
(/ / * LED a Fan aktivováno pouze pro
Leda = 1; / / * teplota vyšší než 40'C
ledB = 0;
Fana = 1;
)
jiný
(
Leda = 0;
ledB = 1;
Fana = 0;
)
zpoždění (2000);
)
)
)//================== Podprogramu LCD nastavení ==========================
neplatné send_config (unsigned char data)
(
RS = 0;
LCD = data;
zpoždění (500);
e_pulse ();
)
neplatné e_pulse (void)
(
E = 1;
zpoždění (500);
E = 0;
zpoždění (500);
)
neplatné send_char (unsigned char data)
(
RS = 1;
LCD = data;
zpoždění (500);
e_pulse ();
)neplatné lcd_goto (unsigned char data)
(
if (data <16)
(
send_config (0x80 data);
)
jiný
(
data = data-20;
send_config (0xC0 data);
)
)neplatné lcd_clr (void)
(
RS = 0;
send_config (0x01);
zpoždění (600);
)neplatné dis_num (unsigned long data)
(
unsigned char hundred_thousand;
unsigned char ten_thousand;
unsigned char tisíc;
unsigned char set,
unsigned char desáté;
hundred_thousand = data/100000;
data = data% 100000;
ten_thousand = data/10000;
data = data% 10000;
tisíc = data / 1000;
data = data% 1000;
sto = data / 100;
data = data% 100;
desátého = data / 10;
data = data% 10;
if (hundred_thousand> 0)
(
send_char (hundred_thousand 0x30) / / 0x30 zní, aby se stala ASCII kódu
send_char (ten_thousand 0x30);
send_char (tis 0x30);
send_char (sto 0x30);
send_char (desátá 0x30);
send_char (data 0x30);
)
else if (ten_thousand> 0)
(
send_char (ten_thousand 0x30) / / 0x30 zní, aby se stala ASCII kódu
send_char (tis 0x30);
send_char (sto 0x30);
send_char (desátá 0x30);
send_char (data 0x30);
)
else if (tis> 0)
(
send_char (tis 0x30) / / 0x30 zní, aby se stala ASCII kódu
send_char (sto 0x30);
send_char (desátá 0x30);
send_char (data 0x30);
)
else if (sto> 0)
(
send_char (sto 0x30) / / 0x30 zní, aby se stala ASCII kódu
send_char (desátá 0x30);
send_char (data 0x30);
)
else if (desátá> 0)
(
send_char (desátá 0x30) / / 0x30 zní, aby se stala ASCII kódu
send_char (data 0x30);
)
else send_char (data 0x30) / / 0x30 zní, aby se stala ASCII kódu
)
neplatné přírůstek (unsigned long data)
(
unsigned short j;
pro (j = 10; j> 0; j -)
(Lcd_goto (32);
data = data 1;
dis_num (data);
zpoždění (10000);
)
)
//================== Podprogramu ADC =========================
neplatné read_adc (void)
(
unsigned short i;
unsigned long result_temp = 0;
pro (i = 2000; i> 0; i-= 1) / / looping 2000 časů pro získání průměrné hodnoty
(
ADGO = 1; / / ADGO je bit 2 ADCON0 registru
while (ADGO == 1); / / ADC start, ADGO = 0 po dokončení ADC pokroku
vysledek = ADRESH;
výsledek = výsledek <<8, / / posun vlevo pro 8 bit
výsledek = výsledek | ADRESL; / / 10 bit výsledek z ADC
result_temp = vysledek;
)
vysledek = result_temp/2000; / / získání průměrné hodnoty
)
unsigned short read_temp (void)
(
unsigned short temp;
temp = vysledek;
návrat temp;
)
//================== Podprogram DELAY ==========================
neplatné zpoždění (unsigned short i)
(
for (; i> 0; i -);
)
LCD => PIC
DB0 ~ DB7 => RB1 ~ RB7 (portB)
RS => RD7
E => RC7
Nicméně, když zkusím spustit, LCD prostě show pevný blok v první linii.Po Poradce při potížích pro docela někdy, nemohl jsem najít kořen problému, může mi někdo pomoct s tímto?Tady je můj kód.Dívám se na datasheet, se píše, že port B má slabé vytáhnout, musím vypnout?
Díky.
//================== Patří ============================= ====
# Include <pic.h>
//=============== Konfigurace ==============================
__CONFIG (0x3F32);
//=============== Definovat IO port =============================
# Define lcd PORTB / / RB1-RB7
# Define RS RD7
# Definovat E RC7
# Define CHANNEL0 0b10000001 / / AN0
# Define Fana RC1
# Define Leda RC2
# Define ledB RC3
//============== FUNCTION PTOTOTYPE =========================
neplatné e_pulse (void);
neplatné zpoždění (unsigned short i);
neplatné send_char (unsigned char data);
neplatné send_config (unsigned char data);
neplatné lcd_goto (unsigned char data);
neplatné lcd_clr (void);
neplatné dis_num (unsigned long data);
neplatné přírůstek (unsigned long data);
neplatné read_adc (void);
unsigned short read_temp (void);
//==================== HLAVNÍ =========================== =====
unsigned short výsledek;
unsigned short temp, tempa;
void main (void)
(
ADRESH = 0; / / jasné / D výsledek
ADRESL = 0; / / jasné / D výsledek
/ / Nastavení ADCON1 Registrace
ADCON1 = 0b11000101; / / A / D výsledek zarovnáno,
/ / Configure RA2 a RA5 například digitální I / O
TRISA = 0b11011011; / / configure PORTA I / O směr
TRISB = 0b00000000; / / configure PORTB jako výstup
TRISC = 0b00000000; / / configure PORTC jako výstup
TRISD = 0b00000000; / / configure PORTD jako výstup
TRISE = 0b00000000; / / set porte jako výstup
PORTA = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
/ / OPTION_REG = 0b11111111;
while (1)
(
send_config (0b00000001); / / jasný displej na LCD
send_config (0b00000010); / / LCD Návrat na hlavní stránku
send_config (0b00000110); / / vstupní režim-cursor nárůst 1
send_config (0b00001100); / / diplay dál, cursor off a kurzor bliká off
send_config (0b00111000) / / funkce nastavena
lcd_goto (0); / / kurzor začít od začátku
/ / Zobrazení znaků na LCD
send_char ('');
send_char ('T');
send_char ('E');
send_char ('M');
send_char ('P');
send_char ('.');
send_char ('=');while (1) / / nekonečno smyčka
(
/ / Čidlo
ADCON0 = CHANNEL0; / / Channel1 = 0b10001001
lcd_goto (
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Chladný" border="0" />
;
read_adc ();
temp = read_temp ();
dis_num (temp/10);
send_char ('.');
dis_num (temp% 10);
send_char (0b11011111);
send_char ('C');
send_char ('');
send_char ('');
tempa = temp;if (tempa> 400)
(/ / * LED a Fan aktivováno pouze pro
Leda = 1; / / * teplota vyšší než 40'C
ledB = 0;
Fana = 1;
)
jiný
(
Leda = 0;
ledB = 1;
Fana = 0;
)
zpoždění (2000);
)
)
)//================== Podprogramu LCD nastavení ==========================
neplatné send_config (unsigned char data)
(
RS = 0;
LCD = data;
zpoždění (500);
e_pulse ();
)
neplatné e_pulse (void)
(
E = 1;
zpoždění (500);
E = 0;
zpoždění (500);
)
neplatné send_char (unsigned char data)
(
RS = 1;
LCD = data;
zpoždění (500);
e_pulse ();
)neplatné lcd_goto (unsigned char data)
(
if (data <16)
(
send_config (0x80 data);
)
jiný
(
data = data-20;
send_config (0xC0 data);
)
)neplatné lcd_clr (void)
(
RS = 0;
send_config (0x01);
zpoždění (600);
)neplatné dis_num (unsigned long data)
(
unsigned char hundred_thousand;
unsigned char ten_thousand;
unsigned char tisíc;
unsigned char set,
unsigned char desáté;
hundred_thousand = data/100000;
data = data% 100000;
ten_thousand = data/10000;
data = data% 10000;
tisíc = data / 1000;
data = data% 1000;
sto = data / 100;
data = data% 100;
desátého = data / 10;
data = data% 10;
if (hundred_thousand> 0)
(
send_char (hundred_thousand 0x30) / / 0x30 zní, aby se stala ASCII kódu
send_char (ten_thousand 0x30);
send_char (tis 0x30);
send_char (sto 0x30);
send_char (desátá 0x30);
send_char (data 0x30);
)
else if (ten_thousand> 0)
(
send_char (ten_thousand 0x30) / / 0x30 zní, aby se stala ASCII kódu
send_char (tis 0x30);
send_char (sto 0x30);
send_char (desátá 0x30);
send_char (data 0x30);
)
else if (tis> 0)
(
send_char (tis 0x30) / / 0x30 zní, aby se stala ASCII kódu
send_char (sto 0x30);
send_char (desátá 0x30);
send_char (data 0x30);
)
else if (sto> 0)
(
send_char (sto 0x30) / / 0x30 zní, aby se stala ASCII kódu
send_char (desátá 0x30);
send_char (data 0x30);
)
else if (desátá> 0)
(
send_char (desátá 0x30) / / 0x30 zní, aby se stala ASCII kódu
send_char (data 0x30);
)
else send_char (data 0x30) / / 0x30 zní, aby se stala ASCII kódu
)
neplatné přírůstek (unsigned long data)
(
unsigned short j;
pro (j = 10; j> 0; j -)
(Lcd_goto (32);
data = data 1;
dis_num (data);
zpoždění (10000);
)
)
//================== Podprogramu ADC =========================
neplatné read_adc (void)
(
unsigned short i;
unsigned long result_temp = 0;
pro (i = 2000; i> 0; i-= 1) / / looping 2000 časů pro získání průměrné hodnoty
(
ADGO = 1; / / ADGO je bit 2 ADCON0 registru
while (ADGO == 1); / / ADC start, ADGO = 0 po dokončení ADC pokroku
vysledek = ADRESH;
výsledek = výsledek <<8, / / posun vlevo pro 8 bit
výsledek = výsledek | ADRESL; / / 10 bit výsledek z ADC
result_temp = vysledek;
)
vysledek = result_temp/2000; / / získání průměrné hodnoty
)
unsigned short read_temp (void)
(
unsigned short temp;
temp = vysledek;
návrat temp;
)
//================== Podprogram DELAY ==========================
neplatné zpoždění (unsigned short i)
(
for (; i> 0; i -);
)