📄 led汉字显示_移位寄存器方式(595)程序成功.txt
字号:
LED汉字显示_移位寄存器方式(595)程序成功!
有117人看过 有0人收藏过 有0人引用过 0人推荐来自luole700
始于10个月前作者为这篇作品定义的标签:
luole700 可惜我还要把这篇文章发在单片机开发这个专栏里我的希望是用ARM+DSP+CPLD做大屏幕LED点阵电视机目标似乎很远,但是我在接近着 移位寄存器方式的汉字显示优点是节省I/O口,锁存输出稳定,而且595系列的器件可以承受的电流很大,DATASHEET上说有600MA。经验证一个点点得足够亮只需要约2-3MA 所以,驱动不成问题 编程上的难点在于模拟串口,其实这里不一定要严格地模拟串口,只需要在固定时间范围内出现上升沿就可以了(数据的串入和锁存都是由上升沿触发) 要注意的地方有: 1 数据最先输入的是放到所有并列的移位寄存器的最后一个。所以在取数据的时候要把后面的提前 2 所有行列的数据全都准备完毕后在触发锁存,这样显示的汉字不会有叠影。
单片机lcd实现滚屏
悬赏分:0 - 解决时间:2006-12-5 08:58
总体思想,如流程图等;以及利用到51单片机哪些资源?
提问者: junyingchu - 试用期 一级 最佳答案
;………………………………………………
;16*16显示一个汉字,向左移动
;只能显示8个汉字,受8位控制
;………………………………………………
;资源分析
;………………………………………………
;R0指向数据缓存地址,R1显示地址指针,R2数据增加指向指针,R3显示扫描次数
;R4、R5延时程序,R6扫描延时,50H作片选字,51H右片选字
;52H、53H、54H、55H、56H屏幕流动积存器,57H第二个字首地址
;30H~4FH显示缓存
;………………………………………………
;引脚定义
;………………………………………………
CLK BIT P2.0 ;74HC164清零,低电平清零
RCK BIT P2.1 ;74HC595移出脉冲,上升沿有效
SRCLR BIT P2.2 ;74HC595清零,低电平清零
G BIT P2.3 ;74HC595使能输出,低电平输出
;………………………………………………
;定义变量
;………………………………………………
D_LIST EQU (8) ;单个数据显示时间延时,即向右流动速度
;………………………………………………
;显存初始化
;………………………………………………
CHULI: MOV R6,#D_LIST ;单个数据显示时间延时
MOV R2,#0 ;定义编码数据指针,从0开始
MOV R0,#30H ;首显存地址送R0,定义显存地址指针
LOOP3: MOV A,R2 ;编码数据指针送A
MOV DPTR,#TAB ;表首地址送DPTR
MOVC A,@A+DPTR ;查表取显示编码
MOV @R0,A ;显示编码送现显存
INC R2 ;编码数据指针+1
INC R0 ;指向下一地址
CJNE R2,#32,LOOP3 ;判断是否完成一次数据刷新
LOOP6: ACALL START ;调用显示程序作延时
DJNZ R6,LOOP6 ;判断是否完成延时
MOV R6,#D_LIST ;恢复延时时间
;………………………………………………
;显示流动
;………………………………………………
MOV 57H,#32 ;第二个字的编码首地址
LOOP1: MOV R2,#15 ;定义数据移动指针
MOV R0,#30H ;显存首地址送R0
LOOP5: MOV 52H,R0 ;地址指针缓存
INC R0 ;地址指针加1,指向下一地址
MOV 53H,R0 ;地址指针缓存
INC R0 ;指向下一地址
MOV 55H,R0 ;地址指针缓存
MOV 54H,@R0 ;取指针地址里的数据存54H
MOV R0,52H ;取回地址指针
MOV @R0,54H ;刷新地址指针指向地址的数据
MOV R0,55H ;取回地址指针
INC R0 ;地址指针+1,指向下一地址
MOV 56H,@R0 ;取指针地址里的数据存56H
MOV R0,53H ;取回地址指针
MOV @R0,56H ;刷新地址指针指向地址的数据
MOV R0,55H ;地址指针缓存
DJNZ R2,LOOP5 ;完成15次刷新地址
MOV DPTR,#TAB ;表首地址送DPTR
MOV A,57H ;取回地址指针给A
MOVC A,@A+DPTR ;查表取数
MOV R0,#4EH ;送最后一列上地址指针
MOV @R0,A ;A送给最后一列上地址
INC 57H ;编码数据地址加1
MOV A,57H ;取回地址指针给A
MOVC A,@A+DPTR ;查表取数
MOV R0,#4FH ;送最后一列下地址指针
MOV @R0,A ;A送给最后一列下地址
INC 57H ;指向下一地址
LOOP4: ACALL START ;调用显示程序作延时
DJNZ R6,LOOP4 ;判断是否完成延时
MOV R6,#D_LIST ;恢复延时时间
SJMP LOOP1 ;返回LOP1,继续刷新地址里的数据,使显示右移
;………………………………………………
;显示子程序
;………………………………………………
START: CLR CLK ;74HC164清零
SETB CLK
CLR SRCLR ;74HC595清零
SETB SRCLR
LOOP2: MOV R3,#16 ;扫描次数送R3
MOV R1,#30H ;显存首地址送R1
CLR C ;C置1
MOV 50H,#0FFH ;左片选字
MOV 51H,#0FFH ;右片选字
;………………………………………………
LOOP: CLR RCK ;74HC595移出脉冲准备
SETB G ;置高74HC595使能端,使输出呈高阻
MOV A,@R1 ;取显存首地址里的是数
MOV SCON,#00H ;选串口以方式0工作
MOV SBUF,A ;把A从串口发送
JNB TI,$ ;等待发送完一帧
CLR TI ;清标志位
INC R1 ;地址指针加1
MOV A,@R1 ;取显存R0所指向地址里的是数
; MOV SCON,#00H ;选串口以方式0工作
MOV SBUF,A ;把A从串口发送
JNB TI,$ ;等待发送完一帧
CLR TI ;清标志位
INC R1 ;地址指针加1
MOV A,50H ;左片选字送A
RRC A ;带进位位右移,选中第一列,低电平有效
; MOV SCON,#00H ;选串口以方式0工作
MOV SBUF,A ;把A从串口发送
JNB TI,$ ;等待发送完一帧
CLR TI ;清标志位
MOV 50H,A ;左片选字送回寄存器
MOV A,51H ;右片选字送A
RRC A ;带进位位右移,选中第九列,低电平有效
; MOV SCON,#00H ;选串口以方式0工作
MOV SBUF,A ;把A从串口发送
JNB TI,$ ;等待发送完一帧
CLR TI ;清标志位
MOV 51H,A ;右片选字送回寄存器
SETB RCK ;74HC595移出脉冲呈上升沿,数据移出
CLR G ;使能输出
ACALL DELAY ;调延时子程序,是显示定格1ms
DJNZ R3,LOOP
RET
;………………………………………………
;1ms延时子程序
;………………………………………………
DELAY : MOV R4,#1 ;延时毫秒数送R4
D2: MOV R5,#250 ;1ms延时值
D1: NOP
NOP
DJNZ R5,D1 ;1ms延时循环
DJNZ R4,D2 ;毫秒数减1,不等于0则继续循环,等于结束
RET
;………………………………………………
;显示编码数据
;………………………………………………
TAB: DB 01H,00H,01H,00H,01H,00H,01H,00H,0FFH,0FFH,05H,02H,05H,84H,09H,48H;
DB 09H,20H,11H,10H,21H,08H,41H,0CH,01H,06H,01H,04H,01H,00H,00H,00H;"长",0
DB 08H,20H,08H,30H,0FFH,0E0H,08H,42H,08H,4CH,1FH,0F0H,12H,10H,12H,1AH;
DB 13H,0F2H,10H,04H,0FFH,0C8H,10H,30H,50H,0CCH,37H,02H,12H,1CH,00H,00H;"城",1
DB 00H,00H,00H,00H,1FH,0F0H,12H,20H,12H,20H,12H,20H,12H,20H,0FFH,0FCH;
DB 12H,22H,12H,22H,12H,22H,12H,22H,1FH,0F2H,00H,02H,00H,0EH,00H,00H;"电",2
DB 10H,40H,11H,80H,16H,00H,0FFH,0FFH,14H,00H,02H,04H,13H,0C8H,92H,50H;
DB 72H,60H,1FH,0FFH,32H,40H,52H,40H,92H,48H,1EH,44H,00H,78H,00H,00H;"梯",3
DB 00H,40H,20H,80H,21H,00H,22H,00H,27H,0FFH,2CH,90H,34H,90H,0E4H,90H;
DB 24H,94H,24H,92H,24H,93H,27H,0FEH,20H,00H,20H,00H,20H,00H,00H,00H;"有",4
DB 7FH,0FFH,40H,00H,4CH,40H,72H,20H,41H,0C0H,00H,00H,7FH,0FFH,52H,02H;
DB 53H,04H,52H,0C0H,52H,30H,52H,48H,7EH,84H,00H,06H,00H,04H,00H,00H;"限",5
DB 00H,00H,00H,80H,01H,04H,02H,0EH,0CH,14H,70H,24H,21H,0C4H,00H,8CH;
DB 00H,08H,70H,08H,08H,28H,06H,1EH,03H,0CH,01H,80H,01H,00H,00H,00H;"公",6
DB 00H,00H,08H,00H,49H,0F8H,49H,20H,49H,20H,49H,20H,49H,20H,49H,20H;
DB 49H,20H,49H,0F0H,48H,00H,40H,04H,40H,02H,7FH,0FCH,00H,00H,00H,00H;"司",7
应用演示程序:
;=====================================================
;74HC595 走马灯演示程序
;创作日期:2006/01/02
;创作者: gguoqing
;=====================================================
SDATA_595 EQU P1.0 ;串行数据输入
SCLK_595 EQU P1.1 ;移位时钟脉冲
RCK_595 EQU P1.2 ;输出锁存器控制脉冲
;=====================================================
ORG 0000H
LJMP MAIN
ORG 0030H
;=====================================================
MAIN:
MOV SP,#60H
MOV R0,#0FEH
MAIN1:
CALL OUT_595
CALL DELAY
MOV A,R0
RL A
MOV R0,A
JMP MAIN1
;----------------------------------------------------------------------
;输出锁存器输出数据子程序
;----------------------------------------------------------------------
OUT_595:
LCALL WR_595
CLR RCK_595
NOP
NOP
SETB RCK_595 ;上升沿将数据送到输出锁存器
NOP
NOP
NOP
CLR RCK_595
RET
;---------------------------------------------------------------------
;移位寄存器接收数据子程序
;---------------------------------------------------------------------
WR_595:
MOV R4,#08H ;
MOV A,R0
WR_LOOP:
RLC A
MOV SDATA_595,C
SETB SCLK_595 ;上升沿发生移位
NOP
NOP
CLR SCLK_595
DJNZ R4,WR_LOOP
RET
;--------------------------------------------------------------------
;延时子程序
;--------------------------------------------------------------------
DELAY:
MOV R5,#03H
DEL0:
MOV R6,#0FFH
DEL1:
MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL1
DJNZ R5,DEL0
RET
;=====================================================
END
学习,学习,再学习。
2006-01-08 21:13 [广告] USB AVR DebugWIRE+AVRISP MKII 2合1 下载仿真器
gguoqing
等级: 蝙蝠侠
头衔:伟纳管理员
贴子:2466
积分:2112
伟纳币:480
注册:2004-10-02
第 2 楼
电路图见楼上
/******************************************************************
/* *
/* 74HC595 走马灯演示程序 *
/* *
/* 邮箱: gguoqing@willar.com *
/* 网站: http://www.willar.com ; *
/* 作者: gguoqing *
/* 时间: 2006/02/26 *
/* *
/*【版权】COPYRIGHT(C)伟纳电子 www.willar.com ALL RIGHTS RESERVED *
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
/* *
/******************************************************************/
#include <reg51.h> //51芯片管脚定义头文件
#include <intrins.h> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
uchar code DAT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit SDATA_595=P1^0; //串行数据输入
sbit SCLK_595 =P1^1; //移位时钟脉冲
sbit RCK_595 =P1^2; //输出锁存器控制脉冲
uchar temp;
/********************************************************/
/* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -