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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值