基于Proteus+8051汇编应用实例系列之二--通过按钮来控制LED流水灯移动

来源:互联网 发布:python中文输出 编辑:程序博客网 时间:2024/06/04 23:17
;;; ==========================;;; K1~K4按钮控制LED灯移动  ;;;;;;; ==========================ORG00HSTART:MOV R1,#0FEHMOV R2,#0FEHCALL FRESH_LED;;; ===========================;;; 主循环;;; ===========================MAIN_LOOP:CALLCHK_K1CALL CHK_K2CALLCHK_K3CALL CHK_K4JMPMAIN_LOOP;;; ===========================;;; 刷新LED灯状态;;; ===========================FRESH_LED:MOV P0,R1MOV P2,R2RET;;; ===========================;;; 检测K1;;; ===========================CHK_K1:JBP1.4,RETURNCALL DELAYJNBP1.4,$CALLLEFT_UPCALL FRESH_LEDRET;;; ===========================;;; 检测K2;;; ===========================CHK_K2:JBP1.5,RETURNCALL DELAYJNBP1.5,$CALLLEFT_DOWNCALL FRESH_LEDRET;;; ===========================;;; 检测K3;;; ===========================CHK_K3:JBP1.6,RETURNCALL DELAYJNBP1.6,$CALLRIGHT_UPCALL FRESH_LEDRET;;; ===========================;;; 检测K4;;; ===========================CHK_K4:JBP1.7,RETURNCALL DELAYJNBP1.7,$CALLRIGHT_DOWNCALL FRESH_LEDRET;;; ===========================;;; 左上移;;; ===========================LEFT_UP:MOV A,R1CPL ARRCACPL AMOV R1,ARET;;; ===========================;;; 左下移LEFT_DOWN:MOV A,R1CPL ARLCACPL AMOV R1,ARET;;; ===========================;;; 右上移;;; ===========================RIGHT_UP:MOV A,R2CPL ARRCACPL AMOV R2,ARET;;; ===========================;;; 左上移;;; ===========================RIGHT_DOWN:MOV A,R2CPL ARLCACPL AMOV R2,ARET;;; ===========================;;; 返回;;; ===========================RETURN:RET;;; ===========================;;; 延时30ms;;; ===========================DELAY:MOV R5,#30D1:MOV R6,#20D2:MOV R7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RETEND


 问题描述:

         通过四个按钮K1~K4分别控制两排的LED灯上移或下移,四个键分别连51单片机的P1.4~P1.7,左边一排LED灯接P0口,右边一排LED灯接P2口,Proteus仿真图如下图所示:

 直奔代码……

代码文件main.asm

 

注:

1)单片机程序一般都有一个主循环(不休止地专心地执行),这里通过MAIN_LOOP标签,不断跳转到此处。

2)程序依照模块化的编程思想,将整个过程分解成几个子过程,如:检测按钮,刷新LED灯状态,等待,灯的移动,通过CALL和RET的配对使用,实现类似函数过程的调用过程,将多个逻辑子过程通过跳转命令,完成复杂任务。

3)LED灯的移动,借用了RRC和RLC命令,又因为此例中需要移动的是1,所以在RRC和RLC前后通过CPL转换成移动0的过程,实现灯的各种移动效果。

4)注意像29行这种用法,间接实现一个选择逻辑。

5)注意CALL和RET的配对使用,通过跳转命令如JB,JNB等要返回的话, 不能用RET,而需要继续通过合适的跳转命令跳回。

相应源文件和代码请于附件中下载。
 

原创粉丝点击