单片机程序解释?
发布网友
发布时间:2022-05-11 13:46
我来回答
共1个回答
热心网友
时间:2023-10-13 13:31
CNTAEQU 30H ;8x8 LED阵列行选通顺序计数器,有效值范围0~7
COUNTEQU 31H ;8x8 LED阵列顺序显示计数器,有效值范围0~2
ORG 00H
LJMP START ;跳转到30H开始的主程序主体,避开中断入口地址
ORG 0BH
LJMP T0X ;跳转到定时中断0中断服务程序
ORG 30H
START:MOV CNTA,#00H ;主程序开始
MOV COUNT,#00H ;3个8X8 LED点阵送显示计数
MOV TMOD,#01H ;定时器0设定为定时方式,方式1,16位模式
MOV TH0,#(65536-1000) / 256 ;1ms定时中断预装值高8位
MOV TL0,#(65536-1000) MOD 256 ;1ms定时中断预装值高8位
SETB TR0 ;启动定时器0
SETB ET0 ;允许定时器0中断
SETB EA ;开启总中断允许
WT:JB P2.0,WT ;读P2.0端口状态,高电平则原地循环等待其变为低电平
MOV R6,#5 ;P2.0为低电平,则开始延时滤波循环
MOV R7,#248
D1:DJNZ R7,$
DJNZ R6,D1
JB P2.0,WT ;再次确认P2.0是否低电平,不是则认为端口干扰,回到WT继续等待
INC COUNT ;LED阵列计数+1,显示下一个LED阵列
MOV A,COUNT
CJNE A,#03H,NEXT ;LED阵列计数未到3,跳转到NEXT
MOV COUNT,#00H ;LED阵列计数则清零,跳回WT从第一个开始扫描
NEXT:JNB P2.0,$ ;原地循环,等待P2.0恢复高电平
SJMP WT ;P2.0恢复高电平,返回WT,等待下一次动作
T0X:NOP
MOV TH0,#(65536-1000) / 256 ;重装定时计数寄存器
MOV TL0,#(65536-1000) MOD 256
MOV DPTR,#TAB ;设定选通端口查表起始地址
MOV A,CNTA ;得到LED显示行计数值,该计数为1-8,到8时清零重新开始
MOVC A,@A+DPTR ;查表得到行选通端口状态字符
MOV P3,A ;将选通信号送到P3口,低电平的端口指向的LED阵列被选通
MOV DPTR,#GRAPH ;设定显示信息查表起始地址
MOV A,COUNT ;根据计数器,确定当前显示的是1、2、3中的哪个阵列
MOV B,#8
MUL AB ;8X8阵列,所以一个阵列显示信息需要8个字节,
ADD A,CNTA ;指向待显示行的点阵信息
MOVC A,@A+DPTR ;读取
MOV P1,A ;该行8列的显示信息送P1口
INC CNTA ;计数器+1指向下一行
MOV A,CNTA
CJNE A,#8,NEX ;判断是否已到第8行,未到则直接退出中断
MOV CNTA,#00H ;已到,计数清零,下次从第一行开始扫描
NEX:RETI
TAB:DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH ;LED阵列行选通端口控制状态值
GRAPH:DB 12H,14H,3CH,48H,3CH,14H,12H,00H ;第1个LED阵列的点阵信息
DB 00H,00H,38H,44H,44H,44H,38H,00H ;第2个LED阵列的点阵信息
DB 30H,48H,44H,22H,44H,48H,30H,00H ;第3个LED阵列的点阵信息
END