STC90C516RD+驱动IIC接口的TM1650四位显示0、1、2、3
数码管来源链接:https://item.taobao.com/item.htm?id=687984025071&mi_id=000005PA1UrqHtTcqWxtAoMcM9b2wokT56xaEr_4l5ovk3s&spm=tbpc.boughtlist.suborder_itemtitle.1.23962e8d7ndYSi//////////汇编代码//////////
;定义引脚:TM1650时钟线CLK接P3.7,数据线DIO接P3.6
;定义引脚:TM1650时钟线CLK接P3.7,数据线DIO接P3.6
CLK EQU P3.7 ;TM1650的CLK时钟引脚,文本替换全局生效
DIO EQU P3.6 ;TM1650的DIO数据引脚,文本替换全局生效
ORG 0000H ;告诉编译器,后续代码从0000H地址开始存放
LJMPMAIN ;执行这段代码后跳转到MAIN处执行
;===========================================
ORG30H ;MAIN起始地址0030H,避开工作组0-3(00H-1FH)、可位寻址区(20H-2FH)
MAIN:
MOV SP, #60h;设置堆栈指针SP=60H,堆栈从61H向上生长最,默认是07H(08H开始)且不能超过7FH(00H-7FH是片内RAM)
LCALL TM1650_Start ;1:调用Srt子程序,发送TM1650通信起始信号
MOV A,#48H ;2:TM1650系统设置命令0x48送入累加器A
LCALL TM1650_Writebyte ;3:调用Writebyte,向TM1650发送0x48命令
MOV A,#00010001B ;4:亮度设置参数,bit0?bit2控制亮度
LCALL TM1650_Writebyte ;4:调用Writebyte,发送亮度配置参数
LCALL TM1650_Stop ;5:调用Stop子程序,发送通信停止信号,结束初始化命令
MOV 30H,#0 ;片内RAM30H单元赋值0,存放第4位显示数字
MOV 31H,#1 ;片内RAM31H单元赋值1,存放第3位显示数字
MOV 32H,#2 ;片内RAM32H单元赋值2,存放第2位显示数字
MOV 33H,#3 ;片内RAM33H单元赋值3,存放第1位显示数字
WAIT: ;5:调用DISP显示子程序,刷新4位数码管
LCALL DISP
SJMPWAIT ;相对跳转,原地循环,不停刷新显示
;=================TM1650显示子程序======================
DISP:
MOV DPTR,#TAB ;数据指针DPTR指向七段段码表TAB首地址
LCALLTM1650_Start ;发送通信起始信号,准备写第1位显存
MOV A,#68H ;TM1650第1位数码管显存地址0x68送入A
LCALL TM1650_Writebyte ;发送显存地址0x68
MOV A,33H ;取出33H单元待显示数字(数字3)送入A
LCALL QUBIAO ;调用QUBIAO查表,取出段码并发送给TM1650
LCALL TM1650_Stop ;发送停止信号,结束第1位写入
LCALLTM1650_Start ;发送通信起始信号,准备写第2位显存
MOV A,#6AH ;TM1650第2位数码管显存地址0x6AH送入A
LCALL TM1650_Writebyte ;发送显存地址0x6A
MOV A,32H ;取出32H单元待显示数字(数字2)送入A
LCALL QUBIAO ;查表取出段码并发送
LCALL TM1650_Stop ;发送停止信号,结束第2位写入
LCALLTM1650_Start ;发送通信起始信号,准备写第3位显存
MOV A,#6CH ;TM1650第3位数码管显存地址0x6CH送入A
LCALL TM1650_Writebyte ;发送显存地址0x6C
MOV A,31H ;取出31H单元待显示数字(数字1)送入A
LCALL QUBIAO ;查表取出段码并发送
LCALL TM1650_Stop ;发送停止信号,结束第3位写入
LCALLTM1650_Start ;发送通信起始信号,准备写第4位显存
MOV A,#6EH ;TM1650第4位数码管显存地址0x6EH送入A
LCALL TM1650_Writebyte ;发送显存地址0x6E
MOV A,30H ;取出30H单元待显示数字(数字0)送入A
LCALL QUBIAO ;查表取出段码并发送
LCALL TM1650_Stop ;发送停止信号,结束第4位写入
RET ;子程序返回,回到WAIT循环
QUBIAO: ;查表取七段段码子程序
MOVC A,@A+DPTR ;ROM查表:A为偏移,DPTR为表基址,取出对应七段段码到A
LCALL TM1650_Writebyte ;把查表得到的段码发送给TM1650
RET ;子程序返回
;--------发送一字节数据子程序-------------
TM1650_Writebyte:
MOV R6,#8 ;R6=8,一个字节共8bit,循环发送8次
WB1:
CLR CLK ;CLK时钟拉低,准备输出bit
RLC A ;累加器A带进位左移1位,最高位移入进位标志C
MOV DIO,C ;把进位C的数据输出到DIO数据引脚
SETB CLK ;CLK拉高,TM1650在上升沿采样DIO电平
DJNZ R6,WB1 ;R6自减1,不为0则跳回WB1,继续发送下一位
CLR CLK ;8bit发送完成,拉低时钟
MOV R6,#03 ;R6赋值3,模拟I2C应答等待(TM1650无应答,此段无效)
ACK:
DEC R6 ;R6减1
MOV A,R6 ;R6送入A,判断是否计数到0
JZ WB2 ;如果R6=0,跳转到WB2,退出应答等待
JB DIO,ACK ;如果DIO为高电平,继续循环等待应答(TM1650不会拉低DIO)
WB2:
SETB CLK ;拉高时钟
RET ;字节发送完成,子程序返回
;--------起始信号Srt子程序------------
TM1650_Start:
SETB DIO ;DIO数据线置1,总线空闲状态
SETB CLK ;CLK时钟线置1,总线空闲状态
CLR DIO ;CLK高电平时,DIO拉低,产生下降沿,TM1650通信起始条件
CLR CLK ;拉低CLK时钟,准备后续bit传输
RET ;子程序返回
;--------停止信号Stop子程序------------
TM1650_Stop:
CLR CLK ;CLK时钟拉低
CLR DIO ;DIO数据线拉低
SETB CLK ;CLK时钟拉高
SETB DIO ;CLK为高,DIO拉高,产生上升沿,TM1650通信停止条件
RET ;子程序返回
;================TM1650共阴极七段数码管字形表=================
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H;0~F的段码
;=============================================
END ;汇编程序结束标记
谢谢分享 谢谢分享 谢谢分享 谢谢分享 谢谢分享
