Help! I2c problem in assembly.

I have a problem in my program. This program is to write in eeprom(hn58x2432) & read from it to display to lcd module.It is transmit by I2C. Please help me to check my program.

Thanks. It have some problem when it compiled.Below is the error message.

LINE 11 ACK REG P2.0==============>ILLEGAL MNEMONIC LINE 12 SCL REG P2.1==============>ILLEGAL MNEMONIC LINE 13 SDA REG P2.2==============>ILLEGAL MNEMONIC LINE 14 COUNTD EQU 41H ==============>ILLEGAL MNEMONIC .... Just like that =============================================================== I don't know some else bugs in it,so help me check it,please. Thanks. ===============================================================

;======================================================= ; MAIN PROGRAM ;======================================================= ORG 0000H ;===================================================== ;I2C SET I2C MODULE PINS ;===================================================== ;P1為LCM資料線專用接腳,P3為LCM之E,R/S,W/R用 ;===================================================== ACK REG P2.0 ;I2C ACKNOWLEDGE SCL REG P2.1 ;I2C SERIAL CLOCK SDA REG P2.2 ;I2C SERIAL DATA COUNTD EQU 41H COUNTU EQU 42H ;計數用 ADR EQU 43H ;I2C EEPROM ADDRESS DATA EQU 44H ;I2C要傳&#

X EQU 45H ;界面常數 ;------------------------------------------------------------------------------- MOV SP,#5FH MOV P2,#0EH ACALL INIT ;INITIAL LCM ACALL LINE1 ;游標停在第一行第一個字 MOV DPTR,#TAB1 ;將資料指標暫存器指向程式內資料所在 ACALL WR_TO_ROM ;將資料寫入ROM ACALL RD_FR_ROM ;將ROM資料讀出並顯示於LCM ;=============================== OK AJMP OK ;=============================== ; SUB ROUTINE ;=============================== INIT ACALL DLY40 ;INITIAL LCM MOV A,#38H ;設定LCM為8位元及2行顯示,5x7 dots ACALL WRINS ;設定E ENABLE 把指令碼設定進去 MOV A,#38H ACALL WRINS MOV A,#38H ACALL WRINS MOV A,#38H ACALL WRINS

MOV A,#08H ;#00001000B 液晶顯示OFF ACALL WRINS ;============================= MOV A,#01H ;#00000001B 清除液晶顯示 ACALL WRINS ;============================= MOV A,#06H ;#00000110B 寫入1BYTE,游標右移且ACC加一 ACALL WRINS ;============================= MOV A,#0CH ;#00001100B 液晶顯示ON,不顯示游標 ACALL WRINS RET ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ LINE1 MOV A,#10000000B ;顯示起始位址為第一行第一個字 ACALL WRINS RET ;============================= LINE2 MOV A,#11000000B ;顯示起始位址為第二行第一個字 ACALL WRINS RET ;------------------------------------------------------------ ;LCD 把指令碼設定進去直接控制LCD的螢幕顯示 ;------------------------------------------------------------ WRINS MOV P3,#00011111B ;P3為R/S, E , R/W NOP SETB P3.5 ;設定E為 ENABLE MOV P1,A ;將A內容設定進去 NOP CLR P3.5 ACALL DLY8 RET ;------------------------------------------------------------ ;LCD 把DATA碼設定進去 來顯示內定的文字 ;------------------------------------------------------------ WRDATA MOV P3,#10011111B NOP SETB P3.5 MOV P1,A NOP CLR P3.5 ACALL DLY16 RET ;------------------------------------------------------------

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;I2C 把程式中之字元碼寫入ROM中 ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ WR_TO_ROM: CALL I2C_WRITE_ADR ;傳輸目的ROM的位址,狀態為寫入 MOV R7,#00H ;把位址DPTR起的字元碼逐一送至EEPROM模組 NEXT MOV A,R7 ;直至遇到結束碼10H才返回主程式 MOVC A,@A+DPTR ;DPTR指到程式內的資料起始位址 CLR SDA ;開始傳輸程式內的資料到ROM MOV COUNTD,#8 MOV DATA,A ;將A的內容傳至DATA,由DATA作暫存器寫入 IWA RLC DATA MOV SDA,C SETB SCL CLR SCL DJNZ COUNTD,IWA CLR ACK SET ACK ;=======檢查後面字元是否10H================================================ CJNE A,#10H,RD_NX ;讀到10H,即停止讀取及寫入動作 RET RD_NX: INC R7 ;不是讀到10H,即繼續讀取下一個字元R7作為計數器 AJMP NEXT ;R7作為計數器看傳入多少字元 ========================================================================= ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;I2C 開始讀出ROM內的資料並顯示於螢幕 ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ RD_FR_ROM: MOV DATA,#0 CALL I2C_READ_ADR ;傳輸目的ROM的位址,狀態為讀出 MOV A,R7 ;把傳至ROM的字元碼,倒數送出至LCM模組來顯示 MOV COUNTU,A ;由R7可看出傳入多少字元到ROM裡面,此值傳入COUNTU RD_NX CLR SDA ;開始傳輸ROM內的資料到LCM MOV COUNTD,#8 RFR MOV X,#0 MOV A,#0 MOV C,SDA ;從SDA開始接收資料 ADDC A,X ;接收SDA加到A累積器中 ADD DATA,A ;A內容傳給DATA RL DATA SETB SCL CLR SCL DJNZ COUNTD,RFR ;傳完8個字元後 CLR ACK ;給一個應答 SET ACK MOV A,DATA ;將傳入的字元傳至A累積器 CALL WRDATA ;送出字元讓LCM顯示 DJNZ COUNTU,RD_NX ;持續讀出下一個字元,直到所有字元讀出 RET

