1.实验效果LED滚动字幕2. 74HC595芯片1使用74HC595芯片实现51单片机I/O口扩展74HC595芯片具有串行输入并行输出功能这样就可以让单片机以较少的引脚控制更多的LED灯如上图只需要在SER引脚配合时钟串行输入8位数据就可以在右侧得到相应的并行输出的8位数据从而将单片机的一个引脚扩展为8个引脚此外9号接口是串行输出口这让74HC595支持级联可以一直扩展到162432……274HC595原理本次使用的是595芯片的输出状态所以OE引脚接地RC复位引脚接P1.0SC时钟引脚接P1.1SE串行输入引脚P1.23.595芯片数据寄存代码部分…………MOV R2,#00H ;595寄存器P1.2查表…………TTT:CLR P1.0MOV R1,#00H ;循环计数行595移位寄存器赋值MOV DPTR,#TAP_ROW ;P1.2查表MOV A,R2MOVC A,ADPTRMOV R0,A ;从表中取出595寄存器存储的数据…………LOOP:INC R1 ;计数累加CLR P1.1 ;P1.1时钟引脚,时钟方波起始状态MOV A,R0 ;(A)-(R0)RRC A ; 带进位右移函数MOV R0,A ;重新将右移后的数据给R0JC SETB_1 ;判断移位后Cy得到的数据是否为1为1跳转存1程序SJMP CLR_0 ;为0跳转存0程序SETB_1:SETB P1.2 ;P1.2串行输送口输出1LCALL TIME_1MS ;调用延时1ms子程序SETB P1.1 ;P1.1时钟上升沿595芯片存入数据 1SJMP LUUP ;跳转判断右移次数CLR_0:CLR P1.2 ;P1.2输出0LCALL TIME_1MSSETB P1.1 ;存入数据 0………………3.字幕滚动思想1编码表字符的显示是靠动态刷新实现的而且一次只能刷新8行那么在刷新次数方向上无法做出改变但是刷新用的编码表是可以改变的那么在单个字符刷新程序外面再设置一个程序包含它让他在单个字符持续刷新一定时间后改变它的编码表就可以改变他在这个时间段内显示的字符至于如何让它像字幕一样滚动起来这在于编码表的数据刷新顺序TAP_ROW:DB 80H,40H,20H,10H,08H,04H,02H,01H ;行点亮编码表TAP_CUL:DB0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,00H,0DBH,0FDH,0B8H,056H,0BAH,056H,090H,0FFH,0FFH,00H,0DBH,0FDH,0B8H,056H,0BAH,056H,090H,0FFH,0FFH,0EBH,0EFH,000H,0EFH,0D5H,0D3H,0A6H,070H,0FFH,0FFH,0BFH,0BFH,0BFH,0A3H,09DH,0BDH,0BDH,0BDH,0FFH,0FFH,0C7H,0FBH,0C3H,0BBH,0BBH,0BAH,0C5H,0FFH,0FFH,0FFH,087H,0BBH,0BBH,087H,0BFH,0BFH,0BFH,0BFH,0FFH,0FFH,087H,0BBH,0BBH,087H,0BFH,0BFH,0BFH,0BFH,0FFH,0FFH,0DBH,0DBH,0DBH,0E3H,0FBH,0FBH,0DBH,0E7H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;列点亮编码表药药龙happy编码2刷新框架通过定时器计时判断从数据表第几行开始刷新通过中断程序送刷新初值…………MAIN :JB TF1,TF_1…………TF_1:CLR TF1 ;清楚计时器1溢出位INC R6 ;R6累加用于判断计时是否满0.6sCJNE R6,#0AH,UULL ;满0.6s开启一次定时中断实现滚动一行LED屏幕UULL:JC LUO ;从程序开始字符显示时间小于0.6s跳转赋值计时器初值再次计时SJMP YUY ;字符显示时间达到0.6s跳转开启中断并赋值计时器初值等待中断LUO:MOV TH1,#02H ;计时器赋初值MOV TL1,#18HSETB TR1 ;打开计时器开始计时LJMP TTT ;返回调用地址YUY:SETB EA ;开总总中断SETB ET1 ;开定时器中断LJMP TTT ;返回调用地址TIME_1: ;定时器中断程序PUSH ACC ;压栈ACCPUSH PSW ;压栈状态字CLR EA ;关总中断CLR ET1 ;关定时器1中断CLR TF1 ;清楚定时器1中断标志位INC R7 ;R7累加确定查表初始位CJNE R7,#058H,UO ;###############改变字符数R7的最大值UO:JC LO ;未循环遍历所有表格元素跳转继续遍历循环MOV R7,#00H ;循环遍历完所有元素清零R7从头开始循环LO:MOV TH1,#02H ;计时器初值赋值60msMOV TL1,#18HMOV R6,#00HSETB TR1POP PSW ;出栈程序状态字POP ACC ;出栈Acc累加器RETI…………………4.汇编程序;########################### ;RC复位引脚 P1.0 ;SC时钟引脚 P1.1 ;SE串行输入引脚P1.2 ;R7控制显示字符数 ;消隐思想先送数——后选通——再延时——再切断——再延时——最后跳转循环送数 ;########################### ORG 0000H SJMP MA ;跳转主程序 ORG 001BH LJMP TIME_1 ;跳转中断程序 MA: MOV TMOD,#01H ;使用计时方式1 MOV R2,#00H ;595寄存器P1.2查表计数累加 MOV R7,#00H ;滚动屏显示累加位 MOV R6,#00H ;计时0.6s判断位 MOV R5,#00H ;p0查表初始位 CLR C MOV TH1,#02H ;计时器初值60ms MOV TL1,#18H SETB TR1 ;开计时器 ;#########################################单字符显示子程序 MAIN : JB TF1,TF_1 TTT: CLR P1.0 MOV R1,#00H ;循环计数行595移位寄存器赋值 MOV DPTR,#TAP_ROW ;P1.2查表 MOV A,R2 MOVC A,ADPTR MOV R0,A ;从表中取出595寄存器存储的数据 MOV DPTR,#TAP_CUL ;p0查表 MOV A,R5 MOVC A,ADPTR MOV R3,A ;将查表得到的P0I/O数据给R3 INC R2 ;INC加一操作累加 INC R5 LOOP: INC R1 ;计数累加 CLR P1.1 ;P1.1时钟引脚,时钟方波起始状态 MOV A,R0 ;(A)-(R0) RRC A ; 带进位右移函数 MOV R0,A ;重新将右移后的数据给R0 JC SETB_1 ;判断移位后Cy得到的数据是否为1为1跳转存1程序 SJMP CLR_0 ;为0跳转存0程序 SETB_1: SETB P1.2 ;P1.2串行输送口输出1 LCALL TIME_1MS ;调用延时1ms子程序 SETB P1.1 ;P1.1时钟上升沿595芯片存入数据 1 SJMP LUUP ;跳转判断右移次数 CLR_0: CLR P1.2 ;P1.2输出0 LCALL TIME_1MS SETB P1.1 ;存入数据 0 SJMP LUUP ;跳转判断右移次数 LUUP: CJNE R1,#08H,SU ;判断右移和寄存次数是否满8次 SJMP SU ;右移和寄存次数等于8次复位 SU: JC LOOP ;计数等于和大于8顺序执行小于8循环 SETB P1.0 ;串行数据传输完毕清零寄存器 CJNE R2,#09H,SUU ;判断 是否查表超过7次小于或大于7次跳转 SUU: JC MM ;小于7次跳转初始化 MOV R2,#00H ;大于7次清零R2 MOV A,R7 ;将R7的值给R5格式化P0查表初始值 MOV R5,A MOV P0,#0FFH ;给P0口高电平实现消隐操作 LCALL TIME_1MS LJMP MAIN ;跳转循环主函数 MM: MOV P0,R3 ;给p0赋值 ;LCALL TIME_1S LCALL TIME_10MS ;延时0.5ms MOV P0,#0FFH ;断开p0消隐 LJMP MAIN ;跳转循环 ;#########################################滚动屏刷新子程序 TF_1: CLR TF1 ;清楚计时器1溢出位 INC R6 ;R6累加用于判断计时是否满0.6s CJNE R6,#0AH,UULL ;满0.6s开启一次定时中断实现滚动一行LED屏幕 UULL: JC LUO ;从程序开始字符显示时间小于0.6s跳转赋值计时器初值再次计时 SJMP YUY ;字符显示时间达到0.6s跳转开启中断并赋值计时器初值等待中断 LUO: MOV TH1,#02H ;计时器赋初值 MOV TL1,#18H SETB TR1 ;打开计时器开始计时 LJMP TTT ;返回调用地址 YUY: SETB EA ;开总总中断 SETB ET1 ;开定时器中断 LJMP TTT ;返回调用地址 TIME_1: ;定时器中断程序 PUSH ACC ;压栈ACC PUSH PSW ;压栈状态字 CLR EA ;关总中断 CLR ET1 ;关定时器1中断 CLR TF1 ;清楚定时器1中断标志位 INC R7 ;R7累加确定查表初始位 CJNE R7,#058H,UO ;###############改变字符数R7的最大值 UO: JC LO ;未循环遍历所有表格元素跳转继续遍历循环 MOV R7,#00H ;循环遍历完所有元素清零R7从头开始循环 LO: MOV TH1,#02H ;计时器初值赋值60ms MOV TL1,#18H MOV R6,#00H SETB TR1 POP PSW ;出栈程序状态字 POP ACC ;出栈Acc累加器 RETI TIME_1MS: ;延时0.1MS程序 MOV TH0,#0FFH MOV TL0,#09CH SETB TR0 JNB TF0,$ CLR TF0 RET TIME_10MS: ;延时0.2MS程序 MOV TH0,#0FFH MOV TL0,#038H SETB TR0 JNB TF0,$ CLR TF0 RET TIME_1S: MOV R7,#20 ;延时0.5S子程序 调试阶段使用 DL1: MOV R6,#80 DL2: MOV R5,#248 DJNZ R5,$ DJNZ R6,DL2 DJNZ R7,DL1 RET TAP_ROW:DB 80H,40H,20H,10H,08H,04H,02H,01H ;行点亮编码表 TAP_CUL:DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH, 00H,0DBH,0FDH,0B8H,056H,0BAH,056H,090H,0FFH,0FFH, 00H,0DBH,0FDH,0B8H,056H,0BAH,056H,090H,0FFH,0FFH, 0EBH,0EFH,000H,0EFH,0D5H,0D3H,0A6H,070H,0FFH,0FFH, 0BFH,0BFH,0BFH,0A3H,09DH,0BDH,0BDH,0BDH,0FFH,0FFH, 0C7H,0FBH,0C3H,0BBH,0BBH,0BAH,0C5H,0FFH,0FFH,0FFH, 087H,0BBH,0BBH,087H,0BFH,0BFH,0BFH,0BFH,0FFH,0FFH, 087H,0BBH,0BBH,087H,0BFH,0BFH,0BFH,0BFH,0FFH,0FFH, 0DBH,0DBH,0DBH,0E3H,0FBH,0FBH,0DBH,0E7H,0FFH,0FFH, 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;列点亮编码表 END