2013-04-16 31 views
0

我正在玩MSP430微控制器,我想了解如何讓不同的物理組件與對方通話。在這種情況下,我有一個代碼(來自朋友),它使用dip開關打開7段LED顯示屏的不同部分。我試圖通讀這段代碼並理解它是如何工作的,以及正在使用的寄存器。有人可以通過這個代碼(程序集)走過我嗎?

; Author: 
; Date: 
; Title: 
; 
#include "msp430.h"      ; #define controlled include file 
; 
; This is a basic template for the MSP430(G2231). 
; The I2C.r43 library should be linked into this build to resolve references 
; to the subroutines defined as EXTERN below. 
; 
RESET EQU  0FFFEh 
RAM  EQU  00200h 
FLASH EQU  0F800h 
; 
; The possible "Address" values to be passed into the subroutines below. 
; 
I2C_0 EQU  00000000b // A2-A0: 000 ;Switches 
I2C_1 EQU  00000010b // A2-A0: 001 
I2C_2 EQU  00000100b // A2-A0: 010 
I2C_3 EQU  00000110b // A2-A0: 011 ;LEDs 
I2C_4 EQU  00001000b // A2-A0: 100 
I2C_5 EQU  00001010b // A2-A0: 101 
I2C_6 EQU  00001100b // A2-A0: 110 
I2C_7 EQU  00001110b // A2-A0: 111 
; 
; Routines below come from external I2C module 
; 
; No parameters 
     EXTERN InitI2C 
; Address in R12 (just A3-A1 required) - A2-A0 pins left-shifted one 
; On return: R12 = 1 if A part exists, R12 = 2 if _ part exists, R12 = 0 if no device 
     EXTERN ChkI2C   
; Address in R12 (just A3-A1 required) - A2-A0 pins left-shifted one 
; Data to output in R13 
     EXTERN OutI2C   
; Address in R12 (just A3-A1 required) - A2-A0 pins left-shifted one 
; Data received in R12 on return 
     EXTERN InI2C 

     PUBLIC main 

     ORG  RESET 
     DC16 init     ; Set reset vector to 'init' label 

     ORG  RAM 

     ; <declare any global variables here> 

     ORG  FLASH 

init: mov  #0280h, SP    ; Set up stack pointer 
     mov  #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer 

main: ; <insert additional program code here> 

     mov.w #0x5A80, &WDTCTL 
     call #InitI2C 
     clr.w R12 
     call #InI2C 
     mov.w R12, R13 
     mov.w #0x6, R12 
     call #OutI2C 
     jmp main 

     END 

我對代碼的各個部分有一個很難理解的地方。例如:

我們真的需要這條線:

mov.w #0x5A80, &WDTCTL 

?如何將6移至R13?爲什麼它是6而不是其他號碼?我也覺得主要部分可以被簡化得比現在更多。

如果有人可以幫助我運行此代碼?我會很感激。

回答

1

有些東西從I2C讀入R12,它被移動到R13並從寄存器R13發送到輸出I2C(它在其他地方定義的子程序中完成 - EXTERN)。

不知道爲什麼在主循環初始化,但也許有人會說。

編號6是I2C模塊的尋址,因爲它是在註釋中寫入的。

如果您還有其他問題,請提問。

+0

感謝您的相對快速的響應。有些東西是從I2C讀取並放入R12。當我在調試器中運行此代碼時,在調用InI2C子例程後,R12包含十六進制值FF。對FF值有什麼意義? 至於數字6,如果使用多於一個,是否指特定的I2C擴展器? – user2288023

+0

如果調試器模擬I2C(如果您沒有在真正的微控制器上運行),我不確定。我沒有任何模擬器來測試它。 6號可以參考I2C_6常數,因爲我再次閱讀它應該是代碼顯示,但我可能是錯的... – Jakuje

+0

它看起來像這個代碼沒有針對具體開關打開LED的特定部分。還是呢?如果我想打開LED上的特定部分,看起來會是什麼樣子? – user2288023

相關問題