- 打卡等级:以坛为家II
- 打卡总天数:99
- 打卡月天数:0
- 打卡总奖励:320
- 最近打卡:2026-06-10 14:36:35
二级逆天
- 积分
- 1002
  
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
; 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 ; 汇编程序结束标记,告知编译器代码全部结束
|
|