錯誤:
Debug build of project `C:NO1no1.s.mcp' started.
Language tool versions: pic30-as.exe v3.21, pic30-ld.exe v3.21, pic30-ar.exe v3.21
Preprocessor symbol `__DEBUG' is defined.
Fri Jan 29 11:56:58 2010
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:NO1no1.o".
Clean: Done.
Executing: "C:Program FilesMicrochipMPLAB ASM30 Suitebinpic30-as.exe" "no1.s" -o"no1.o" -p=24FJ128GB110 --defsym=__DEBUG=1 -g
Executing: "C:Program FilesMicrochipMPLAB ASM30 Suitebinpic30-ld.exe" "no1.o" -Tp24FJ128GB110.gld --defsym=__MPLAB_BUILD=1 --defsym=__MPLAB_DEBUG=1 -o"no1.s.cof" -Map="no1.s.map" --report-mem
C:Program FilesMicrochipMPLAB ASM30 Suitebinbin/pic30-coff-ld.exe: cannot open linker script file p24FJ128GB110.gld: No such file or directory
Link step failed.
----------------------------------------------------------------------
Debug build of project `C:NO1no1.s.mcp' failed.
Language tool versions: pic30-as.exe v3.21, pic30-ld.exe v3.21, pic30-ar.exe v3.21
Preprocessor symbol `__DEBUG' is defined.
Fri Jan 29 11:56:59 2010
指令碼:
;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
DEC CPSGT ;若fa>fd 則跳(PIC指令)
GOTO LOOP_MS ;重複迴圈
RETURN ;副程式結束 返回主程式
;---------------------------------------------------------------------------
DELAY_1MS: ;延遲時間的副程式
MOV VAL_US ;設定W值為1MS DELAY給定初值
MOV #COUNT,w0 ;將W值給COUNT
;---------------------------------------------------------------------------
DEC_LOOP ;延遲時間迴圈副程式
NOP ;不做任何運算
DEC CPSGT ;若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
*/
Edited by Ryang on 2010年01月29日 13:29:54