;功能說(shuō)明: ;1.做一個(gè)燈的左移,將左移的8個(gè)碼建于TABLE中. ;2.從TABLE中取出數(shù)據(jù)并以16位的方式存入93C46中,地址00H-03H. ;3.將93C46的00H-03H地址中的數(shù)據(jù)碼取出并存入877A的RAM(30H)-(37H),并輸出至877A的RC口. ;當(dāng)斷電再?gòu)?fù)電,數(shù)據(jù)碼不會(huì)消失. ;4.本電路所使用93C46為ATMEL或MICROCHIP的,或不是該廠的,則燒寫時(shí)間會(huì)有差異 ;必須調(diào)整本程序的DELAY時(shí)間 ;本實(shí)戰(zhàn)的目的是讓大家進(jìn)上步熟悉SPI通信的時(shí)序,熟悉93C46的讀寫,會(huì)用軟件模擬SPI通信 ;硬件接法: ;1.93C46的CS接877A的RB1口;CLK接877A的RB2口;DI接877A的RB4口;DO接877A的RB5口;93C46的ORG端接VCC,使93C46工作于16位方式 ;2.實(shí)驗(yàn)本實(shí)驗(yàn)須將MCD-DEMO實(shí)驗(yàn)板上的24CXX系列芯片先取下,在實(shí)驗(yàn)過(guò)程中不要按動(dòng)同樣接在RB口的按鍵,以免影響通信時(shí)序. ;3.實(shí)驗(yàn)板上拔碼開關(guān)S1要置ON,其它拔碼開關(guān)都可以關(guān)閉。 ;PIC單片機(jī)學(xué)習(xí)網(wǎng) 陳學(xué)乾 http://www.pic16.com 討論論壇:http://pic16.com/bbs/ ;版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處,并不能去掉或改變文件中的說(shuō)明文字。 ;程序文件名“MCD-93C46.ASM" ;程序清單如下: ;************************************ LIST P=16F877A, R=DEC include "P16F877A.inc" ;*********************************** __CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC; ;************************************ 定義查表偏移量 READ EQU 0 ;讀93C46 WRITE EQU 1 ;寫入93C46 EWEN EQU 2 ;93C46寫入使能 EWDS EQU 3 ;93C46寫入禁止 ;*************************************定義引腳位地址 CS EQU 1 CLK EQU 2 DI EQU 4 DO EQU 5 ;********************* ADR46 EQU 20H F1 EQU 23H F2 EQU 24H F3 EQU 25H F4 EQU 26H F5 EQU 27H F6 EQU 28H F7 EQU 29H ;********************** ORG 000H NOP ;放置一條ICD必需的空操作指令 GOTO MAIN ORG 0008H ;****************************************************** TABLE ADDWF PCL ,1 ;查表,PORTC一個(gè)燈左移 RETLW 01H RETLW 02H RETLW 04H RETLW 08H RETLW 10H RETLW 20H RETLW 40H RETLW 80H ;******************************************************* TO9346 MOVWF F1 ;將W的值送F1暫存 BSF PORTB ,CS ;寫入起始位1 BSF PORTB ,DI BSF PORTB ,CLK CALL DELAY BCF PORTB ,CLK CALL DELAY MOVFW F1 ADDWF PCL ,1 GOTO SREAD ;讀 GOTO SWRITE ;寫 GOTO SEWEN ;寫使能 GOTO SEWDS ;寫禁止 ;***************************************************** MAIN MOVLW 00H MOVWF PORTC ;LED先全部熄滅 MOVLW 20H MOVWF PORTB ;除DO外,其它通信口全送0
BSF STATUS,RP0 ;定義RA口,RC口全部為輸出 MOVLW 20H MOVWF TRISB ;RB口5腳為入,其它全為出 CLRW MOVWF TRISC ;RC口全為輸出. MOVWF OPTION_REG ;開啟RB口內(nèi)部弱上拉 BCF STATUS,RP0 ;************************************* LOOP CLRF 21H ;取碼指針 CLRF ADR46 ;93C46的地址00H MOVLW 04H MOVWF 22H ;4組8個(gè)碼 START MOVLW EWEN ;寫入使能 CALL TO9346 MOVFW 21H ;載入取碼指針 CALL TABLE ;至TABLE 取碼 MOVWF F5 ;存入"寫入寄存器" INCF 21H ,1 ;取下一個(gè)碼 MOVFW 21H CALL TABLE ;至TABLE 取碼 MOVWF F4 MOVLW WRITE CALL TO9346 ;寫入數(shù)據(jù) MOVLW EWDS CALL TO9346 ;寫禁止 INCF 21H ,1 ;取下一個(gè)碼 INCF ADR46 ,1 ;取下一個(gè)地址 CALL DELAY1 DECFSZ 22H ,1 ;直到寫完四個(gè)地址 GOTO START MOVLW 30H ;存入877A的RAM首地址 MOVWF FSR CLRF ADR46 ;93C46的地址00 MOVLW 04H MOVWF 22H ;讀93C46的四個(gè)地址,8個(gè)碼 ;***************** A1 MOVLW READ CALL TO9346 ;讀地址中的數(shù)據(jù) MOVFW F5 MOVWF INDF ;讀出的數(shù)據(jù)存入877A的RAM INCF FSR ,1 MOVFW F4 MOVWF INDF INCF ADR46 ,1 ;讀下一個(gè)地址 INCF FSR ,1 DECFSZ 22H ,1 ;直到讀完四個(gè)地址 GOTO A1 A2 MOVLW 08H MOVWF 22H MOVLW 30H ;RAM 30h-37H 共8個(gè)碼 MOVWF FSR OUTPUT MOVFW INDF MOVWF PORTC ;輸出結(jié)果到PORTC CALL DELAY1 INCF FSR ,1 DECFSZ 22H ,1 GOTO OUTPUT GOTO A2 ;*************************** SREAD MOVLW 80H ADDWF ADR46 ,0 ;6位地址加上兩位操作碼,10XXXXXX 讀指令 CALL SDT46 ;寫入操作碼與地址 CALL RDT46 ;讀高位數(shù)據(jù) MOVWF F5 ;存入F5 CALL RDT46 ;讀低位地址 MOVWF F4 ;存入F4 GOTO EX9346 ;************************** SWRITE MOVLW 40H ADDWF ADR46 ,0 ;6位地址加上兩位操作碼01XXXXXX 寫指令 CALL SDT46 ;寫入操作碼及地址 MOVFW F5 ;載入數(shù)據(jù) CALL SDT46 ;寫入數(shù)據(jù) MOVFW F4 ;載入數(shù)據(jù) CALL SDT46 ;寫入數(shù)據(jù) GOTO EX9346 ;****************************** SEWEN MOVLW 30H ;寫入操作碼0011XXXX 寫使能指令 CALL SDT46 GOTO EX9346 ;****************************** SEWDS CLRW ;寫入0000XXXX寫禁止指令 CALL SDT46 ;****************************** EX9346 BCF PORTB ,CS ;結(jié)束時(shí)清CS為0 RETURN ;****************************** SDT46: MOVWF F2 ;將要寫的數(shù)據(jù)送F2 MOVLW 08H ;寫入8位數(shù)據(jù) MOVWF F3 SD1: RLF F2 ,1 BSF PORTB ,DI BTFSS STATUS ,C BCF PORTB ,DI BSF PORTB ,CLK CALL DELAY BCF PORTB ,CLK CALL DELAY DECFSZ F3 ,1 GOTO SD1 RETURN ;****************************** RDT46 MOVLW 08H ;讀出8位數(shù)據(jù) MOVWF F3 RD1 BSF PORTB ,CLK CALL DELAY BCF PORTB ,CLK CALL DELAY BSF STATUS ,C BTFSS PORTB ,DO BCF STATUS ,C RLF F2 ,1 DECFSZ F3 ,1 GOTO RD1 MOVFW F2 ;讀得的數(shù)據(jù)送W RETURN ;******************************** DELAY MOVLW 1FH ;CLK時(shí)序廷時(shí) MOVWF F7 DECFSZ F7 ,1 GOTO $-1 RETURN ;******************************* DELAY1 ;廷時(shí) MOVLW .20 MOVWF F4 D1 MOVLW .40 MOVWF F5 D2 MOVLW .248 MOVWF F6 DECFSZ F6 ,1 GOTO $-1 DECFSZ F5 ,1 GOTO D2 DECFSZ F4 ,1 GOTO D1 RETURN ;******************************************** end ;源程序結(jié)束 ;***************************************************** |
|