Cecko pro PICe

Pavel Prochazka.zde.cz hacesoft@mujmail.cz
Středa Říjen 26 07:49:46 CEST 2005


Skusim. Taky jsem to skousel pres ty posuny ale vysledny kod je silene 
dlouhy....

Pavel Prochazka.zde.cz

Lukas Grepl napsal(a):

>>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
>_______________________________________________
>HW-list mailing list  -  sponsored by www.HW.cz
>Hw-list@list.hw.cz
>http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
>
>
>  
>



Další informace o konferenci Hw-list