找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3500|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)節(jié)日彩燈控制器設(shè)計(jì)匯編語言程序 keil報(bào)錯(cuò)7個(gè)錯(cuò)誤

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
節(jié)日彩燈控制器設(shè)計(jì)

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

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

  13. KEY_INT:  MOV    A,P1          ;/ 讀入8個(gè)按鍵的狀態(tài)
  14.           CPL    A             ;/ 取反,鍵閉合的相應(yīng)位為1
  15.           JZ     RETURN        ;/ 如A中內(nèi)容為0,則無鍵閉合,返回
  16.           LCALL  D10ms         ;/ A非全0,可能有鍵閉合,延時(shí)10ms,軟件去抖
  17.           MOV    A,P1          ;/ 重讀8個(gè)按鍵的狀態(tài),鍵閉合相應(yīng)位為0
  18.           CPL    A             ;/ 取反,鍵閉合的相應(yīng)位為1
  19.           JZ     RETURN        ;/ A中全0,無鍵閉合,返回;非全0,確認(rèn)有鍵閉合
  20.           JB     ACC.2,Pkey2   ;/ S2鍵閉合,跳S2鍵處理標(biāo)號(hào)Pkey2
  21.           JB     ACC.3,Pkey3   ;/ S3鍵閉合,跳S3鍵處理標(biāo)號(hào)Pkey3
  22.           JB     ACC.4,Pkey4   ;/ S4鍵閉合,跳S4鍵處理標(biāo)號(hào)Pkey4
  23.           JB     ACC.5,Pkey5   ;/ S5鍵閉合,跳S5鍵處理標(biāo)號(hào)Pkey5
  24.           JB     ACC.6,Pkey6   ;/ S6鍵閉合,跳S6鍵處理標(biāo)號(hào)Pkey6
  25.           JB     ACC.7,Pkey7   ;/ S7鍵閉合,跳S7鍵處理標(biāo)號(hào)Pkey7
  26.           LJMP   RETURN        ;/ 查詢結(jié)束,重新開始     
  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        ;/ 設(shè)置地址偏移量
  33.           MOVC   A,@A+DPTR     ;/ 查表取得數(shù)據(jù),送A
  34.           CJNE   A,#01H,AP1    ;/ 判斷A中數(shù)據(jù)是否為結(jié)束符01H,不是則跳AP1繼續(xù)執(zhí)行
  35.           LJMP   START2        ;/ 是結(jié)束符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        ;/ 設(shè)置地址偏移量
  42.           MOVC   A,@A+DPTR     ;/ 查表取得數(shù)據(jù),送A
  43.           CJNE   A,#01H,BP1    ;/ 判斷A中數(shù)據(jù)是否為結(jié)束字符01H,不是則跳BP1繼續(xù)執(zhí)行
  44.           LJMP   START3        ;/ 是結(jié)束符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        ;/ 設(shè)置地址偏移量
  51.           MOVC   A,@A+DPTR     ;/ 查表取得數(shù)據(jù),送A
  52.           CJNE   A,#01H,CP1    ;/ 判斷A中數(shù)據(jù)是否為結(jié)束字符01H,不是則跳CP1繼續(xù)執(zhí)行
  53.           LJMP   LD2           ;/ 是結(jié)束符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        ;/ 設(shè)置指針偏移量
  64.           MOVC   A,@A+DPTR     ;/ 查表取得數(shù)據(jù),送A
  65.           CJNE   A,#01H,AP1    ;/ 判斷A中數(shù)據(jù)是否為結(jié)束字符01H,不是則跳AP11繼續(xù)執(zhí)行
  66.           LJMP   START5        ;/ 是結(jié)束字符跳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      ;/ 延時(shí)10ms子程序,采用雙重循環(huán)
  189. D1:       MOV    R6,#200
  190.           DJNZ   R6,[        DISCUZ_CODE_1        ]nbsp;        ;/ R6減1非0,原地跳轉(zhuǎn)
  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
復(fù)制代碼


流水燈.docx

18.03 KB, 下載次數(shù): 21

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2019-1-16 08:19 | 只看該作者
以第16句為例:【JZ     RETURN        ;/ 如A中內(nèi)容為0,則無鍵閉合,返回】
JZ 是相對(duì)跳轉(zhuǎn),即以本條指令所在地的下個(gè)開始地址起算,跳轉(zhuǎn)離最多為:上下128個(gè)字節(jié)。你要去的RETURN 所在地,超出了這個(gè)范圍。通俗地說:就是RETURN太遠(yuǎn)了!
修改方案:(取其一即可)
1、設(shè)法使程序的 RETURN 段靠近,即改RETURN 段的位置。
2、加中繼:改【JZ     RETURN】為【JZ     RETURN_1】
     再在附近“適合”的地方加一句:【RETURN_1:LJMP   RETURN】
3、改成:
             JNZ      XXXXX
             LJMP    RETURN
XXXXX:   原來的下一句
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2019-1-16 08:20 | 只看該作者
樓主寫的程序工整,有序!汝子可教也。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表