小白学习 发表于 2026-8-24 23:33

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                         ;汇编程序结束标记




bidezhi7777 发表于 2026-8-25 06:42

江波波 发表于 2026-8-25 07:19

谢谢分享

13412678220 发表于 2026-8-25 08:08

billtest36 发表于 2026-8-25 08:13

谢谢分享

io357 发表于 2026-8-25 08:14

谢谢分享

mcufan 发表于 2026-8-25 08:37

谢谢分享

we167527 发表于 2026-8-25 08:42

谢谢分享

maogege-chen 发表于 2026-8-25 08:51

790 发表于 2026-8-25 08:53

页: [1] 2 3 4
查看完整版本: STC90C516RD+驱动IIC接口的TM1650四位显示0、1、2、3