新手提问单片机流水灯程序
发布网友
发布时间:2022-04-29 00:04
我来回答
共4个回答
热心网友
时间:2022-06-26 01:20
//都是很简单很基本的汇编指令而已。注释如下。
/*******************************************************/
ORG 0000H //存储器起始地址
AJMP START //直接跳转执行程序
ORG 0030H //用户程序起始地址
START: MOV P0,#0FFH //熄灭所有LED灯
MOV A,#0FEH //传递数值设置P0.0亮
AAA: MOV P0,A //P0.0点亮
LCALL DELAY //跳转到DELAY延时子程序
JNB P1.3,BBB //判断P1.3是否为0,如果为0则跳转到BBB标签实现逆向跑马灯
RL A //A寄存器的数值循环左移一位,即FE左移1位后是FD
AJMP AAA //直接跳转到AAA标签,即实现LED灯从P0.0向P0.7正向跑马灯
BBB: MOV A,#7FH //传递数值设置P0.7亮
CCC: MOV P0,A //P0.7点亮
LCALL DELAY //跳转到DELAY延时子程序
JNB P1.0,START //判断P1.0是否为0,如果为0则跳转到START标签实现正向跑马灯
RR A //A寄存器的数值循环右移一位,即7F右移1位后是BF
AJMP CCC //直接跳转到CCC标签,即实现LED灯从P0.7向P0.0逆向跑马灯
DELAY: MOV R7,#250 //延时子程序第三层250*100*10次循环
DL1: MOV R6,#100 //延时子程序第二层100*10次循环
DL2: MOV R5,#10 //延时子程序第一10次循环
DJNZ R5,$ //R5减1,不为0则继续减
DJNZ R6,DL2 //R6减1,不为0则转到DL2标签
DJNZ R7,DL1 //R7减1,不为0则转到DL1标签
RET //子程序返回(至于延时多长时间得看硬件决定)
//12Mhz C51的话,延时500毫秒多一点点[(250*100*10+2+2)*2微秒]
//DJNZ MOV RET都是双周期指令
END //汇编结束标识
JNB P1.3,BBB //JNB就是判断位,判断P1.3位是否为0,如果为0则跳转到后面BBB标签对应的地址,否则执行下面一行指令。
JNB P1.0,START //判断P1.0位是否为0,如果为0则跳转到后面START标签对应的地址,否则执行下面一行指令。
P1.3外接一个按钮,按钮按一下时执行逆向跑马灯,P1.0同样外接一个按钮,按钮按一下时执行正向跑马灯。如果两个按钮都按下时就打架P0.0和P0.7轮流亮。
RL A //这个RL是循环左移位操作,就是把A寄存器里面的数值二进制位左移一位再保存到A寄存器里面。比如A=11111110B(0xFE)时,左移一位后A=11111101B(0xFD),再左移一位后变成A=11111011B(0xFB)。
热心网友
时间:2022-06-26 01:20
JNB(jump not bit)是一条跳转指令,功能是(就你这个程序而言)P1.3不为零则跳转,跳转到哪? 就是跳转到P1.3后面的操作数所指的ROM地址,只不过这里用BBB(标号)表示了;应该够清楚了!如果不懂可以去网上找找汇编语法的资料看看!记得评分哦!我等着升级呢!呵呵
热心网友
时间:2022-06-26 01:21
P1.3是外接控制信号的,可能是个对地的按键或开关,用来选择左移还是右移;
JNB XX,YY的意思是当XX不为1时跳转到YY地址行;
RL A是把累加器(A)中的各个位循环左移一次,下面的RR A是循环右移。
因为开始A赋值了0xFE,即二进制1111 1110,执行循环移位就可以逐次移动那个0,使对应输出端口的LED点亮(一般接法是电源--限流电阻--LED--地,低电平点亮)。
热心网友
时间:2022-06-26 01:21
JNB P1.3,BBB(这个为什么是P1.3? JNB语句是什么作用?“JNB XX,YY”是什么意思?)
RL A(这个操作怎么改变地址?)
P1.3 这个端口是用来控制流水灯的流动方向的,比如 P1.3为低电平时流水灯向左移, P1.3为高时向右移。
JNB这个好像是如果不为0 就跳转,比如JNB XX,YY,应该是如果 XX为0就跳到YY的标号外。在这里我不大记得这个指令的条件是为0还是非0了,你查一下手册吧,不过这肯定是一个跳转指令。
RL A 这个操作不改变地址,只是对寄存器 A进行了移位操作,使 A向左移一位。