/*****************************************************************************
*版权信息:芯佳智能科技有限公司[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);
}
}