单片机程序解释

单片机程序解释,第1张

ORG 000H

AJMP START

ORG 001BH

AJMP TIMEL    定时器1中断服务

ORG 0030H

START:MOV IE,#10000100B    开启总中断和外部1中断(貌似有错误)

MOV SP,#60H    栈顶为60H

MOV P1,#0FFH    

MOV R0,#00000011B    R0=03H 

MOV R1,#14H    R1=20

ANL TMOD,#0FH    TMOD低位四位保持不变

ORL TMOD,#10H    TMOD高四位设置为定时器1工作模式1

MOV TH1,#3CH    初值为65536-50000

MOV TL1,#0B0H

ORL IE,#88H    开启总中断和定时器1中断

SETB TR1    启动定时器1

LOOP:CJNE R1,#00H,DISP    R1不等于0转DISP

MOV R1,#14H    1秒到后重赋值R1

MOV A,R0

ADD A,#03H

MOV R0,A    R0=R0+3

DISP:MOV P1,R0    P1=R0

AJMP LOOP    转到LOOP继续循环

TIMEL:CLR TR1    定时中断,作为1S计时。

DEC R1

MOV TH1,#3CH

MOV TL1,#0B0H

SETB TR1

RETI

END

ORG

0

SJMP

STAR

;程序启动跳转到主程序入口

ORG

3

LJMP

INT0S

跳转到外部中断0入口

ORG

0030H

STAR:MOV

IE,#81H

开启外部中断0和总中断

MOV

TCON,#1

外部中断0沿触发

MOV

A,#0FEH

累加器复制为FEH

MOV

P3,#0FEH

P3口初始值为FEH

ST1:MOV

P2,A

累加器送P2

ACALL

DELAY

延时

RL

A

累加器循环左移

SJMP

ST1

转移到ST1

INT0S:PUSH

ACC

累加器入栈

MOV

R2,#8

R2赋值为8

LOOP:CLR

A

A清零

MOV

P2,A

A送P2

ACALL

DELAY

延时

MOV

A,#0FFH

A赋值FFH

MOV

P2,A

A送P2

ACALL

DELAY

延时

DJNZ

R2,LOOP

R2减1不为0转LOOP

POP

ACC

Ad出

RETI

这个中断完成P2口8次00和FF数据变换,应该是LED灯闪烁8次。

DELAY:MOV

R7,#250

R7送250

D1:MOV

R6,#250

R6送250

D2:DJNZ

R6,D2

R6减1不为0循环

DJNZ

R7,D1

R7减1不为0循环

RET

大概延时125毫秒。

END

CNTA EQU 30H 8x8 LED阵列行选通顺序计数器,有效值范围0~7

COUNT EQU 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,#5P2.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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11085680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存