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
要将PLC代码解析到单片机中,需要经过以下几个步骤:了解PLC的编程语言:PLC的编程语言通常有Ladder Diagram(梯形图)、Function Block Diagram(功能块图)、Structured Text(结构化文本)等。需要了解PLC编程语言的语法和功能,以便进行代码解析。
了解单片机的编程语言:单片机通常使用C、C++、Assembly等编程语言。需要了解单片机编程语言的语法和功能,以便将PLC代码转化为单片机代码。
逐行解析PLC代码:将PLC代码逐行解析,分析其功能和逻辑,并将其转化为单片机代码。需要注意的是,PLC和单片机的硬件和软件环境不同,需要根据实际情况进行适当的转化和调整。
编写单片机程序:根据解析出的PLC代码,编写单片机程序,并进行调试和优化。需要注意的是,单片机的处理能力和存储容量有限,需要对程序进行精简和优化,以保证程序的稳定性和可靠性。
总之,将PLC代码解析到单片机中需要经过一定的技术和经验积累,需要了解PLC编程语言和单片机编程语言的语法和功能,并进行逐行解析和转化。
uint8_t *ptr uint8_t len 这是传入参数。 len可能是长度,ptr可能指向的是一个数组。^= 按位异或后赋值。
crc ^= *ptr++//首先将数组第一位异或后复制给Crc。之后ptr再向前一步,简单理解就是指向数组的下一位。
for(i = 0i <8i++){if(crc &0x01)crc = (crc >>1) ^ 0x8C elsecrc >>= 1 }
//将取到数组第一位值,与0x01上。如果非零,crc就需要右移一位,再与0x8C异或。否则右移1位。每位数组值要做8次。
while(len--) //表示要判断数组内len个值。或则说是取得数组内len长度的元素个数。
return crc//len个数组值都作完以后,将Crc返回。
我想你需要了解一下 0x01的意义,0x8C的意义。
0x01 = 0000 0001
0x8c = 1000 1100
没看到啊,已经有人答完了。哎,早知道就不写这么多字了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)