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