单片机数码显示程序解读??帮我读下!!

单片机数码显示程序解读??帮我读下!!,第1张

程序应该是在数码管上显示2010

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~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://54852.com/yw/7815939.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存