標題: 單片機節(jié)日彩燈控制器設計匯編語言程序 keil報錯7個錯誤 [打印本頁]

作者: 陸宵0118    時間: 2019-1-15 19:00
標題: 單片機節(jié)日彩燈控制器設計匯編語言程序 keil報錯7個錯誤
節(jié)日彩燈控制器設計

1. 設計要求
以單片機為核心,設計一個節(jié)日彩燈控制器:
  P1.2—開始,按此鍵則燈開始流動(由上而下)。
  P1.3—停止,按此鍵則停止流動,所有燈為暗。
  P1.4—上,按此鍵則燈由上向下流動。
  P1.5—下,按此鍵則燈由下向上流動。
  P1.6—向外,按此鍵則燈由中間向兩邊流動。
  P1.7—向中,按此鍵則燈由兩邊向中間流動。
2. 實驗原理
  本題目本質上是由按鍵控制功能的流水燈,LED工作的方式通過鍵盤的掃描實現。其中的LED采取共陽極接法,通過依次向連接LED的I/O口送出低電平,可實現題目要求的功能。本題目需要控制的流水燈較多,共48個,需要I/O口擴展。
3. Proteus仿真
晶振頻率為11.0592MHz。仿真結果根據按鍵變化。

單片機匯編語言源碼:
  1.           ORG    0000H
  2.           AJMP   MAIN          ;/ 復位入口,跳主程序MAIN
  3.           ORG    0003H         ;/ INT0*中斷入口
  4.           LJMP   KEY_INT       ;/ 跳向INTO*的中斷服務子程序KEY_INT
  5.           ORG    0100H         ;/ 主程序入口
  6. MAIN:     MOV    SP,60H        ;/ 重新設堆棧指針
  7.           SETB   IT0           ;/ INTO*為跳沿觸發(fā)
  8.           MOV    IP,#01H       ;/ INTO*為高優(yōu)先級
  9.           SETB   EA            ;/ 總中斷允許
  10.           SETB   EX0           ;/ 允許INTO*中斷
  11.           MOV    P1,0FFH       ;/ P1口寫入全1,設置P1口為輸入狀態(tài)
  12.           ORG    0300H         ;/ 中斷入口,查詢掃描鍵盤

  13. KEY_INT:  MOV    A,P1          ;/ 讀入8個按鍵的狀態(tài)
  14.           CPL    A             ;/ 取反,鍵閉合的相應位為1
  15.           JZ     RETURN        ;/ 如A中內容為0,則無鍵閉合,返回
  16.           LCALL  D10ms         ;/ A非全0,可能有鍵閉合,延時10ms,軟件去抖
  17.           MOV    A,P1          ;/ 重讀8個按鍵的狀態(tài),鍵閉合相應位為0
  18.           CPL    A             ;/ 取反,鍵閉合的相應位為1
  19.           JZ     RETURN        ;/ A中全0,無鍵閉合,返回;非全0,確認有鍵閉合
  20.           JB     ACC.2,Pkey2   ;/ S2鍵閉合,跳S2鍵處理標號Pkey2
  21.           JB     ACC.3,Pkey3   ;/ S3鍵閉合,跳S3鍵處理標號Pkey3
  22.           JB     ACC.4,Pkey4   ;/ S4鍵閉合,跳S4鍵處理標號Pkey4
  23.           JB     ACC.5,Pkey5   ;/ S5鍵閉合,跳S5鍵處理標號Pkey5
  24.           JB     ACC.6,Pkey6   ;/ S6鍵閉合,跳S6鍵處理標號Pkey6
  25.           JB     ACC.7,Pkey7   ;/ S7鍵閉合,跳S7鍵處理標號Pkey7
  26.           LJMP   RETURN        ;/ 查詢結束,重新開始     
  27. Pkey2:    MOV    P2,#0BFH      ;/ S0鍵處理子程序
  28.           MOV    A,#80H        ;/ PA口、PB口、PC口方式0輸出的控制字送A
  29.           MOV    R0,#7FH       ;/ 8255A控制寄存器地址7FH送入R0
  30.           MOVX   @R0,A         ;/ 方式控制字送入控制寄存器
  31. START1:   MOV    DPTR,#TABLE   ;/ 指針指向表頭地址
  32. AP0:      MOV    A,#00H        ;/ 設置地址偏移量
  33.           MOVC   A,@A+DPTR     ;/ 查表取得數據,送A
  34.           CJNE   A,#01H,AP1    ;/ 判斷A中數據是否為結束符01H,不是則跳AP1繼續(xù)執(zhí)行
  35.           LJMP   START2        ;/ 是結束符01H,跳START2繼續(xù)執(zhí)行
  36. AP1:      MOV    R0,#7CH       ;/ PA口地址7CH送入DPTR
  37.           MOVX   @R0,A         ;/ 將A送PA口輸出
  38.           INC    DPTR          ;/ 指針加1
  39.           LJMP   AP0           ;/ 跳AP0執(zhí)行循環(huán)體
  40. START2:   MOV    DPTR,#TABLE   ;/ 指針指向表頭地址
  41. BP0:      MOV    A,#00H        ;/ 設置地址偏移量
  42.           MOVC   A,@A+DPTR     ;/ 查表取得數據,送A
  43.           CJNE   A,#01H,BP1    ;/ 判斷A中數據是否為結束字符01H,不是則跳BP1繼續(xù)執(zhí)行
  44.           LJMP   START3        ;/ 是結束符01H,跳START3繼續(xù)執(zhí)行
  45. BP1:      MOV    R0,#7DH       ;/ PB口地址7DH送入DPTR
  46.           MOVX   @R0,A         ;/ 將A送PB口輸出
  47.           INC    DPTR          ;/ 指針加1
  48.           LJMP   BP0           ;/ 跳BP0執(zhí)行循環(huán)體
  49. START3:   MOV    DPTR,#TABLE   ;/ 指針指向表頭地址
  50. CP0:      MOV    A,#00H        ;/ 設置地址偏移量
  51.           MOVC   A,@A+DPTR     ;/ 查表取得數據,送A
  52.           CJNE   A,#01H,CP1    ;/ 判斷A中數據是否為結束字符01H,不是則跳CP1繼續(xù)執(zhí)行
  53.           LJMP   LD2           ;/ 是結束符01H,跳LD2繼續(xù)執(zhí)行
  54. CP1:      MOV    R0,#7DH       ;/ PC口地址7DH送入DPTR
  55.           MOVX   @R0,A         ;/ 將A送PC口輸出
  56.           INC    DPTR          ;/ 指針加1
  57.           LJMP   CP0           ;/ 跳CP0執(zhí)行循環(huán)體
  58. LD2:      MOV    P2,#7FH      
  59.           MOV    A,#80H        ;/ PA口、PB口、PC口方式0輸出的控制字送A
  60.           MOV    R0,#7FH       ;/ 8255A控制寄存器地址7FH送入R0
  61.           MOVX   @R0,A         ;/ 方式控制字送入控制寄存器
  62. START4:   MOV    DPTR,#TABLE   ;/ 指針指向表頭地址
  63. AP01:     MOV    A,#00H        ;/ 設置指針偏移量
  64.           MOVC   A,@A+DPTR     ;/ 查表取得數據,送A
  65.           CJNE   A,#01H,AP1    ;/ 判斷A中數據是否為結束字符01H,不是則跳AP11繼續(xù)執(zhí)行
  66.           LJMP   START5        ;/ 是結束字符跳START5繼續(xù)執(zhí)行
  67. AP11:     MOV    R0,#7CH       ;/ PA口地址7CH送入DPTR
  68.           MOVX   @R0,A         ;/ 將A送PA口輸出
  69.           INC    DPTR          ;/ 指針加1
  70.           LJMP   AP01          ;/ 跳AP01執(zhí)行循環(huán)體
  71. START5:   MOV    DPTR,#TABLE
  72. BP01:     MOV    A,#00H
  73.           MOVC   A,@A+DPTR
  74.           CJNE   A,#01H,BP11
  75.           LJMP   START6
  76. BP11:     MOV    R0,#7DH       ;/ PB口地址7DH送入DPTR
  77.           MOVX   @R0,A         ;/ 將A送PB口輸出
  78.           INC    DPTR
  79.           LJMP   BP01
  80. START6:   MOV    DPTR,#TABLE
  81. CP01:     MOV    A,#00H
  82.           MOVC   A,@A+DPTR
  83.           CJNE   A,#01H,CP11
  84.           LJMP   LD3
  85. CP11:     MOV    R0,#7DH       ;/ PC口地址7DH送入DPTR
  86.           MOVX   @R0,A         ;/ 將A送PC口輸出
  87.           INC    DPTR
  88.           LJMP   CP01
  89. LD3:      LJMP   RETURN        ;/ 跳向中斷返回
  90. Pkey3:    MOV    P2,#0FFH       ;/ S0鍵處理子程序
  91.           LJMP   RETURN        ;/ 跳向中斷返回
  92. Pkey4:    LJMP   Pkey2
  93.           LJMP   RETURN
  94. Pkey5:    MOV    P2,#0BFH      
  95.           MOV    A,#80H        ;/ PA口、PB口、PC口方式0輸出的控制字送A
  96.           MOV    R0,#7FH       ;/ 8255A控制寄存器地址7FH送入R0
  97.           MOVX   @R0,A         ;/ 方式控制字送入控制寄存器
  98. START11:  MOV    DPTR,#TABLE
  99. AP02:     MOV    A,#00H
  100.           MOVC   A,@A+DPTR
  101.           CJNE   A,#01H,AP12
  102.           LJMP   START2
  103. AP12:     MOV    R0,#7EH       ;/ PC口地址7EH送入DPTR
  104.           MOVX   @R0,A         ;/ 將A送PC口輸出
  105.           INC    DPTR
  106.           LJMP   AP02
  107. START21:  MOV    DPTR,#TABLE
  108. BP02:     MOV    A,#00H
  109.           MOVC   A,@A+DPTR
  110.           CJNE   A,#01H,BP12
  111.           LJMP   START3
  112. BP12:     MOV    R0,#7DH       ;/ PB口地址7DH送入DPTR
  113.           MOVX   @R0,A         ;/ 將A送PB口輸出
  114.           INC    DPTR
  115.           LJMP   BP02
  116. START31:  MOV    DPTR,#TABLE
  117. CP02:     MOV    A,#00H
  118.           MOVC   A,@A+DPTR
  119.           CJNE   A,#01H,CP12
  120.           LJMP   LD2
  121. CP12:     MOV    R0,#7CH       ;/ PA口地址7CH送入DPTR
  122.           MOVX   @R0,A         ;/ 將A送PA口輸出
  123.           INC    DPTR
  124.           LJMP   CP02
  125.           LJMP   RETURN
  126. Pkey6:    MOV    A,#80H        ;/ PA口、PB口、PC口方式0輸出的控制字送A
  127.           MOV    R0,#7FH       ;/ 8255A控制寄存器地址7FH送入R0
  128.           MOVX   @R0,A         ;/ 方式控制字送入控制寄存器
  129. START12:  MOV    DPTR,#TABLE
  130. AP03:     MOV    A,#00H
  131.           MOVC   A,@A+DPTR
  132.           CJNE   A,#01H,AP13
  133.           LJMP   START2
  134. AP13:     MOV    R0,#7EH       ;/ PC口地址7EH送入DPTR
  135.           MOVX   @R0,A         ;/ 將A送PC口輸出
  136.           INC    DPTR
  137.           LJMP   AP03
  138. START22:  MOV    DPTR,#TABLE
  139. BP03:     MOV    A,#00H
  140.           MOVC   A,@A+DPTR
  141.           CJNE   A,#01H,BP13
  142.           LJMP   START3
  143. BP13:     MOV    R0,#7DH       ;/ PB口地址7DH送入DPTR
  144.           MOVX   @R0,A         ;/ 將A送PB口輸出
  145.           INC    DPTR
  146.           LJMP   BP03
  147. START32:  MOV    DPTR,#TABLE
  148. CP03:     MOV    A,#00H
  149.           MOVC   A,@A+DPTR
  150.           CJNE   A,#01H,CP13
  151.           LJMP   LD2
  152. CP13:     MOV    R0,#7CH       ;/ PA口地址7CH送入DPTR
  153.           MOVX   @R0,A         ;/ 將A送PA口輸出
  154.           INC    DPTR
  155.           LJMP   CP03      
  156.           LJMP   RETURN
  157. Pkey7:    MOV    A,#80H        ;/ PA口、PB口、PC口方式0輸出的控制字送A
  158.           MOV    R0,#7FH       ;/ 8255A控制寄存器地址7FH送入R0
  159.           MOVX   @R0,A         ;/ 方式控制字送入控制寄存器
  160. START13:  MOV    DPTR,#TABLE
  161. AP04:     MOV    A,#00H
  162.           MOVC   A,@A+DPTR
  163.           CJNE   A,#01H,AP14
  164.           LJMP   START2
  165. AP14:     MOV    R0,#7CH       ;/ PA口地址7CH送入DPTR
  166.           MOVX   @R0,A         ;/ 將A送PA口輸出
  167.           INC    DPTR
  168.           LJMP   AP04
  169. START23:  MOV    DPTR,#TABLE
  170. BP04:     MOV    A,#00H
  171.           MOVC   A,@A+DPTR
  172.           CJNE   A,#01H,BP14
  173.           LJMP   START3
  174. BP14:     MOV    R0,#7DH       ;/ PB口地址7DH送入DPTR
  175.           MOVX   @R0,A         ;/ 將A送PB口輸出
  176.           INC    DPTR
  177.           LJMP   BP04
  178. START33:  MOV    DPTR,#TABLE
  179. CP04:     MOV    A,#00H
  180.           MOVC   A,@A+DPTR
  181.           CJNE   A,#01H,CP14
  182.           LJMP   LD2
  183. CP14:     MOV    R0,#7DH       ;/ PC口地址7DH送入DPTR
  184.           MOVX   @R0,A         ;/ 將A送PC口輸出
  185.           INC    DPTR
  186.           LJMP   CP04
  187.           LJMP   RETURN       ;/ 跳向中斷返回
  188. D10ms:    MOV    R7,#25      ;/ 延時10ms子程序,采用雙重循環(huán)
  189. D1:       MOV    R6,#200
  190.           DJNZ   R6,[        DISCUZ_CODE_1        ]nbsp;        ;/ R6減1非0,原地跳轉
  191.           DJNZ   R7,D1
  192.           RET  
  193. RETURN:   RETI                ;/ INTO*中斷返回
  194. TABLE:    DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
  195.           DB 01H
  196.           END
復制代碼


流水燈.docx

18.03 KB, 下載次數: 21


作者: yzwzfyz    時間: 2019-1-16 08:19
以第16句為例:【JZ     RETURN        ;/ 如A中內容為0,則無鍵閉合,返回】
JZ 是相對跳轉,即以本條指令所在地的下個開始地址起算,跳轉離最多為:上下128個字節(jié)。你要去的RETURN 所在地,超出了這個范圍。通俗地說:就是RETURN太遠了!
修改方案:(取其一即可)
1、設法使程序的 RETURN 段靠近,即改RETURN 段的位置。
2、加中繼:改【JZ     RETURN】為【JZ     RETURN_1】
     再在附近“適合”的地方加一句:【RETURN_1:LJMP   RETURN】
3、改成:
             JNZ      XXXXX
             LJMP    RETURN
XXXXX:   原來的下一句
作者: yzwzfyz    時間: 2019-1-16 08:20
樓主寫的程序工整,有序!汝子可教也。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1