Re: 16系列的程式碼改成24系列的程式碼出現錯誤
|
||||
---|---|---|---|---|
中級會員
|
雖然我沒有寫過PIC24的程式,但是我剛剛幫你看過PIC24FJ256GB110的命令列裡面沒有decfsz這個命令
建議使用dec搭配cpseq來完成
發表於: 2010/1/29 8:29
|
|||
|
16系列的程式碼改成24系列的程式碼出現錯誤
|
||||
---|---|---|---|---|
新會員
|
原本是PIC16F877的程式碼
改成PIC24FJ256GB110的程式碼錯誤了 請問要怎樣改才能正確 錯誤: no1.s: Assembler messages: no1.s:135: Error: Invalid mnemonic: 'decfsz' no1.s:145: Error: Invalid mnemonic: 'decfsz' 程式碼: ;LIST P=24fj128gb106 ;目錄控制 #INCLUDE<P24fj128gb106.INC> ;存取設定之特殊暫存器 VAL_US = .249 ;1MS DELAY給定初值 VAL_MS = .100 ;呼叫1MS DELAY之次數 COUNT = 0x20 ;1MS DELEY變數位址 COUNT_MS = 0x21 ;呼叫1MS DELAY之變數位址 #CN EQU 0x22 ;設定CN變數位址 #CN1 EQU 0x23 ;設定CN1變數位址 #ORG 0x00 ;程式的起點(以下程式的機器碼由000開始存放) NOP ;不做任何運算 ;--------------------------------------------------------------------------- START: ;起始程式 CALL PIC ;呼叫單晶片初始化副程式 CALL CURSOR ;呼叫LCD的游標初始狀態副程式 CALL CLEAR ;呼叫LCD的銀幕全部清除副程式 CALL FUNC ;呼叫LCD字型點數.行數.及匯流排的位元數(D0-D7)副程式 CALL ONOFF ;呼叫作為設定LCD會顯示字元 顯示游標並閃爍的副程式 CLR CN ;清除CN CLR CN1 ;清除CN1 ;--------------------------------------------------------------------------- CHECK: ;檢查副程式 Btss PORTD,#4 ;判斷是否有按按鍵(判斷DA是否被按. .1表示有 0表示沒有) GOTO CHECK ;再回去檢查按鍵是否被按 MOV #PORTD,w0 ;將PORTD的值給W AND #0x0F,w0 ;將按鍵由PORTD輸入的值和Ox0F做AND取前四位元查表用(0x0F和W的值做AND後再給W) MOV #CN1,w0 ;將W的值給CN1 INC CN1 ;將CN1裡面的值加1 Btsc CN1,#4 ;判斷按鍵是否按到F(判斷CN1的第4位元是否為零) GOTO START ;回到前面.重新開始 CALL TABLE ;呼叫查表 CALL OUT ;呼叫LCD顯示輸出的副程式(呼叫OUT副程式) CALL DELAY ;呼叫延遲副程式 INC CN ;將CN裡面的值加1 BTss CN, #4 ;判斷LCD是否顯示16個位元(判斷CN的第4位元是否為1) GOTO CHECK ;回去檢查是否有按鍵被按或是按到F CALL SET2 ;呼叫設定LCD從第二行第一個字開始顯示的副程式(呼叫SET2副程式) CLR CN ;將CN暫存器清為0 ;--------------------------------------------------------------------------- CHECK1: ;檢查副程式 BTss PORTD, #4 ;判斷是否有按按鍵(判斷DA是否被按. .1表示有 0表示沒有) GOTO CHECK1 ;再回去檢查按鍵是否被按 MOV #PORTD,W0 ;將PORTD的值給W AND #0x0F,W0 ;將按鍵由PORTD輸入的值和Ox0F做AND取前四位元查表用(0x0F和W的值做AND後再給W) MOV CN1,w0 ;將W的值給CN1 INC CN1 ;將CN1裡面的值加1 BTSC CN1,#4 ;判斷按鍵是否按到F(判斷CN1的第4位元是否為零) GOTO START ;回到前面.重新開始 CALL TABLE ;呼叫查表 CALL OUT ;呼叫LCD顯示輸出的副程式(呼叫OUT副程式) CALL DELAY ;呼叫延遲副程式 INC CN ;將CN裡面的值加1 BTSS CN, #4 ;判斷LCD是否顯示16個位元(判斷CN的第4位元是否為1) GOTO CHECK1 ;回去檢查是否有按鍵被按或是按到F GOTO START ;回到初始狀態 ;--------------------------------------------------------------------------- SET2: ;作為設定LCD從第二行第一個字開始顯示的副程式 MOV 0xC0 ;將十六進制常數0xCO載入暫存器W內 MOV #PORTC,w0 ;將W的值給PORTC CALL SET3 ;呼叫SET3副程式 RETURN ;副程式結束 返回主程式 ;--------------------------------------------------------------------------- OUT: ;作為將PORTC的值讀到LCD裡面顯示的副程式 MOV #PORTC,W0 ;將W值給PORTC BCLR PORTB, #0 ;RS BCLR PORTB, #1 ;RW BCLR PORTB, #2 ;EN NOP ;不做任何運算 BCLR PORTB, #2 ;EN CALL DELAY ;呼叫延遲副程式(呼叫DELAY副程式) RETURN ;副程式結束 返回主程式 ;--------------------------------------------------------------------------- PIC: ;作為單晶片初始化的副程式(規劃PIC) CLR PCLATH ;清除PCLATH CLR TRISC ;清除TRISC CLR PORTC ;清除PORTC CLR TRISB ;清除TRISB CLR PORTB ;清除PORTB MOV B'00011111' ;設定W值為0-4位元輸入 5-7位元輸出 MOV #TRISD,w0 ;將W值給TRISD CLR PORTD ;清除PORTD RETURN ;副程式結束 返回主程式 ;--------------------------------------------------------------------------- CURSOR: ;作為設定LCD游標從00H開始的副程式 MOV B'00000011' ;設定W值為0-1位元輸入 2-7位元輸出 MOV #PORTC,w0 ;將W值給PORTC CALL SET3 ;呼叫將要設定LCD的值讀進LCD裡設定的副程式(呼叫SET3) RETURN ;副程式結束 返回主程式 ;--------------------------------------------------------------------------- FUNC: ;作為設定LCD使用8位元的匯流排 5x7字型及用兩行顯示的副程式 MOV B'00111011' ;設定W值為0-1和3-5位元輸入 3和6-7位元輸出 MOV #PORTC,w0 ;將W值給PORTC CALL SET3 ;呼叫將要設定LCD的值讀進LCD裡設定的副程式(呼叫SET3) RETURN ;副程式結束 返回主程式 ;--------------------------------------------------------------------------- CLEAR: ;作為設定LCD清除銀幕顯示的副程式 MOV B'00000001' ;設定W值0位元輸入 2-7位元輸出 MOV #PORTC,w0 ;將W值給PORTC CALL SET3 ;呼叫將要設定LCD的值讀進LCD裡設定的副程式(呼叫SET3) RETURN ;副程式結束 返回主程式 ;--------------------------------------------------------------------------- ONOFF: ;作為設定LCD會顯示字元 顯示游標並閃爍的副程式 MOV B'00001111' ;設定W值0-3位元輸入 4-7位元輸出 MOV #PORTC,w0 ;將W值給PORTC CALL SET3 ;呼叫將要設定LCD的值讀進LCD裡設定的副程式(呼叫SET3) RETURN ;副程式結束 返回主程式 ;--------------------------------------------------------------------------- SET3: ;將要設定LCD的值讀進LCD裡設定的副程式 BCLR PORTB, #0 ;RS BCLR PORTB, #1 ;RW BCLR PORTB,#2 ;EN NOP ;不做任何運算 BCLR PORTB,#2 ;EN CALL DELAY ;呼叫延遲副程式(呼叫DELAY副程式) RETURN ;副程式結束 返回主程式 ;--------------------------------------------------------------------------- DELAY: ;延遲時間的副程式 MOV VAL_MS ;設定W值為呼叫1MS DELAY之次數 MOV #COUNT_MS,w0 ;將W值給COUNT_MS ;--------------------------------------------------------------------------- LOOP_MS: ;延遲時間迴圈副程式 CALL DELAY_1MS ;呼叫DELAY_1MS DecFSZ COUNT_MS ;若fa>fd 則跳(PIC指令) GOTO LOOP_MS ;重複迴圈 RETURN ;副程式結束 返回主程式 ;--------------------------------------------------------------------------- DELAY_1MS: ;延遲時間的副程式 MOV VAL_US ;設定W值為1MS DELAY給定初值 MOV #COUNT,w0 ;將W值給COUNT ;--------------------------------------------------------------------------- DEC_LOOP ;延遲時間迴圈副程式 NOP ;不做任何運算 decfsz COUNT,f ;若fa>fd 則跳(PIC指令) GOTO DEC_LOOP ;重複迴圈 RETURN ;副程式結束 返回主程式 ;--------------------------------------------------------------------------- ;TABLE ;查表的內容 ADD PCL ;將PCL與f相加 (加法器) RETLW #0x30,w0 ;0 RETLW #0x31,w0 ;1 RETLW #0x32,w0 ;2 RETLW #0x33,w0 ;3 RETLW #0x34,w0 ;4 RETLW #0x35,w0 ;5 RETLW #0x36,w0 ;6 RETLW #0x37,w0 ;7 RETLW #0x38,w0 ;8 RETLW #0x39,w0 ;9 RETLW #0x41,w0 ;A RETLW #0x42,w0 ;B RETLW #0x43,w0 ;C RETLW #0x44,w0 ;D RETLW #0x45,w0 ;E .END ;程式結束 /* EOF */
發表於: 2010/1/28 23:05
|
|||
|