MicroPython TM1621 驱动 代码

import machine
from machine import Pin
import time  
  
# 定义TMI621D模块的引脚连接  
pin_cs = machine.Pin(0, Pin.OUT)  
pin_wr = machine.Pin(1, Pin.OUT)  
pin_data = machine.Pin(2, Pin.OUT)  

#TMI621D模块命令定义
SYSDIS = 0x00  #关系统振荡器和LCD偏压发生器
SYSEN  = 0x02  #打开系统振荡器

LCDOFF = 0x04  #关闭LCD偏压
LCDON = 0x06   #打开LCD偏压

RC = 0x30  #内部RC震荡
BIAS = 0x52  # 1/3偏压 4公共口

def delay_ns():
    time.sleep_us(10)  #延时10us

#从高位写入数据
def write_data_h(data,cnt):
    for i in range(cnt):
        pin_wr.off()
        if data & 0x80:  #从最高位发送
            pin_data.on()
        else:
            pin_data.off()
        delay_ns()
        pin_wr.on()
        data<<= 1
    pin_wr.off()
    pin_data.off()

#从低位写入数据
def write_data_l(data,cnt):
    for i in range(cnt):
        pin_wr.off()
        if data & 0x01:   #从最低位发送
            pin_data.on()
        else:
            pin_data.off()
        delay_ns()
        pin_wr.on()
        data>>= 1
    pin_wr.off()
    pin_data = 0

#写入控制命令
def writecmd(cmd):
    pin_cs.off()
    delay_ns()
    write_data_h(0x80,4)  #写入命令标志100
    write_data_h(cmd,8)   #写入命令数据
    pin_cs.on()
    delay_ns()
    
#指定地址写入数据
def writeonedata(addr,data):
    pin_cs.off()
    delay_ns()
    write_data_h(0xa0,3)  #写入命令标志101
    write_data_h(addr<<2,6)  #写入地址数据
    write_data_l(data,4)   #写入数据
    pin_cs.on()
    delay_ns()

#连续写入方式,每次数据为8位,写入数据
def writealldata(addr,p,cnt):
    pin_cs.off()
    delay_ns()
    write_data_h(0xa0,3)  #写入命令标志101
    write_data_h(addr<<2,6)  #写入地址数据    
    
    for i in range(cnt):
        write_data_l(p[i],8)
    pin_cs.on()
    delay_ns()    
        
