大家好,请问有谁做过51单片机的16*64点阵吗,,求仿真图和程序
1个回答
展开全部
如果单片机I/O口不够用的话 试试用 串入并出 的方式
我写过一个8*8点阵 是用的 串入并出 方式 是汇编的 你参考下吧
其实可以考虑下用液晶 成本也不高
;MyDesign 8x8LEDboard by MCU
;阴极(行ROW)
;共阳极(列COL)
;P3.4-------MD
;P3.5-------CLR_COL 164并出端清零(显示)
;P3.6-------CLK1 164移位脉冲输出(驱动)
;P3.7-------CLK2 164移位脉冲输出(显示)
;P1.0-------驱动输入(串入)
;P2.0-------显示输入(串入)
;MD是灭灯信号
;CLR_COL是驱动清零信号,低电平有效
;CLK1是驱动的移位脉冲
;CLK2是显示的移位脉冲
;******************************************
ORG 0000H
MD EQU P3.4
CLR_COL EQU P3.5
CLK1 EQU P3.6
CLK2 EQU P3.7
;初始化存储区
MOV 50H, #81H
MOV 51H, #42H
MOV 52H, #24H
MOV 53H, #18H
MOV 54H, #18H
MOV 55H, #24H
MOV 56H, #42H
MOV 57H, #81H
MOV B, #50H ;首地址
MOV IE, #98H ;开中断
AJMP RVE1
ORG 0050H
RVE1:
MOV TMOD, #20H ;T1工作方式2定时状态
MOV TH1, #0F3H ;计数常数->T1
MOV TL1, #0F3H
SETB TR1 ;启动T1
MOV SCON, #50H ;串口方式1,允许接收
MOV PCON, #00H ;置波特率控制位SOMD=0,不加倍
AJMP MAIN
;对显示信息修改的入口
RVE2:
SETB MD
MOV R0, B ;恢复存储区地址
CJNE R0, #58H, CONT1 ;存储区未写满则继续
MOV R0, #50H ;存储区已写满则从第一个存储单元开始
MOV B, #50H
CONT1:
MOV A, @R0 ;先将@R0中的数做保存
MOV @R0, SBUF ;保存数据
CJNE @R0, #0FFH, CONT5 ;"#0FFH"是暂时定义的结束修改命令
MOV @R0, A ;还原这次的修改
AJMP CONT2
CONT5:
CJNE @R0, #0EEH, CONT2 ;"#0EEH"是暂时定义的转到第一个存储单元命令
MOV @R0, A
AJMP RVE5
CONT2:
INC B ;为了方便更改地址
MOV A, B
CJNE A, #58H, CONT3
MOV B, #50H
CONT3:
MOV SBUF, B ;发送下一次修改的地址
AJMP MAIN
CONT4:
INC R0
MOV B, R0 ;保存地址
MOV SBUF, B
AJMP MAIN
RVE5:
MOV B, #50H
MOV SBUF, B
MAIN:
JBC RI, RVE2 ;如果接收到数据则跳至数据修改程序
CLR CLK1
CLR CLK2
CLR CLR_COL ;清零移位寄存器并出(驱动)
MOV SP, #60H
MOV R1, #08H ;加载显示信息完成标志
MOV R0, #50H ;片内存储区首地址
MOV R2, #01H ;存储驱动信息
MOV R3, #08H ;加载驱动信息完成标志
MOV R4, #08H ;8行显示信息均已动态扫描
;加载一行的显示信息
LOOP1:
SETB MD ;灭灯
MOV A, R0
PUSH ACC
MOV A, @R0
LOADDATA:
MOV P2, A ;加载显示信息,串入164
SETB CLK2 ;发移位脉冲
CLR CLK2
RR A ;显示信息左移一位
DJNZ R1, LOADDATA ;显示信息没加载完成则跳转继续加载
;加载驱动信息,开始按列动态扫描
;工作方式如下
;加载第一行显示信息,扫描第一行
;加载第二行显示信息,扫描第二行(对ACC右移,通过P1口串出)
LOOP2:
MOV A, R2 ;加载驱动信息
SETB CLR_COL ;禁止清零移位寄存器并出(驱动)
MOV P1, A ;加载驱动信息,串入164
SETB CLK1 ;发移位脉冲
CLR CLK1
RR A ;驱动信息左移一位
CLR MD ;显示
LCALL myDELAY
MOV R2, A ;保存当前的驱动信息
DJNZ R4, LOOP3 ;8行显示信息至少有一行没动态扫描完成则跳转继续加载
;不需要对动态扫描的次数作判断
AJMP MAIN
LOOP3:
POP ACC
INC A
MOV R0, A
AJMP LOOP1
;450ms延时子程序
;MOV 1(个机器周期)
;DEC 1
;CJNE 2
;RET 2
;由myDELAY.C计算生成
myDELAY:
MOV R6,#197
MOV R7,#1
DELAY1:
DEC R6
CJNE R6,#00H,DELAY1
MOV R6,#197
DEC R7
CJNE R7,#00H,DELAY1
RET
END
我写过一个8*8点阵 是用的 串入并出 方式 是汇编的 你参考下吧
其实可以考虑下用液晶 成本也不高
;MyDesign 8x8LEDboard by MCU
;阴极(行ROW)
;共阳极(列COL)
;P3.4-------MD
;P3.5-------CLR_COL 164并出端清零(显示)
;P3.6-------CLK1 164移位脉冲输出(驱动)
;P3.7-------CLK2 164移位脉冲输出(显示)
;P1.0-------驱动输入(串入)
;P2.0-------显示输入(串入)
;MD是灭灯信号
;CLR_COL是驱动清零信号,低电平有效
;CLK1是驱动的移位脉冲
;CLK2是显示的移位脉冲
;******************************************
ORG 0000H
MD EQU P3.4
CLR_COL EQU P3.5
CLK1 EQU P3.6
CLK2 EQU P3.7
;初始化存储区
MOV 50H, #81H
MOV 51H, #42H
MOV 52H, #24H
MOV 53H, #18H
MOV 54H, #18H
MOV 55H, #24H
MOV 56H, #42H
MOV 57H, #81H
MOV B, #50H ;首地址
MOV IE, #98H ;开中断
AJMP RVE1
ORG 0050H
RVE1:
MOV TMOD, #20H ;T1工作方式2定时状态
MOV TH1, #0F3H ;计数常数->T1
MOV TL1, #0F3H
SETB TR1 ;启动T1
MOV SCON, #50H ;串口方式1,允许接收
MOV PCON, #00H ;置波特率控制位SOMD=0,不加倍
AJMP MAIN
;对显示信息修改的入口
RVE2:
SETB MD
MOV R0, B ;恢复存储区地址
CJNE R0, #58H, CONT1 ;存储区未写满则继续
MOV R0, #50H ;存储区已写满则从第一个存储单元开始
MOV B, #50H
CONT1:
MOV A, @R0 ;先将@R0中的数做保存
MOV @R0, SBUF ;保存数据
CJNE @R0, #0FFH, CONT5 ;"#0FFH"是暂时定义的结束修改命令
MOV @R0, A ;还原这次的修改
AJMP CONT2
CONT5:
CJNE @R0, #0EEH, CONT2 ;"#0EEH"是暂时定义的转到第一个存储单元命令
MOV @R0, A
AJMP RVE5
CONT2:
INC B ;为了方便更改地址
MOV A, B
CJNE A, #58H, CONT3
MOV B, #50H
CONT3:
MOV SBUF, B ;发送下一次修改的地址
AJMP MAIN
CONT4:
INC R0
MOV B, R0 ;保存地址
MOV SBUF, B
AJMP MAIN
RVE5:
MOV B, #50H
MOV SBUF, B
MAIN:
JBC RI, RVE2 ;如果接收到数据则跳至数据修改程序
CLR CLK1
CLR CLK2
CLR CLR_COL ;清零移位寄存器并出(驱动)
MOV SP, #60H
MOV R1, #08H ;加载显示信息完成标志
MOV R0, #50H ;片内存储区首地址
MOV R2, #01H ;存储驱动信息
MOV R3, #08H ;加载驱动信息完成标志
MOV R4, #08H ;8行显示信息均已动态扫描
;加载一行的显示信息
LOOP1:
SETB MD ;灭灯
MOV A, R0
PUSH ACC
MOV A, @R0
LOADDATA:
MOV P2, A ;加载显示信息,串入164
SETB CLK2 ;发移位脉冲
CLR CLK2
RR A ;显示信息左移一位
DJNZ R1, LOADDATA ;显示信息没加载完成则跳转继续加载
;加载驱动信息,开始按列动态扫描
;工作方式如下
;加载第一行显示信息,扫描第一行
;加载第二行显示信息,扫描第二行(对ACC右移,通过P1口串出)
LOOP2:
MOV A, R2 ;加载驱动信息
SETB CLR_COL ;禁止清零移位寄存器并出(驱动)
MOV P1, A ;加载驱动信息,串入164
SETB CLK1 ;发移位脉冲
CLR CLK1
RR A ;驱动信息左移一位
CLR MD ;显示
LCALL myDELAY
MOV R2, A ;保存当前的驱动信息
DJNZ R4, LOOP3 ;8行显示信息至少有一行没动态扫描完成则跳转继续加载
;不需要对动态扫描的次数作判断
AJMP MAIN
LOOP3:
POP ACC
INC A
MOV R0, A
AJMP LOOP1
;450ms延时子程序
;MOV 1(个机器周期)
;DEC 1
;CJNE 2
;RET 2
;由myDELAY.C计算生成
myDELAY:
MOV R6,#197
MOV R7,#1
DELAY1:
DEC R6
CJNE R6,#00H,DELAY1
MOV R6,#197
DEC R7
CJNE R7,#00H,DELAY1
RET
END
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询