;===========================================================

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;I2C 設定指定 ROM的位址並設定為寫入狀態 ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;=========================================================== I2C_WRITE_ADR: CLR SDA SET ACK MOV COUNTD,#8 MOV ADR,#11100010B ;設定寫入之ROM及其位址,狀態為寫入 CALL I2C_START IWA RLC ADR MOV SDA,C SETB SCL ;資料傳輸完SCL須為高準位 CLR SCL ;資料傳輸時SCL須為低準位 DJNZ COUNTD,IWA CLR ACK SET ACK RET ;=========================================================== ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;I2C 設定指定 ROM的位址並設定為讀出狀態 ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;=========================================================== I2C_READ_ADR: CLR SDA SET ACK MOV COUNTD,#8 MOV ADR,#11100011B ;設定寫入之ROM及其位址,狀態為寫入 CALL I2C_START IRA RLC ADR MOV SDA,C SETB SCL ;資料傳輸完SCL須為高準位 CLR SCL ;資料傳輸時SCL須為低準位 DJNZ COUNTD,IRA CLR ACK SET ACK RET ;=========================================================== ;=============================== ; I2C I2C START CONDITION ;=============================== I2C_START: SETB SCL SETB SDL CLR SDL CLR SCL ;資料傳輸時SCL須為低準位 RET ;=============================== ;I2C I2C STOP CONDITION ;=============================== I2C_STOP: SETB SCL CLR SDL SETB SDL CLR SCL RET ;============================== ;I2C I2C INPUT DATA STATE ;============================== ;============================== ; ;============================== ;++++++++++++++++++++++++++++++++ ;DELAY 40ms ;++++++++++++++++++++++++++++++++ DLY40 MOV R6,#100 DL0 MOV R7,#200 DJNZ R7,$ DJNZ R6,DL RET ;++++++++++++++++++++++++++++++++ ;DELAY 8ms ;++++++++++++++++++++++++++++++++ DLY8 MOV R6,#20 DL1 MOV R7,#200 DJNZ R7,$ DJNZ R6,DL1 RET ;++++++++++++++++++++++++++++++++ ;DELAY 160us ;++++++++++++++++++++++++++++++++ DLY16 MOV R6,#80 DJNZ R6,$ RET ;++++++++++++++++++++++++++++++++

;============================== ;==== STORE DATA ========= ;============================== TAB1 DB "4444" DB "4444" DB 10H TAB2 DB "abcdABCD" DB 10H END ;======================================================================

Reply to
colin
Loading thread data ...

I have no idea about your system, but do about assemblers in general. I suspect the problem is you are putting a tab (or spaces) before the name field in those lines.

--
 "This is a wonderful answer. It's off-topic, it's incorrect,
  and it doesn't answer the question."  --  Richard Heathfield

 "I support the Red Sox and any team that beats the Yankees"
Reply to
CBFalconer

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.