#TM1621D初始化
def IM1621D_init():
    pin_cs.on()
    pin_wr.on()
    pin_data.on()
    delay_ns()
    writecmd(BIAS)  # 1/3偏压4公共口
    writecmd(RC)   # 内部RC震荡
    writecmd(SYSDIS) #关系统振荡器和LCD偏压发生器
    writecmd(SYSEN)  #打开系统振荡器
    writecmd(LCDON)  #打开LCD偏压

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名:TM1621-V1.0 *当前版本:V1.0 *MCU 型号:STC12C5608AD *开发环境:Keil uVision4 *晶震频率:11.0592MHZ *完成日期:2013-08-07 *程序功能:1.LCD驱动:LCD屏显示0`F *免责声明:1.此程序为TM1621驱动LCD演示程序,仅作参考之用。 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任 ********************************************************************************/ #include //MCU头文件 #include "intrins.h" //包含nop指令头文件 #define uchar unsigned char //数据类型宏定义 #define uint unsigned int //数据类型宏定义 #define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /******************TM1621模块命令定义*********************/ #define SYSDIS 0x00 //关系统振荡器和LCD偏压发生器 #define SYSEN 0x02 //打开系统振荡器 #define LCDOFF 0x04 //关LCD偏压 #define LCDON 0x06 //开LCD偏压 #define TONEON 0x12 //打开声音输出 #define TONEOFF 0x10 //关闭声音输出 #define XTAL 0x28 //外部接晶振 #define RC 0x30 //内部RC振荡 #define BIAS 0x52 //1/3偏压 4公共口 #define WDTDIS 0x0a //禁止看门狗 #define WDTEN 0x0e //开启看门狗 /********************定义控制端口**********************/ sbit CS=P2^1; sbit READ=P2^7; sbit WRITE=P2^0; sbit DATA=P1^7; /********************定义数据*************************/ uchar code Smg[16]={0xeb,0x60,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e}; //0~F字型码 uchar code Tab0[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //清屏 /********************延时函数*************************/ void delay_nms(uint n) { uint i; while(n--) for(i=0;i<500;i++); } /********************从高位写入数据*************************/ void Write_Data_H(uchar Data, uchar Cnt) //Data的高cnt位写入TM1621,高位在前 { uchar i; for(i=0;i<Cnt;i++) { WRITE=0; if(Data&0x80;) //从最高位发送 DATA=1; else DATA=0; nop; nop; WRITE=1; Data<<=1; } WRITE=0; DATA=0; } /********************从低位写入数据*************************/ void Write_Data_L(uchar Data,uchar Cnt) //Data 的低cnt位写入TM1621,低位在前 { unsigned char i; for(i=0;i>=1; } WRITE=0; DATA=0; } /********************写入控制命令*************************/ void WriteCmd(uchar Cmd) { CS=0; nop; Write_Data_H(0x80,4); //写入命令标志100 Write_Data_H(Cmd,8); //写入命令数据 CS=1; nop; } /*********指定地址写入数据,实际写入后4位************/ void WriteOneData(uchar Addr, uchar Data) { CS=0; Write_Data_H(0xa0,3); //写入数据标志101 Write_Data_H(Addr<<2,6); //写入地址数据 Write_Data_L(Data,4); //写入数据 CS=1; nop; } /*********连续写入方式,每次数据为8位,写入数据************/ void WriteAllData(uchar Addr,uchar *p,uchar cnt) { uchar i; CS=0; Write_Data_H(0xa0,3); //写入数据标志101 Write_Data_H(Addr<<2,6); //写入地址数据 for(i=0;i<cnt;i++) //写入数据 { Write_Data_L(*p,8); p++; } CS=1; nop; } /*******************TM1621初始化**********************/ void TM1621_init() { CS=1; WRITE=1; DATA=1; nop; delay_nms(1); WriteCmd(BIAS); //1/3偏压 4公共口 WriteCmd(RC); //内部RC振荡 WriteCmd(SYSDIS); //关系统振荡器和LCD偏压发生器 WriteCmd(WDTDIS); //禁止看门狗 WriteCmd(SYSEN); //打开系统振荡器 WriteCmd(LCDON); //开LCD偏压 } void main() { TM1621_init(); //开机初始化 delay_nms(1); WriteAllData(0,Tab0,16); //LCD不显示 while(1) { WriteAllData(0,Smg,16); //LCD显示0~F delay_nms(200); WriteAllData(0,Tab0,16); //LCD不显示 delay_nms(200); } }
TM1621是一款常用于驱动LED数码管和液晶显示屏的芯片。它可以通过I2C总线进行通信,支持多种显示模式,如静态显示、动态显示、闪烁等。以下是一个简单的TM1621驱动程序示例: ```c #include <Wire.h> // 引入Wire库 #define TM1621_CLK 2 // CLK引脚连接到Arduino的2号口 #define TM1621_DIO 3 // DIO引脚连接到Arduino的3号口 void setup() { Wire.begin(); // 初始化Wire库 tm1621_init(); // 初始化TM1621 } void loop() { tm1621_display(1234); // 在数码管上显示1234 delay(1000); // 延时1秒 } void tm1621_init() { Wire.beginTransmission(0x24); // 发送开始信号到TM1621 Wire.write(0x88); // 发送初始化命令 Wire.endTransmission(); // 发送停止信号 } void tm1621_display(int num) { byte buf[4] = {0}; // 数字缓存区 buf[0] = num % 10; // 个位数 buf[1] = num / 10 % 10; // 十位数 buf[2] = num / 100 % 10; // 百位数 buf[3] = num / 1000 % 10; // 千位数 Wire.beginTransmission(0x24); // 发送开始信号到TM1621 Wire.write(0x40); // 发送数据命令 for (int i = 0; i < 4; i++) { Wire.write(i * 2, tm1621_encode(buf[i])); // 将数字转换为TM1621可识别的编码并发送到TM1621 } Wire.endTransmission(); // 发送停止信号 } byte tm1621_encode(byte num) { byte code = 0; // 编码 switch (num) { case 0: code = 0b00111111; break; case 1: code = 0b00000110; break; case 2: code = 0b01011011; break; case 3: code = 0b01001111; break; case 4: code = 0b01100110; break; case 5: code = 0b01101101; break; case 6: code = 0b01111101; break; case 7: code = 0b00000111; break; case 8: code = 0b01111111; break; case 9: code = 0b01101111; break; } return code; } ``` 上述代码可以在Arduino开发板上使用,需要将TM1621的CLK引脚连接到Arduino的2号口,DIO引脚连接到Arduino的3号口。其中,`tm1621_init()`函数用于初始化TM1621,`tm1621_display()`函数用于在数码管上显示数字,`tm1621_encode()`函数用于将数字转换为TM1621可识别的编码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值