问题描述
嗨.我在通过内联汇编访问一些图片端口时遇到了一些困难,并会提出一些建议.
我只是想使用带有高科技的c18编译器的mplab写入我的pic 18f的端口之一,该编译器主要由switch语句组成.
这个想法是通过一条使能信号在四条数据线上发送一个8位值.我将使用几年前编写的一些代码,但首先我需要弄清楚如何写到引脚.
我已经将所有内容回滚到字面上,只是试图点亮一些指示灯.我知道switch语句会触发ok,因为我可以通过标准c代码访问端口,但是尽管代码可以编译,但是内联asm中没有任何操作...
我已经尝试过两种方式...
Hi. I''m having some difficulty with accessing some pic ports through inline assembly and would appriciate some advice.
I''m just trying to write to one of the ports on my pic 18f using mplab with hitech's c18 compiler, which largly consists of a switch statement.
the Idea is to send an 8-bit value over four data lines with an enable signal. I''m going to use a bit of code I wrote a few years ago, but first I need to figure out how to write to the pins.
I''ve rolled everything back to literally just trying to get some leds to light up. I know the switch statement triggers ok as I can access the port through standard c code, but although the code compiles, there is no action from within the inline asm...
I''ve tried it both ways...
case 0x3F:
asm ( "GLOBAL _PORTB"); //DECLAIRE AS GLOBAL VARIABLE
asm ( "movlw 0x00");
asm ( "movwf _PORTB"); //CLEAR PINS
asm ( "movlw 0xff" );
asm ( "movwf _PORTB" ); //SET ALL PINS
IDENT_PORT = 0X01; //SWITCH STATEMENT IS FINE...
break;
还有...
and...
if(j > 0)
{
j = j+1; //dummy loop...recomended on the hitech website
} //when using asm blocks in constructs
#asm volatile
GLOBAL _PORTB;
movlw 0xff
movwf _PORTB;
#endasm
它必须与将PORTB称为变量有关,因为下划线标识了对全局变量的访问,但是PORTB是不是对的变量? ...但是当我尝试以PORTB访问它时,编译器显示错误.手册对asm相当轻巧.
It must be something to do with calling the PORTB as a variable, as the underscore identifies access to a global variable, but PORTB Isn''t a variable right? ...but the compiler shows an error when I try to access it as PORTB. The manual is fairly light on asm...
推荐答案
case 0x3F:
IDENT_PORT = 0X01;
j = 0x3F;
lower_nibble = (j && 0xf0);
PORTB = lower_nibble;
DelayMs(50);
asm( " swapf _j " );
asm( " andlw 0x0f0 " );
asm( " movwf _upper_nibble ");
PORTB = upper_nibble;
break;
或完全在c ...
or completly in c...
case 0x3f: //bits 4->7 are data lines. bit 3 is enable.
j = 0x3f; //load j with recieved movement data
upper_nibble = j & 0x0f0; //and with b11110000 to get upper nibble
PORTB = upper_nibble; //load onto data lines
RB3 = 1; //set enable pin high
asm( " nop " ); //skip instruction
RB3 = 0; //clear enable pin
k = (j << 4) | (j >> 4); //switch nibbles of 0x3f
lower_nibble = k & 0x0f0; //AND with 0x0f0
PORTB = lower_nibble; //load lower nibble onto portb
RB3 = 1; //pulse enable line
asm( " nop " );
RB3 = 0;
PORTB = 0x00; //clear and break
break;
,这里是我正在处理的汇编代码(应该)执行相同的操作...
and heres the assembly code I was working on which (should) do the same thing...
#asm
movlw 0x3f
movwf _tempstore
andlw 0x0f0
movwf _PORTD
call pulse_e
call Delay5
swapf _tempstore
andlw 0x0f0
movwf _PORTD
call pulse_e
call Delay255
movlw 0x00
goto DoNothing
pulse_e: bsf _PORTC, ENABLE
call Delay100
bcf _PORTC, ENABLE
retlw 0x00
Delay255: movlw 0xff
goto d0
Delay100: movlw 0x64
goto d0
Delay10: movlw 0x0a
goto d0
Delay5: movlw 0x05
d0: movwf _count1
d1: movlw 0xE7
movwf _counta
movlw 0x04
movwf _countb
Delay_0: decfsz _counta, f
goto
不是最吸引人的解决方案,但仍然相当强大...任何问题或批评都只是霍拉...
Not the most attractive of solutions but are still fairly robust...any questions or critisims just holla...
这篇关于mplab中的内联汇编...的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!