Cecko pro PICe
Lukas Grepl
L.Grepl@sh.cvut.cz
Úterý Říjen 25 23:03:08 CEST 2005
> void zapis_w(void){
> //zkopirovat 4 az 7 bity z registru DATA na porty B.
> //RB1 ...DB4 ... bit4 registru data
> //RB2 ...DB5 ... bit5 registru data
> //RB4 ...DB6 ... bit6 registru data
> //RB5 ...DB7 ... bit7 registru data
> #asm
> bcf _PORTB,1
> bcf _PORTB,2
> bcf _PORTB,4
> bcf _PORTB,5
> btfss _data,4 -- nemelo tu byt btfsc?
> bsf _PORTB,1
> btfss _data,5
> bsf _PORTB,2
> btfss _data,6
> bsf _PORTB,4
> btfss _data,7
> bsf _PORTB,5
> #endasm
> return;
> }
Co treba neco jako:
void zapis(char data)
{
RB1 = RB2 = RB4 = RB5 = 0;
if (data & (1 << 4))
RB1 = 1;
if (data & (1 << 5))
RB2 = 1;
if (data & (1 << 6))
RB4 = 1;
if (data & (1 << 7))
RB5 = 1;
}
nebo
void zapis(char data)
{
RB1 = data & 16 ? 1 : 0;
RB2 = data & 32 ? 1 : 0;
RB4 = data & 64 ? 1 : 0;
RB5 = data & 128 ? 1 : 0;
}
nebo
void zapis(char data)
{
RB1 = data >> 4; // cisteji RB1 = (data >> 4) & 1;
RB2 = data >> 5;
RB4 = data >> 6;
RB5 = data >> 7;
}
nebo
void zapis(char data)
{
union { char byte; struct { unsigned
b0:1,b1:1,b2:1,b3:1,b4:1,b5:1,b6:1,b7:1; } bits; } u;
u.byte = data;
RB1 = u.bits.b4;
RB2 = u.bits.b5;
RB4 = u.bits.b6;
RB5 = u.bits.b7;
}
a jiste by se nasly dalsi zpusoby. (nerucim za stoprocentni spravnost,
nic z toho jsem ted nezkousel..)
Mimochodem doporucuji si udelat hlavickovy soubor, ktery bude obsahovat
neco na zpusob:
#define LCD_D7 RB5
#define LCD_D6 RB4
#define LCD_D5 RB2
#define LCD_D4 RB1
atd..
a pak muzete (uz univerzalne pro jakekoliv zapojeni) napsat neco jako
(dalsi variace, takhle to mam v nejakem lcd.c):
void zapis(char data)
{
LCD_D7 = (data & 0x80) != 0;
LCD_D6 = (data & 0x40) != 0;
LCD_D5 = (data & 0x20) != 0;
LCD_D4 = (data & 0x10) != 0;
delayus(LCD_IODLY);
LCD_E = 1;
delayus(LCD_IODLY);
LCD_E = 0;
delayus(LCD_IODLY);
}
> swapf data,f
> rlf data,w
> movwf temp
> andlw 0x18
> addwf temp,w
> xorwf portb,w
> andlw 0x36
> xorwf portb,f
>
> A ted si to jenom prepisete do cecka... :-)
void zapis(char data)
{
data = (data >> 4) || (data << 4);
data >>= 1;
data += data & 0x18;
PORTB ^= (PORTB ^ data) & 0x36;
}
Snad jsem se moc nesekl ;-). Ale moc se mi ten kod nelibi - neni
nepouzitelny pro jine zapojeni vyvodu ;-).
Lukas Grepl
Další informace o konferenci Hw-list