TM1648A驱动程序

/*****************************************************************************
 *版权信息:芯佳智能科技有限公司[xjzn.cn]
 *文 件 名:TM1648A
 *当前版本:V1.0
 *MCU 型号:IRC15W107
 *开发环境:Keil uVision4
 *晶震频率:24MHZ       
 *完成日期:21
 *程序功能:1.数码管驱动
            2.触摸按键功能: 包含触摸按键读程序驱动函数。          
 *免责声明:1.此程序为TM1648A演示程序,仅作参考之用。
            2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任            
********************************************************************************/
#include <reg52.h>                            //头文件
#include "intrins.h"                        //包含_nop_()指令头文件
#define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//

/********************定义控制端口**********************/
sbit SCL=P3^2;                                 //定义SCL    
sbit SDA=P3^3;                                 //定义SDA    

#define    OP_READ    0xA1        // 器件地址以及读取操作
#define    OP_WRITE 0xA0        // 器件地址以及写入操作

void  Touch_Key(void);
unsigned char        Write_Buff[14]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char code Display_code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0xFF,0xFF};

/********************延时函数,延时nms******************/
void delay_nms(unsigned int n)
{
 unsigned int i;
 while(n--)
   for(i=0;i<1200;i++);
}

void delay_us(unsigned char n)  //256
{
n=2*n;
    while (--n)
    {
        _nop_();
                             
    }
}


/********************Start函数*************************/
void I2C_Start()
{
 SDA=1;
 SCL=1;
 delay_us(5);
 SDA=1;
 delay_us(5);
 SDA=0;
 delay_us(5);
 SCL=0;
}

//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
void I2C_REC_ACK(void)
{    
    delay_us(5);
    while(SDA);
    SCL = 1;
    delay_us(5);
    SCL = 0;
    delay_us(10);     //此处必须等待10uS以上
}

void IIC_SEND_NACK(ack)
{
        SCL = 0;
        delay_us(5);    
        SCL = 1;                             //拉高时钟线
        delay_us(5);
        SCL = 0;                             //拉低时钟线     
        delay_us(5);                         //延时
}
/********************Stop函数*************************/
void I2C_Stop()
{
    SCL=0;
    delay_us(5);
    SDA=0;
    delay_us(5);
    SCL=1;
    delay_us(5);
    SDA=1;
    delay_us(5);
}

/***************发送8bit数据,从高位开始**************/
void I2CWritebyte(unsigned char oneByte_data)
{
  unsigned char i,oneByte;
  oneByte=oneByte_data;
  for(i=0;i<8;i++)
  {    
    SCL=0;
    SDA=0;
    if(oneByte&0x80)
   {
      SDA=1;
   }
    else
    {
      SDA=0;
    }
    delay_us(5);
    SCL=1;
    delay_us(5);
    oneByte=oneByte<<1;

  }    
    SCL=0;                                
    SDA=1;                              //释放总线

}

/***************接收8bit数据**************/
unsigned char I2C_RecvByte()
{
  unsigned char i,j,k;
  SCL = 0;  
  SDA = 1;                    //准备读取数据
  delay_us(5);
  for(i = 0;i<8;i++)
  {
    SCL=1;
    delay_us(5);
    if(SDA==1)
    j=1;
    else
    j=0;
    k=(k<<1)|j;
    SCL=0;
    delay_us(5);

  }
  return k;
}

/***************从1648A中读取数据出来**************/
unsigned char Read_1648A(unsigned char Addr)
{
  unsigned char Tounch_data;
  I2C_Start();
  I2CWritebyte(OP_WRITE);    //器件地址, 写
  I2C_REC_ACK();
  I2CWritebyte(Addr);  //
  I2C_REC_ACK();

  I2C_Start();
  I2CWritebyte(OP_READ);    //器件地址, 读
  I2C_REC_ACK();
  Tounch_data = I2C_RecvByte();    
  IIC_SEND_NACK(1);
  I2C_Stop();    
  return Tounch_data;
}

/***************往显存寄存器写数据*************/
void  Write_Sdata(unsigned char Addr,unsigned char *dat_1,unsigned char Num)
{
    unsigned char i;
    I2C_Start();
    I2CWritebyte(OP_WRITE);    //器件地址, 写
    I2C_REC_ACK();
    I2CWritebyte(Addr);  //从机地址
    I2C_REC_ACK();
    for(i = 0; i < Num ; i++)
    {
        I2CWritebyte(*dat_1);    
        I2C_REC_ACK();
         dat_1++;
    }
    I2C_Stop();        
}

