3.2.3 MPASM PIC 35 35 #include include #include MPASM include PIC MPLAB C:\Program Files\MPLAB IDE\MCHIP_Tools PIC.inc 3-01 #include <p16f877a.inc> ; PIC16F877A #include math.asm ; 3-01 <> MPASM MPLAB 3-01 math.asm math.asm MPLAB 3-01 #include PIC list list list p=16f877a, r=dec ; PIC16F877A 3-02 list list config
2.5 idlocs PIC idloc idloc 0x1234 ; 0x1234 3-03 config idloc HEX errorlevel errorlevel Error (Warning) Message HEX 3-14 errorlevel 3-14 0 1 2 0 3-14 1 3 3-14 [] errorlevel + - errorlevel 0, -302, -305 ; 302 305 errorlevel 1, +305 ; 305
3-04 #define / #undefine #define #define DELAY_TIME 1000 ; DELAY_TIME 1000 #define KEY1 PORTB,7 ; KEY1 PORTB 7 3-05 #define btfss PORTB,7 btfss KEY1 3-05 #define KEY1 KEY1 #define #define #define equ equ #define #define equ #define MyCount 0x70 ; MyCount 0x70 w_temp equ 0x20 count1 equ MyCount ; w_temp 0x20 ; count1 MyCount ; MyCount 3-06 equ 3-06 w_temp equ #define equ 3-07 w_temp w_temp equ 0x20 ; w_temp 0x20 movlw 0x55 ;W=0x55 movwf w_temp ; W w_temp 0x20 0x55 movf w_temp, w ; w_temp W W=0x55 movwf FSR ; W FSR FSR=0x55 movlw w_temp ; w_temp W W=0x20 movwf FSR ; FSR w_temp FSR=0x20 0x55 3-07
cblock / endc equ equ cblock/endc cblock endc cblock/endc : :1 3-08 cblock 0x20 ; 0x20 w_temp status_temp buffer:8 var1 var2 ;w_temp 0x20 ;status_temp 0x21 ;buffer 0x22 8 ;var1 0x2a ;var2 0x2b endc ; 3-08 cblock equ bank cblock org org 3-09 org 0x0000 ; 0x0000 goto main ; org 0x0004 ; 0x0004 movwf w_temp ; w ;... ; org 0x0800 ; page1 page1 Sub1 return 3-09 org
org dt dt PIC retlw xx retlw retlw dt retlw 3-10 Table addwf PCL,f ;PC dt 0 ;retlw 0 dt 1, 2, 3 ;retlw 1 ;retlw 2 ;retlw 0x33 ( 3 ASCII ) dt ABC ;retlw A ;retlw B ;retlw C 3-10 de de EEPROM EEPROM PIC16F87x PIC16F62x PIC PIC16F7x Flash EEPROM EEPROM EEPROM EEPROM 0x2100 org de EEPROM HEX EEPROM 3-11 org 0x2100 ; ; EEPROM de 0, 1, 2, 3 ;EEPROM [0]=0, [1]=1, [2]=2, [3]=3 de ABCD ;[4]=0x41, [5]=0x42, [6]=0x43, [7]=0x44 3-11 3-11 EEPROM 0x00 0x00 0x01 0x02 0x03 0x41 0x42 0x43 0x44 EEPROM 0xff EEPROM MPLAB Microchip de EEPROM fill fill
fill fill 0x0000, 5 ; 5 0x0000(NOP ) fill (goto $), NEXT_BLOCK-$ ; NEXT_BLOCK ;goto $ org 0x0800 NEXT_BLOCK 3-12 3-12 fill goto $ goto 0x0000 goto PCLATH PCLATH[4:3] 00 0x0000 PCLATH 0 end end end end 3.2.4 MPASM MPASM MPASM C #define equ $ $ 3-12 3-13 ; Here goto Here ; Delay decfsz count, f ; 1 0 goto Delay ; ; $
goto $ ; decfsz count, f ; 1 0 goto $-1 ; 1 3-13 16 high low 16 8 8 8 PC PCLATH MPASM high low 3-14 ; #define DELAY_TIME.1000 ; movlw low(delay_time) ; 0xe8 movwf count ; movlw high(delay_time) ; 0x03 movwf count+1 ; ; PCLATH PC 1.5.2 movlw high(table) ; movwf PCLATH ; PCLATH movf index,w ; call Table ; 3-14 + - * / + - * / 3-15 ; BPS Fosc/(16 (X+1)) ; X = Fosc/(BPS*16) 1 #define BPS.9600 ; #define Fosc.4000000 ; 4MHz ;... ; movlw Fosc/(BPS*.16) 1 ;.25 10 25 movwf SPBRG ; 3-15 #define >> << >> 0 << 0 #define xxx 0x55 movlw xxx>>1 ;W=0x2a
movlw xxx<<2 ;W=0x54 movlw 1<<7 ;W=0x80 3-16 & ^ & ^ 3-17 ^ C switch-case VAL1 VAL2 VAL3 RAM ; C switch-case movf switchval, w ;. switch (W) xorlw VAL1 ;W=W ^ VAL1 btfsc STATUS, Z ; 0 goto Case_VAL1 ;case VAL1: W=VAL1 xorlw VAL1^VAL2 ;W=(W^VAL1)^(VAL1^VAL2) = W^VAL2 btfsc STATUS, Z ; 0 goto Case_VAL2 ;case VAL2: W=VAL2 xorlw VAL2^VAL3 ;W=(W^VAL2)^(VAL2^VAL3) = W^VAL3 btfsc STATUS, Z ; 0 goto Case_VAL3 ;case VAL3: W=VAL3 ;... ; case 3-17 3.2.5 MPASM MPASM 3.2.5.1 MPASM MPASM MPLAB banksel banksel pagesel banksel bank banksel bank STATUS RP1:RP0 bank ; PIC16F874A RAM 2 bank
banksel TRISC ; TRISC bank (TRISC bank1) ; bsf STATUS, RP0 ; 1 ; PIC16F877A RAM 4 bank banksel TRISC ; TRISC bank (TRISC bank1) ; bsf STATUS, RP0 ; 2 bcf STATUS, RP1 ; 3-18 banksel TRISC bank RP0 bank banksel bank RP1:RP0 bank banksel banksel bank bank bank bank banksel bank bankisel banksel STATUS IRP IRP bank bankisel IRP bankisel ; PIC16F877A RAM 4 bank cblock 0x120 buffer:8 ; 0x120 8 endc bankisel buffer ; bankisel IRP movlw low(buffer) ; buffer 8 movwf FSR ; FSR ; bsf STATUS, 7 ; IRP movlw movwf 0x20 FSR 3-19 pagesel pagesel banksel PCLATH[4:3] 2K
1 4K 2 PCLATH[3] 4K 4 pagesel ; PIC16F877A RAM 4 org 0x0100 ; 0 main pagesel sub1 ; call sub1 ; pagesel $ ; goto main ; org 0x0800 ; 1 sub1 return ; ; (main ) main bsf PCLATH, 3 ; sub1 bcf PCLATH, 4 call sub1 bcf PCLATH, 3 ; bcf PCLATH, 4 goto main 3-20 clrc/setc clrc/setc STATUS clrc bcf STATUS, C ;C=0 setc bsf STATUS, C ;C=1 clrz/setz clrz/setz STATUS clrz bcf STATUS, Z ;Z=0 setz bsf STATUS, Z ;Z=1 clrdc/setdc clrdc/setdc STATUS clrdc bcf STATUS, DC ;DC=0 setdc bsf STATUS, DC ;DC=1 skpc/skpnc skpc/skpnc STATUS skpc btfss STATUS, C ; C=1 skpnc btfsc STATUS, C ; C=0 skpz/skpnz
skpz/skpnz STATUS skpz btfss STATUS, Z ; Z=1 skpnz btfsc STATUS, Z ; Z=0 skpdc/skpndc skpdc/skpndc STATUS skpdc btfss STATUS, DC ; DC=1 skpndc btfsc STATUS, DC ; DC=0 bc/bnc bc/bnc 51 jc/jnc STATUS 3-21 movlw 0x31 ;W=0x31 addwf sum,f ;sum = sum+w bc Carry1 ; Carry1 nop ; bc ;... Carry1 nop bc XXX ; C=1 XXX bc btfsc goto STATUS,C XXX bnc YYY ; C=0 YYY bnc btfss goto STATUS,C YYY 3-21 bc/bnc goto bz/bnz bc/bnc STATUS movlw 0x55 ;W=0x55 xorwf flag,w ;flag = 0x55? bz Match ;Z=1, flag=0x55, Match nop ;Z=0, bz ;... Match nop
bz XXX ; Z=1 XXX bz btfsc goto STATUS,Z XXX bnz YYY ; Z=0 YYY bnz btfss goto STATUS,Z YYY 3-22 bdc/bndc STATUS bdc XXX ; DC=1 XXX bdc btfsc goto STATUS,DC XXX bndc YYY ; DC=0 YYY bndc btfss goto STATUS,DC YYY 3-23 3.2.5.2 MPASM macro endm ; 1 IncWord macro wordval ;IncWord wordval ; incf wordval,f 1 0 skpnz ; 0 incf wordval+1,f ; 1 1 endm ;
; counter:2 cblock endc 0x20 ; Loop IncWord counter ; counter 1 ; 3 ; counter wordval goto Loop ; ; $-? 3-24 3-15 lst 3-15 call 3-24 1 #include goto goto $ + - goto $-3 goto $+2 goto 3-25 ; ; >= FL_JGE macro filereg, litval, jumpto ;filereg litval jumpto movlw litval & 0xff W 0x00~0xff subwf filereg, w ; W skpnc ; C=0 <W goto jumpto ; >=W
endm ; ; val1 equ 0x20 ; ; FL_JGE val1,.100, Val1_Over ; val1 100 ; val1>=100 Val1_Over nop ; val1<.100 ;... ; Val1_Over nop ; val1>=.100 3-25 MPASM MPASM MPASM