
P2的作用是数码管位选引脚,P1是段码
ORG
0000H
程序入口
主函数
MAIN:
MOV
DPTR,#TABAL
将数码管码表TABAL赋给DPTR用于查表
MOV
A,#02H
将立即数02H赋给A
MOVC
A,@A+DPTR
将TABAL第三个值赋给A,即0A4H赋给A
MOV
P2,#01H
选通第一个数码管
MOV
P1,A
将查到的0A4H赋给P1
ACALL
DELAY
延时
以上这一小段就是在第一个数码管上显示2,下面类似
MOV
A,#0
MOVC
A,@A+DPTR
MOV
P2,#2H
MOV
P1,A
ACALL
DELAY
MOV
A,#01H
MOVC
A,@A+DPTR
MOV
P2,#04H
MOV
P1,A
ACALL
DELAY
MOV
A,#0
MOVC
A,@A+DPTR
MOV
P2,#8H
MOV
P1,A
ACALL
DELAY
AJMP
MAIN
跳到MAIN,这里构成循环,不停地扫描数码管显示
以下为延时函数
DELAY:
MOV
R6,#10H
将10H赋给R6
LOOP1:
MOV
R7,#38H
将38H赋给R7
LOOP2:
DJNZ
R7,LOOP2
判断R7减1是否为0,若不为0则继续执行LOOP2
DJNZ
R6,LOOP1判断R6减1是否为0,若不为0则继续跳到LOOP1执行
RET
下面为共阳数码管码表
TABAL:
DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,080H,090H
END
testb=dat&0x01 这个是什么意思? dat 和0X01进行与运算,也就是清掉DAT上的高七位,保留最后一位。dat=dat>>1这个是什么意思?DAT右移一位
if(testb) //写1这个是什么意思? 如果TESTB为非0,执行IF语句;
ds=1i++i++这个是什么意思?为什么有两个i++ i++是I=I+1,两个相当于i=i+2
dat=(j<<7)|(dat>>1)这个是什么意思?j左移7位, dat右移一位,然后相与,你的程序好长,而且不完整,没细看J DAT是什么数据,还不知道为何要移位相与,估计这程序的结果是大于8位的。
a=tempread()
b=tempread()
temp=b
temp<<=8这个是什么意思?
temp=temp|a这个是什么意思?
a为读取的低8位
b为高8位
后面两名是把高低8位拼成一个16位数
好长的程序,好长的注释,终于注完了
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条)