/***************写显示控制命令*************/
void  Write_Scmd(unsigned char Addr,unsigned char cmd)
{
    I2C_Start();
    I2CWritebyte(OP_WRITE);    //器件地址, 写
    I2C_REC_ACK();
    I2CWritebyte(Addr);  //从机地址
    I2C_REC_ACK();
    I2CWritebyte(cmd);    
    I2C_REC_ACK();
    I2C_Stop();        
}


void  Touch_Key(void)
{
    unsigned char i,T_Key;
    T_Key =    Read_1648A(0xF0);
    if(T_Key != 0x00)                        
      {
        if(T_Key==0x10)
        {
         for(i=0;i<14;i++)
          {
            Write_Buff[i]= 0xff;
          }
            Write_Scmd(0xBD,0x03);
            delay_nms(1);
            Write_Scmd(0xBE,0x40);
            delay_nms(1);            
            Write_Sdata(0xC0,Write_Buff,14);
            delay_nms(1);
            Write_Scmd(0xBF,0x8D);
            delay_nms(1);
            Write_Scmd(0xCE,0x02);
                        delay_nms(1);
        }
    }
    
}

void main()
{                
    delay_nms(20);
    SCL=1;
    SDA=1;
        
    Write_Scmd(0xBD,0x03);//写显示模式
    delay_nms(1);
    Write_Scmd(0xBE,0x40);//写显存地址
    delay_nms(1);            
    Write_Sdata(0xC0,Display_code,14);//写显存数据
    delay_nms(1);
    Write_Scmd(0xBF,0x8D);//开显示,设置亮度
    delay_nms(1);

       Write_Scmd(0xCE,0x05);
        delay_nms(3);
    while(1)
    {
       Touch_Key();
       delay_nms(30);


    }
}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
下面是一个简单的驱动TM1648A的MicroPython代码示例: ```python # 导入需要的库 from machine import Pin, I2C import time # 定义TM1648A的I2C地址和指令 TM1648A_I2C_ADDR = 0x24 TM1648A_CMD_DATA = 0x40 TM1648A_CMD_CONTROL = 0x80 # 定义TM1648A的控制指令 TM1648A_CTRL_DISPLAY_ON = 0x08 TM1648A_CTRL_DISPLAY_OFF = 0x00 TM1648A_CTRL_BRIGHTNESS = 0x00 # 定义TM1648A的数据缓存 TM1648A_DATA = bytearray(17) # 初始化I2C总线 i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=100000) # 初始化TM1648A def tm1648a_init(): # 发送控制指令,打开显示,设置亮度为最高 i2c.writeto(TM1648A_I2C_ADDR, bytes([TM1648A_CMD_CONTROL | TM1648A_CTRL_DISPLAY_ON | TM1648A_CTRL_BRIGHTNESS])) # 清空数据缓存 TM1648A_DATA[0] = TM1648A_CMD_DATA for i in range(1, 17): TM1648A_DATA[i] = 0x00 # 发送数据,更新显示 i2c.writeto(TM1648A_I2C_ADDR, TM1648A_DATA) # 设置TM1648A的某个LED灯的状态 def tm1648a_set_led(led, state): # 计算LED灯所在的字节和位 byte = led // 8 + 1 bit = 1 << (led % 8) # 修改数据缓存中对应的位 if state: TM1648A_DATA[byte] |= bit else: TM1648A_DATA[byte] &= ~bit # 发送数据,更新显示 i2c.writeto(TM1648A_I2C_ADDR, TM1648A_DATA) # 设置TM1648A的所有LED灯的状态 def tm1648a_set_leds(leds): # 修改数据缓存 for i in range(16): byte = i // 8 + 1 bit = 1 << (i % 8) if leds[i]: TM1648A_DATA[byte] |= bit else: TM1648A_DATA[byte] &= ~bit # 发送数据,更新显示 i2c.writeto(TM1648A_I2C_ADDR, TM1648A_DATA) # 清空TM1648A的所有LED灯 def tm1648a_clear(): # 修改数据缓存 for i in range(16): byte = i // 8 + 1 bit = 1 << (i % 8) TM1648A_DATA[byte] &= ~bit # 发送数据,更新显示 i2c.writeto(TM1648A_I2C_ADDR, TM1648A_DATA) # 测试程序 tm1648a_init() while True: for i in range(16): tm1648a_set_led(i, True) time.sleep(0.1) for i in range(16): tm1648a_set_led(i, False) time.sleep(0.1) ``` 这个例程定义了一些常量,包括TM1648A的I2C地址和指令,以及控制指令和数据缓存。然后定义了一些函数,包括初始化函数、设置单个LED灯状态的函数、设置多个LED灯状态的函数、清空所有LED灯的函数。最后是一个测试程序,循环点亮和熄灭所有LED灯。请注意,这个例程仅供参考,具体实现还需要根据硬件接口和具体应用场景进行调整。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值