protues中LM032的仿真

雖然是兩百來行的程序,但是今天我調試了一天才弄出來什麼地方錯了,呵呵。

原來是在讀P0口的時候沒有向P0口寫#0ffh。弄的我忙了半天,最後在CSDN上找了個C的proteus仿真程序和keil的C程序。堅定了我的電路圖是沒有問題的,最後我一步一步的聯合keil和proteus將錯誤找出來了,挺高興的,呵呵。

想回報一下上傳C源程序和proteus仿真程序的朋友,不過,今天沒能傳上去,只有在這發個圖和彙編的程序了。等到可以上傳資源了,我上傳一下,弄點積分,好在學習點東西啊!

呵呵,祝大家好運!

 

   RS   BIT P2.5    ;寄存器選擇信號
   RorW BIT P2.6 ;讀、寫選擇信號
   E    BIT P2.7 ;使能控制
   ORG  0000H
   LJMP MAIN
   ORG  0030H
MAIN:
   MOV  SP,#60H     ;設堆棧指針
   LCALL INIT       ;調LCM初始化程序
   LCALL FIRST      ;調設定顯示地址爲第1行,第1個位置子程序
   MOV   DPTR,#TAB1 ;設置第1行字符的首地址
   LCALL DISPLAY    ;調用顯示字符子程序
   LCALL SECOND     ;調設定顯示地址爲第2行,第1個位置子程序
   MOV   DPTR,#TAB2 ;設置第2行字符的首地址
   LCALL DISPLAY    ;調用顯示字符子程序
   SJMP  $          ;主程序結束

;LCM初始化程序(本程序採用了熱啓動的指令段)
;熱啓動操作步驟:1,寫入指令代碼,30H或38H。2,延時時間>4.1ms。
;                3,寫入指令代碼,30H或38H。4,延時時間>100us。
;                5,寫入指令代碼,30H或38H。
INIT:
   LCALL  DELAY1    ;調延時5ms的子程序
   LCALL  DELAY1    ;延時,等待電源穩定
   MOV    A,#38H  ;可以寫30H或38H,我感覺,這是寫工作方式的字節吧,
                     ;工作方式:0 0 1 DL N F * *,
      ;DL=1,採用8位數據總線,N=1,顯示雙行字符行,F=0,採用5*&點陣字符體
   MOV    P2,#00011111B    ;E,RS,RorW爲0
   NOP
   SETB   E          ;E爲高,使能
   MOV    P0,A       ;寫入指令代碼

   CLR    E
      
   LCALL  DELAY1     ;延時5ms

   MOV    A,#38H
   MOV    P2,#00011111B
   NOP
   SETB   E
   MOV    P0,A
   CLR    E

   LCALL  DELAY2     ;延時120us子程序
  
   MOV    A,#38H
   MOV    P2,#00011111B
   NOP
   SETB   E
   MOV    P0,A
   CLR    E
   LCALL  DELAY2      ;延時120us子程序
;熱啓動程序到此結束
;下面是初始化程序
   MOV    A,#38H      ;工作方式設置爲2行顯示,8爲數據總線,5*7點陣字符體
   ACALL  WRC         ;判斷BF和寫命令
   MOV    A,#01H      ;清除顯示
   ACALL  WRC
   MOV    A,#06H      ;設置輸入方式爲AC加1,光標右移,畫面不動
   ACALL  WRC
   MOV    A,#0EH      ;設置顯示狀態爲開顯示,顯示光標,不閃爍
   ACALL  WRC
   RET
;初始化程序到此結束

;判讀BF和寫指令
WRC:
   ACALL  BUSY        ;調判讀BF子程序
   MOV    P2,#00011111B  ;E,RorW,RS爲0,準備寫
   NOP
   SETB   E    ;使能
   MOV    P0,A        ;寫指令代碼  
   CLR    E          ;E爲低
   RET
;判斷忙程序,不忙則返回
BUSY:
   PUSH  ACC
W: MOV   P2,#01011111B     ;RS=0,RorW=1,E=0,準備讀數據
   NOP
   mov    P0,#0FFh      ;將P0口設置爲輸入口
   SETB   E
//  mov    P0,0FFH
   NOP
   NOP
   MOV    A,P0             ;讀BF和AC值
   JB     ACC.7,W          ;BF不爲0,等待
   CLR    E
   POP    ACC
   RET

;寫顯示數據子程序
WRTD:
    ACALL   BUSY
 MOV     P2,#00111111B     ;RS=1,RorW=0,E=0,準備寫數據
 SETB    E
 MOV     P0,A
 CLR     E
 LCALL   DELAY2
 RET

;顯示字符程序
DISPLAY:
   MOV     R1,#00
  NEXT:
     MOV   A,R1
  MOVC  A,@A+DPTR        ;將DPTR所指的字符碼逐一送到LCD顯示
  CJNE  A,#21H,DSL       ;到結束符“!”時返回,否則繼續顯示
  RET
   DSL:
     LCALL WRTD             ;調顯示子程序
  INC   R1
  SJMP  NEXT

FIRST:
  MOV   A,#10000000B       ;DDRAM的地址設爲80H,即要顯示的字符從第1行第1個位置開始
  CALL  WRC    
  RET

SECOND:
  MOV  A,#11000000B        ;DDRAM的地址設爲C0H,即要顯示的字符從第2行第1個位置開始
  CALL WRC
  RET
DELAY1:
  MOV  R7,#05H        ;毫秒數
 DL1:
      MOV R6,#0FAH   ;12MHz,1ms延時預設值
 DL2:
      NOP
   NOP
   DJNZ  R1,DL2
   DJNZ  R7,DL1
RET

DELAY2:
   MOV  R7,#0CH       ;10us的倍數
  DL3:
    NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
  DJNZ  R7,DL3
RET
 

TAB1:
  DB  '  WELCOME TO'   ;LCD第1行顯示的字符
  DB  '!'                       ;結束碼爲“!”
TAB2:
  DB  '  OUR UNIVERSITY'        ;LCD第2行顯示的字符
  DB  '!'                       ;結束碼爲“!”
  END         

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章