S tím si překladač neporadí. Asm kód pro to musí být uzpůsoben. Ty totiž v asm budeš zcela jistě používat stejné registry jako překladač v C a zavoláním podporgramu mu je všechny přepíšeš. On se pak vrátí do hromady nesmyslů. Ikdybys tohle všechno vyřešil (pushováním použitých registrů), musíš ještě vyřešit předávání parametrů.
Obsluhu displeje určitě seženeš hotovou. Klávesnici si z cvičných důvodů napiš znova .
Já bych to tak černě neviděl.
Každý C překladač umožňuje vkládat asm příkazy , je n mu musíš říct, kde asm začíná a kde končí. V MPlab C18 pomocí _asm a _endasm.
Takže můžeš klidně svoje podprogramy v asm “zabalit” do C funkce.
např. inicializace displeje:
[code]void LCD_init()
{
_asm
//sem zkopíruješ svůj podprogram v asm
…
…
…
…
_endasm
}[/code]
Jen tak mimochodem v asembleru je napsaná většina knihovních funkcí nejen překladače MPlabC18, ale i jiných.
a překladač bych tak nepodceňoval - myslím, že si dokáže ošetřit, aby nenastala situace, kterou popisuje piityy , protože jinak by ta možnost vkládat vlastí asm kód postrádala jakýkoli smysl.
Ale na na druhou stranu s ním souhlasím - oboje (LCD i klávesnici) najdeš určitě hotové v několika variantách, nebo to vem jako cvičení
pro začátek budeš potřebovat dvě funkce - void init_lcd(void); a void zobraz(const rom char *buffer);
první dáš na začátek main funkce a druhou použiješ pro samotné zobrazení na LCD.
např.
[code]
#include “lcd.h” // pro obsluhu LCD #include // pro fci itoa
unsigned char lcd_buffer[33];
void main()
{
lcd_init();
while(1)
{
itoa(1234,lcd_buffer); //převede číslo 1234 na ascii znaky a uloží do bufferu
zobraz(lcd_buffer); //zobrazí obsah bufferu na LCD
}
}[/code]
To vše ovšem za předpokladu, že použijěš zmiňovaný MPlab C18.
Oba soubory zkopíruj do složky s konkrétním projektem.
A v této části si uprav výstupy na které si lcd připojíš, případně použij ty zadané:
[code]#define RS PORTBbits.RB4 #define RW PORTBbits.RB3 #define E PORTBbits.RB2
Momentálně zkouším Hi-Tech pro řadu PIC16xx, protože to potřebuji do školy.
A vypadá to, že tento compiler funkce pro LCD nemá, alespoň v manuálu jsem je nenašel.
V manuálu C18 jsem je našel okamžitě.
Takže si vyrobím zkušební desku na PIC18Fxx a bude to vyřešené .
skusil si zlozku C:\Programs\Microchip\HI TECH 9.81\samples
res tam kde si si to nainsataloval…
ked sme uz pritom mam v asm komunikacnu rutinu odladenu s presnym casovanim…skusil som to prepisat do Cka ale akosi to uz nekomunikuje predpokladam ze sa rozhodi casovanie, TAk ze bodol by nejaky link ako skombinovatasms C hitech, ide mi hlavne o predavanie dat medzi asm a Ckom, natrepat tam asm niej eproblem ale ako vysvetlit predavanie dat… dakujem
Hi Tech neznám, ale je dost pravděpodobné, že si budeš muset upravit názvy sfr registrů, přístup k bitům portů (PORTBbits.RB0) a čekací smyčku (Delay100TCYx(24)) pokud nejsou shodné.
D10x
nop
bra $+2
bra $+2
bra $+2
D10_1
decfsz WREG,1
bra D10x
return
GLOBAL Delay10TCYx
END[/code]
tedy úplně to samé (nebo hodně podobné) co jsi určitě používal do teď v asm a stejně tak můžeš ladit přesné časy přidáváním nějakých nopů i v C zápisu.
edit:
zapomněl jsem napsat
za druhé: výše uvedený způsob je nejnehospodárnější časování - vhodné leda tak při nějaké inicializaci
od časování jsou v MCU časovače, které pouhým zadáním jejich hodnoty můžeš ladit až mikroskopicky přesně - a je jedno jestli k tomu použiješ asembler, nebo C