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
ORG0
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~7COUNT 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)