找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3037|回复: 2
打印 上一主题 下一主题
收起左侧

单片机节日彩灯控制器设计汇编语言程序 keil报错7个错误

[复制链接]
跳转到指定楼层
楼主
节日彩灯控制器设计

1. 设计要求
以单片机为核心,设计一个节日彩灯控制器:
  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*为跳沿触发
  8.           MOV    IP,#01H       ;/ INTO*为高优先级
  9.           SETB   EA            ;/ 总中断允许
  10.           SETB   EX0           ;/ 允许INTO*中断
  11.           MOV    P1,0FFH       ;/ P1口写入全1,设置P1口为输入状态
  12.           ORG    0300H         ;/ 中断入口,查询扫描键盘

  13. KEY_INT:  MOV    A,P1          ;/ 读入8个按键的状态
  14.           CPL    A             ;/ 取反,键闭合的相应位为1
  15.           JZ     RETURN        ;/ 如A中内容为0,则无键闭合,返回
  16.           LCALL  D10ms         ;/ A非全0,可能有键闭合,延时10ms,软件去抖
  17.           MOV    A,P1          ;/ 重读8个按键的状态,键闭合相应位为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继续执行
  35.           LJMP   START2        ;/ 是结束符01H,跳START2继续执行
  36. AP1:      MOV    R0,#7CH       ;/ PA口地址7CH送入DPTR
  37.           MOVX   @R0,A         ;/ 将A送PA口输出
  38.           INC    DPTR          ;/ 指针加1
  39.           LJMP   AP0           ;/ 跳AP0执行循环体
  40. START2:   MOV    DPTR,#TABLE   ;/ 指针指向表头地址
  41. BP0:      MOV    A,#00H        ;/ 设置地址偏移量
  42.           MOVC   A,@A+DPTR     ;/ 查表取得数据,送A
  43.           CJNE   A,#01H,BP1    ;/ 判断A中数据是否为结束字符01H,不是则跳BP1继续执行
  44.           LJMP   START3        ;/ 是结束符01H,跳START3继续执行
  45. BP1:      MOV    R0,#7DH       ;/ PB口地址7DH送入DPTR
  46.           MOVX   @R0,A         ;/ 将A送PB口输出
  47.           INC    DPTR          ;/ 指针加1
  48.           LJMP   BP0           ;/ 跳BP0执行循环体
  49. START3:   MOV    DPTR,#TABLE   ;/ 指针指向表头地址
  50. CP0:      MOV    A,#00H        ;/ 设置地址偏移量
  51.           MOVC   A,@A+DPTR     ;/ 查表取得数据,送A
  52.           CJNE   A,#01H,CP1    ;/ 判断A中数据是否为结束字符01H,不是则跳CP1继续执行
  53.           LJMP   LD2           ;/ 是结束符01H,跳LD2继续执行
  54. CP1:      MOV    R0,#7DH       ;/ PC口地址7DH送入DPTR
  55.           MOVX   @R0,A         ;/ 将A送PC口输出
  56.           INC    DPTR          ;/ 指针加1
  57.           LJMP   CP0           ;/ 跳CP0执行循环体
  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继续执行
  66.           LJMP   START5        ;/ 是结束字符跳START5继续执行
  67. AP11:     MOV    R0,#7CH       ;/ PA口地址7CH送入DPTR
  68.           MOVX   @R0,A         ;/ 将A送PA口输出
  69.           INC    DPTR          ;/ 指针加1
  70.           LJMP   AP01          ;/ 跳AP01执行循环体
  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子程序,采用双重循环
  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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2019-1-16 08:19 | 只看该作者
以第16句为例:【JZ     RETURN        ;/ 如A中内容为0,则无键闭合,返回】
JZ 是相对跳转,即以本条指令所在地的下个开始地址起算,跳转离最多为:上下128个字节。你要去的RETURN 所在地,超出了这个范围。通俗地说:就是RETURN太远了!
修改方案:(取其一即可)
1、设法使程序的 RETURN 段靠近,即改RETURN 段的位置。
2、加中继:改【JZ     RETURN】为【JZ     RETURN_1】
     再在附近“适合”的地方加一句:【RETURN_1:LJMP   RETURN】
3、改成:
             JNZ      XXXXX
             LJMP    RETURN
XXXXX:   原来的下一句
回复

使用道具 举报

板凳
ID:123289 发表于 2019-1-16 08:20 | 只看该作者
楼主写的程序工整,有序!汝子可教也。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表