?? 7290.c
字號:
/********************************************************************
//注意:
//1假設時鐘頻率為8MHz,指令周期為1/8us
********************************************************************/
#include <msp430x16x.h>
#include "7290.h"
//#include"timedelay1.h"
/*狀態標志,全局變量*/
static uchar ack; //應答標志位,字符型
/*******************************************************************
延時函數
功能:延時>5us
********************************************************************/
void Delay5_I2C(void)
{
uchar i;
for(i=0;i< 25;i++); //for(i=0;i< 25;i++);
}
/*******************************************************************
功能:延時>2us
********************************************************************/
void Delay2_I2C(void)
{
uchar i;
for(i=0;i< 10;i++); //for(i=0;i< 10;i++);
}
/*************************************************************************
*************************************************************************/
void delayMS(unsigned char i)
{
unsigned char j,k;
for(k=0;k<i;k++)
for(j=0;j<60;j++);
}
/******************************************************************
起動總線函數
函數原型: void Start_I2c();
功能:啟動I2C總線,即發送I2C起始條件.
********************************************************************/
void Start_I2c(void)
{
SDA_OUT; //端口方向設置
SCL_OUT;
SDA_HIGH; //發送起始條件的數據信號
Delay2_I2C();
SCL_HIGH;
Delay5_I2C(); //起始條件建立時間大于4.7us,延時
SDA_LOW; //發送起始信號
Delay5_I2C();
SCL_LOW; //鉗住I2C總線,準備發送或接收數據
Delay2_I2C();
}
/*******************************************************************
結束總線函數
函數原型: void Stop_I2c();
功能: 結束I2C總線,即發送I2C結束條件.
********************************************************************/
void Stop_I2c(void)
{
SDA_OUT; //端口方向設置
SCL_OUT;
SCL_LOW; /*** ***/
Delay2_I2C();
SDA_LOW; //發送結束條件的數據信號
Delay2_I2C(); //發送結束條件的時鐘信號
SCL_HIGH; //結束條件建立時間大于4μs
Delay5_I2C();
SDA_HIGH; //發送I2C總線結束信號
Delay5_I2C();
}
/*******************************************************************
字節數據傳送函數
函數原型: void SendByte_I2c(uchar c);
功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
此狀態位進行操作.(不應答或非應答都使ack=0 假)
ack=1 表示發送數據正常;
ack=0 表示被控器無應答或損壞。
********************************************************************/
void SendByte_I2c(uchar c)
{
uchar BitCnt;
SDA_OUT; //端口方向設置
SCL_OUT;
for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數據長度為8位
{
if((c<<BitCnt)&0x80) SDA_HIGH; //判斷發送位
else SDA_LOW;
Delay2_I2C();
SCL_HIGH; //置時鐘線為高,通知被控器開始接收數據位
Delay5_I2C();
SCL_LOW;
}
Delay2_I2C();
SDA_HIGH; //8位發送完后釋放數據線,準備接收應答位
Delay2_I2C();
SCL_HIGH;
SDA_IN; //改變SDA方向為輸入
Delay2_I2C();
if(RSDA) ack=0;
else ack=1; //判斷是否接收到應答信號
SCL_LOW;
Delay2_I2C();
}
/*******************************************************************
字節數據傳送函數
函數原型: uchar RcvByte_I2c();
功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
發完后請用應答函數。
********************************************************************/
uchar RcvByte_I2c(void)
{
uchar retc;
uchar BitCnt;
retc=0;
SDA_OUT; //端口方向設置
SCL_OUT;
SDA_HIGH; //釋放數據線,等待輸入
SDA_IN; //引腳輸入
for(BitCnt=0;BitCnt<8;BitCnt++)
{
Delay2_I2C();
SCL_LOW; //置時鐘線為低,準備接收數據位
Delay5_I2C(); //>4.7us延時等待發送方的數據就緒
SCL_HIGH; //置時鐘線為高使數據線上數據有效
Delay5_I2C();
retc=retc<<1;
if(RSDA) retc=retc+1; //讀數據位,接收的數據位放入retc中
Delay2_I2C();
}
SCL_LOW;
Delay2_I2C();
return(retc);
}
/********************************************************************
應答子函數
原型: void Ack_I2c(uchar a);
功能:主控器進行應答信號,(可以是應答或非應答信號)
********************************************************************/
void Ack_I2c(uchar a)
{
SDA_OUT; //端口方向設置
SCL_OUT;
if(a==0) SDA_LOW; //在此發出應答或非應答信號
else SDA_HIGH;
Delay5_I2C();
SCL_HIGH;
Delay5_I2C();
SCL_LOW; //清時鐘線,鉗住I2C總線以便繼續接收
Delay2_I2C();
}
/*******************************************************************
向無子地址器件發送字節數據函數
函數原型: uchar ISendByte_I2c(uchar sla,ucahr c);
功能: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla.
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束總線。
********************************************************************/
uchar ISendByte_I2c(uchar sla,uchar c)
{
Start_I2c(); //啟動總線
SendByte_I2c(sla); //發送器件地址
if(ack==0)return(0);
SendByte_I2c(c); //發送數據
if(ack==0)return(0);
Stop_I2c(); //結束總線
return(1);
}
/*******************************************************************
向無子地址器件讀字節數據函數
函數原型:uchar IRcvByte_I2c(uchar sla,uchar *c);
功能: 從啟動總線到發送地址,讀數據,結束總線的全過程,從器件地
址sla,返回值在c.
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束總線。
********************************************************************/
uchar IRcvByte_I2c(uchar sla,uchar *c)
{
Start_I2c(); /*啟動總線*/
SendByte_I2c(sla+1); /*發送器件地址*/
if(ack==0)return(0);
*c=RcvByte_I2c(); /*讀取數據*/
Ack_I2c(1); /*發送非就答位*/
Stop_I2c(); /*結束總線*/
return(1);
}
/*********************************************************************************************************
** 函數名稱: ZLG7290_SendData
** 功能描述: 發送數據
** 輸 入:SubAdd : 輸入數據
** DATA : 輸入值
**
** 輸 出: 0 : Fail
** 1 : OK
** 全局變量: 無
** 調用模塊: delayMS
********************************************************************************************************/
unsigned char ZLG7290_SendData(unsigned char SubAdd,unsigned char Data)
{
if(SubAdd>0x17)
return 0;
ISendStr(zlg7290,SubAdd,&Data,1);
delayMS(10);
return 1;
}
/*********************************************************************************************************
** 函數名稱: ZLG7290_SendCmd
** 功能描述: 發送命令(對子地址7、8)
** 輸 入:DATA1 : 命令1
** DATA2 : 命令2
**
** 輸 出: 0 : Fail
** 1 : OK
** 全局變量: 無
** 調用模塊: ISendStr、delayMS
**
********************************************************************************************************/
unsigned char ZLG7290_SendCmd(unsigned char Data1,unsigned char Data2)
{
unsigned char Data[2];
Data[0]=Data1;
Data[1]=Data2;
ISendStr(zlg7290,0x07,Data,2);
delayMS(10);
return 1;
}
/*********************************************************************************************************
** 函數名稱: ZLG7290_SendBuf
** 功能描述: 向顯示緩沖區發送數據
** 輸 入: * disp_buf : 要發送數據的起始地址
** num : 發送個數
**
** 輸 出: 無
** 全局變量: 無
** 調用模塊: ZLG7290_SendCmd
**
********************************************************************************************************/
void ZLG7290_SendBuf(unsigned char * disp_buf,unsigned char num)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -