小白学习 发表于 2026-8-10 21:03

STC90C516RD+,P0驱动共阳数码管显示0-7显示1秒,同时P2驱动7颗LED实现流水灯(汇编代码)

; STC90C516RD+ 汇编程序
; P0:8路流水灯,IO输出低电平点亮LED 显示1S
; P2:输出共阳数码管段码0-7显示1S,段码低电平点亮
; 逻辑同步:8颗LED流水一轮,数码管数字同步从0循环回到0,一一对应

      ORG 0000H                ; 设定程序起始地址为单片机复位入口地址0000H,CPU上电从此处取指令
                                                ; 告诉Keil编写的代码起始地址为 0000H
                LJMP MAIN                ; 长跳转,直接跳到主程序MAIN,跳过中断向量区,避免中断误触发
                                                ; 汇编是从0000 H开始执行,不要LJMP MAIN也行,
      ORG 0030H       ; 后续主程序代码从0030H地址开始存放,避开0003H~002FH中断向量预留区
                                                ; 因为上一行使用了LJMP MAIN 所以这一行相当于告诉编译器MAIN的地址是 0030H 从这里开始执行吧
MAIN:
      MOV R0,#0      ; R0寄存器用作数码管显示计数变量,初始值赋值0,从数字0开始显示
      MOV R1,#0FEH      ; R1寄存器存放流水灯输出状态,0FEH=11111110,P2.0引脚输出低电平,第一颗LED点亮

LOOP:
      ; ========== P0口输出共阳数码管段码 ==========
      MOV DPTR,#SEG_TABLE; 把数码管段码表的首地址赋值给数据指针DPTR,用于查表取值
      MOV A,R0             ; 将数码管计数值R0送入累加器A,作为查表偏移量
      MOVC A,@A+DPTR       ; 程序存储器查表指令:基址+偏移量读取对应数字的数码管段码,存入A
      MOV P0,A             ; 将查表得到的段码输出到P0口,驱动共阳数码管显示对应数字

      ; ========== P2口输出流水灯状态 ==========
      MOV A,R1             ; 将流水灯状态值R1送入累加器A
      MOV P2,A             ; 把状态码输出到P2口,控制8路LED亮灭状态

      LCALL DELAY_1S   ; 长调用1秒延时子程序,固定灯光、数码管显示时长,肉眼可分辨变化

      ; ========== 流水灯整体左移,点亮下一颗LED ==========
      MOV A,R1         ; 读取当前流水灯状态到累加器A
      RL A             ; 累加器A循环左移1位,低电平向左移动一位,实现LED向左流水点亮
      MOV R1,A         ; 将移位后的新状态保存回R1寄存器,用于下一轮输出

      ; ========== 数码管计数循环 0~6,到7清零回到0(匹配8位灯0~7一轮) ==========
      INC R0         ; 数码管计数变量自增1,数字+1
      CJNE R0,#8,NEXT_NUM ; 比较R0和立即数7:不相等直接跳转到NEXT_NUM继续循环;相等则顺序执行清零
      MOV R0,#0      ; 计数值到达7,重置为0,数码管数字从头循环
NEXT_NUM:

      LJMP LOOP      ; 长跳转回到LOOP标签,无限循环流水灯+数码管刷新逻辑

; 共阳数码管段码表 0~9 不带小数点,高位为小数点,全部熄灭
SEG_TABLE:
      DB 0C0H,0F9H,0A4H,0B0H,99H; 数字0、1、2、3、4段码
      DB 92H,82H,0F8H,80H,90H   ; 数字5、6、7、8、9段码

; 11.0592MHz晶振,12T模式,约1秒延时子程序,三重循环软件延时
DELAY_1S:
      MOV R5,#10       ; 第一层循环计数器R5赋值10
D1:   MOV R6,#200      ; 第二层循环计数器R6赋值200
D2:   MOV R7,#248      ; 第三层循环计数器R7赋值248
      DJNZ R7,$      ; R7自减1,非0则原地循环,最内层空循环消耗时钟周期
      DJNZ R6,D2       ; R6自减1,非0跳回D2,重复内层循环
      DJNZ R5,D1       ; R5自减1,非0跳回D1,重复中层+内层循环
      RET            ; 子程序返回指令,回到调用处LCALL的下一行继续执行

      END            ; 汇编程序结束标记,告知编译器代码全部结束

790 发表于 2026-8-10 21:38

太菜 发表于 2026-8-10 21:43

谢谢分享

bidezhi7777 发表于 2026-8-11 06:33

江波波 发表于 2026-8-11 07:12

学习学习

鼎盛电子 发表于 2026-8-11 07:59

谢谢分享

maogege-chen 发表于 2026-8-11 08:30

longxuekai 发表于 2026-8-11 08:30

来看一下的

1234zqdz 发表于 2026-8-11 09:31

感谢分享

captain漠九 发表于 2026-8-11 09:55

谢谢分享
页: [1] 2
查看完整版本: STC90C516RD+,P0驱动共阳数码管显示0-7显示1秒,同时P2驱动7颗LED实现流水灯(汇编代码)