久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
MSP430單片機+BS8112A-3程序源碼
[打印本頁]
作者:
zqt8585
時間:
2019-10-14 08:22
標(biāo)題:
MSP430單片機+BS8112A-3程序源碼
采用仿II2C通訊,該芯片II2C通訊略有區(qū)別,已調(diào)試通過,僅供參考
單片機源程序如下:
//==============================================================================
//本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
// 文 件 名 : keyboard.c
// 版 本 號 :
// 作 者 :
// 生成日期 :
// 最近修改 :
// 功能描述 : FPC觸摸按鍵 IIC 接口例程(MSP430F149系列)
// 驅(qū)動IC : BS8112A-3
// 說明: 硬件說明
// ----------------------------------------------------------------
// GND 電源地
// VCC 接3.3v電源
// SCL IIC時鐘信號線
// SDA IIC數(shù)據(jù)線
// IRQ 中斷請求
// ----------------------------------------------------------------
// 說明:軟件說明-IIC時序
// -------------------------------------------------------------------
// 1,該芯片IIC驅(qū)動時序有點特殊,該芯片是不回ACK的,需要主設(shè)備發(fā)出,實際主設(shè)備發(fā)9位,見使用手冊7位地址+1位讀寫位+1位ACK
// 2, 主機發(fā)完后,需要等待從設(shè)備處理完成,根據(jù)實際需求在發(fā)送ACK時增加幾個延時也可以,本代碼沒加,從波形看也沒問題
// ------------------------------------------------------------------
// 修改歷史 :
// 日 期 :
// 修改內(nèi)容 : 創(chuàng)建文件
//==================================================================================
#include <msp430F249.h>
#include "Keyboard.h"
#include "timer.h"
#define Key_BS8112_IIC
#define BS8112_DELAY {delay_us(10);}
//==============================================================
// Function Name: void BS8112_IO_Init(void)
// Parameters: none
// Return value: none
// Description: this function is used to generate IIC start signal
// Tips:IIC數(shù)據(jù)有效性,在時鐘高電平周期內(nèi),數(shù)據(jù)必須保持穩(wěn)定
// GND 電源地
// VCC 接3.3v電源
// SCL P16(時鐘)
// SDA P15(數(shù)據(jù))
// IRQ P17 中斷請求
//============================================================
void BS8112_IO_Init(void)
{
P1DIR |= BS8112_SCL+BS8112_SDA; //1輸出,0輸入
P1OUT &= ~(BS8112_SCL+BS8112_SDA); //初始化為輸出值為0
P1DIR &=~BS8112_IRQ; //0輸入
}
//==============================================================
// Function Name: void I2CStart(void)
// Parameters: none
// Return value: none
// Description: this function is used to generate IIC start signal
// Tips:IIC數(shù)據(jù)有效性,在時鐘高電平周期內(nèi),數(shù)據(jù)必須保持穩(wěn)定
// 數(shù)據(jù)線信號僅在時鐘電平為低時改變
// iic的起始:在SCL為高時,SDA由高變低,為起始條件
// 時序 CLK 0 delay 1 delay 0 為一個周期,在高電平時數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時可以改變數(shù)據(jù)值
//============================================================
void BS8112_I2CStart(void)
{
BS8112_I2C_SDA_OUT();
BS8112_I2C_SDA_HIGH; // SDA=1
BS8112_I2C_SCL_HIGH; // SCL=1
BS8112_DELAY; //delay
BS8112_I2C_SDA_LOW; //SDA= 0
BS8112_DELAY; //delay
BS8112_I2C_SCL_LOW; // SCL=0
BS8112_DELAY; //delay
}
//==============================================================
// Function Name: void I2CStop(void)
// Parameters: none
// Return value: none
// Description: this function is used to generate IIC stop signal
// Tips:SCL為高時,SDA由低變高跳變,為終止條件
// 時序 CLK 0 delay 1 delay 0 為一個周期,在高電平時數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時可以改變數(shù)據(jù)值
//============================================================
void BS8112_I2CStop(void)
{
BS8112_I2C_SDA_LOW; // SDA=0
BS8112_I2C_SCL_HIGH; // SCL=1
BS8112_DELAY;//delay
BS8112_I2C_SDA_HIGH; // SDA=1
BS8112_DELAY;//delay
}
//==============================================================
// Function Name: void BS8112_I2CAck(void)
// Parameters: none
// Return value: none
// Description: this function is used to generate IIC ACK signal
// Tips:不管主機還是從機,接收到數(shù)據(jù)后(數(shù)據(jù)或地址),都有回應(yīng)一個ACK 信號
// 成功接收回應(yīng)0
// 時序 CLK 0 delay 1 delay 0 為一個周期,在高電平時數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時可以改變數(shù)據(jù)值
//============================================================
void BS8112_I2CAck(void)
{
BS8112_I2C_SCL_LOW; // SCL=0
BS8112_I2C_SDA_LOW; // SDA=0
BS8112_DELAY; //delay
BS8112_I2C_SCL_HIGH; // SCL=1
BS8112_DELAY; //delay
BS8112_I2C_SCL_LOW; // SCL=0
}
//==============================================================
// Function Name: void BS8112_IIC_NAck(void)
// Parameters: none
// Return value: none
// Description: this function is used to generate IIC ACK signal
// Tips:不管主機還是從機,接收到數(shù)據(jù)后(數(shù)據(jù)或地址),都有回應(yīng)一個ACK 信號
// 接收不成功回應(yīng)1
// 時序 CLK 0 delay 1 delay 0 為一個周期,在高電平時數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時可以改變數(shù)據(jù)值
//============================================================
void BS8112_I2CNoAck(void)
{
BS8112_I2C_SCL_LOW; // SCL=0, 此句可以不要,因為本身就是0,寫上是為了更明確IIC通訊
BS8112_I2C_SDA_HIGH; // SDA=1
BS8112_DELAY; //delay
BS8112_I2C_SCL_HIGH; // SCL=1
BS8112_DELAY; //delay
BS8112_I2C_SCL_LOW; // SCL=0
}
//==============================================================
// Function Name:unsigned char BS8112_I2CRcvAck(void)
// Parameters: none
// Return value: none
// Description: this function is used to wait ACK signal
// Tips: 1: indicate receive failure if the ACK signal is 1
// 0: indicate receive success if the ACK signal is 0
// 時序 CLK 0 delay 1 delay 0 為一個周期,在高電平時數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時可以改變數(shù)據(jù)值
//============================================================
unsigned char BS8112_I2CRcvAck(void)
{
unsigned int delay=0;
BS8112_I2C_SDA_IN();
BS8112_I2C_SCL_LOW; //SCL=0
BS8112_I2C_SDA_HIGH; //SDA
BS8112_DELAY; //delay
BS8112_I2C_SCL_HIGH; //SCL=1
BS8112_DELAY; //delay
while(BS8112_I2C_SDA_GET())
{
delay++;
if(delay>500)
{
BS8112_I2C_SDA_OUT();
BS8112_I2CStop();
return 1;
}
}
BS8112_I2C_SCL_LOW; //SCL=0
BS8112_I2C_SDA_OUT();
return 0;
}
//==============================================================
// Function Name: void BS8112_IIC_Send_Byte(u8 txd)
// Parameters: none
// Return value: none
// Description: this function is used to send a byte
// Tips:
// 時序 CLK 0 delay 1 delay 0 為一個周期,在高電平時數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時可以改變數(shù)據(jù)值
//============================================================
void BS8112_I2CSendByte(unsigned char data)
{
unsigned char i;
for(i=0; i<8; i++)
{
BS8112_I2C_SCL_LOW; //SCL=0
if(data&0x80)
{
BS8112_I2C_SDA_HIGH; //SDA
}
else
{
BS8112_I2C_SDA_LOW; //SDA
}
BS8112_DELAY; //delay
BS8112_I2C_SCL_HIGH; //SCL=1
BS8112_DELAY; //delay
data <<= 1;
}
}
//==============================================================
// Function Name:unsigned char BS8112_I2CReceiveByte(void)
// Parameters:
// Return value: none
// Description: this function is used to receive a byte
// Tips:
// 時序 CLK 0 delay 1 delay 0 為一個周期,在高電平時數(shù)據(jù)有效必須穩(wěn)定,只能在低電平時可以改變數(shù)據(jù)值
//============================================================
unsigned char BS8112_I2CReceiveByte(void)
{
unsigned char re_data;
int i;
re_data = 0;
BS8112_I2C_SDA_IN(); //設(shè)置輸入
BS8112_DELAY; //delay
for(i=0; i<8; i++)
{
re_data <<= 1;
BS8112_I2C_SCL_LOW; //SCL=0
BS8112_DELAY; //delay
BS8112_I2C_SCL_HIGH; //SCL=1
BS8112_DELAY; //delay
if(BS8112_I2C_SDA_GET())
re_data |= 0x01;
}
BS8112_I2C_SCL_LOW;
BS8112_I2C_SDA_OUT(); //接收完置成輸出
return re_data;
}
#define BS8112_DRIVERS
//==============================================================
// Function Name:void BS8112_I2CReceiveByte(unsigned char temp)
// Parameters: none
// Return value: none
// Description: this function is used to receive a byte
// Tips:
//============================================================
unsigned char BS8112_GetSlaveState(void)
{
unsigned int delay=0;
BS8112_I2C_SCL_IN(); //設(shè)置時鐘信號線輸入
while(!BS8112_I2C_SCL_GET()) //等待時鐘信號被從設(shè)備拉高,繼續(xù)發(fā)送數(shù)據(jù)
{
delay++;
if(delay>5000)
{
BS8112_I2CStop();
BS8112_I2C_SCL_OUT();
return 0;//忙
}
}
BS8112_I2C_SCL_OUT();
return 1;//空閑
}
//==============================================================
// Function Name:unsigned char BS8112_ReadData(unsigned char addr)
// Parameters: addr:要讀取的狀態(tài)寄存器或控制寄存器的地址
// 0x08: 讀取狀態(tài)寄存器0的數(shù)據(jù),包含按鍵1-按鍵8的按鍵的狀態(tài)
// 0x09: 讀取狀態(tài)寄存器1的數(shù)據(jù),包含按鍵9-按鍵16的按鍵的狀態(tài)
// 0xB0:
// 0XB1:
// ....
// 0XC0:
// Return value: none
// Description: this function is used to get the sate of the REG
// Tips:
// 1,該函數(shù)讀取觸摸按鍵的狀態(tài)數(shù)據(jù)寄存器, 0 表示沒有觸摸,1表示有觸摸
// 2,地址,根據(jù)數(shù)據(jù)手冊,給的7位的地址0XA0,實際應(yīng)該是高7位,故要左移一位
//============================================================
unsigned char BS8112_ReadData(unsigned char addr)
{
unsigned char value=0;
BS8112_I2CStart(); //IIC啟動
BS8112_I2CSendByte(0xA0); //地址+寫
BS8112_I2CAck(); //發(fā)送第9位ACK位,同時增加幾個延時,等待從設(shè)備處理數(shù)據(jù)
BS8112_I2CSendByte(addr); //發(fā)送寄存器地址
BS8112_I2CAck(); //發(fā)送第9位ACK位,同時增加幾個延時,等待從設(shè)備處理數(shù)據(jù)
BS8112_I2CStart(); //IIC啟動
BS8112_I2CSendByte(0xA1); //地址+讀
BS8112_I2CAck(); //發(fā)送第9位ACK位,同時增加幾個延時,等待從設(shè)備處理數(shù)據(jù)
value=BS8112_I2CReceiveByte();
BS8112_I2CNoAck(); //發(fā)送第9位ACK位,同時增加幾個延時,等待從設(shè)備處理數(shù)據(jù)
BS8112_I2CStop();
return value;
}
#define BS8112_APP
//==============================================================
// Function Name:unsigned char BS8112_Init(void)
// Parameters: none
// Return value: none
// Description: this function is used to inite the BS8112
// Tips:
// 初始化相關(guān)寄存器,共17個寄存器
// 寫寄存器通訊結(jié)構(gòu)如下:
// start + slave address +0xB0 + DATA1 +DATA2 + ......+DATA17 +CheckSum
//============================================================
unsigned char BS8112_Init(void)
{
unsigned char data[18]={0x00,0x00,0x83,0xF3,0x98,
//K1, K2, K3, K4, K5,
LOFS,LOFS-2,LOFS-4,LOFS-2,LOFS,
//K6, K7, K8, K9, K10, K11, K12, 校驗和
LOFS,LOFS-2,LOFS-4,LOFS-2,LOFS, 63,LOFS|0x40,0x00};
unsigned char i;
unsigned int sum=0;
BS8112_IO_Init();
BS8112_I2CStart(); //IIC啟動
BS8112_I2CSendByte(0xA0); //地址+寫
BS8112_I2CAck(); //發(fā)送第9位ACK位,同時增加幾個延時,等待從設(shè)備處理數(shù)據(jù)
BS8112_I2CSendByte(0xB0); //發(fā)送寄存器地址
BS8112_I2CAck(); //發(fā)送第9位ACK位,同時增加幾個延時,等待從設(shè)備處理數(shù)據(jù)
for(i=0;i<17;i++)
{
sum+=data[i];
BS8112_I2CSendByte(data[i]); //發(fā)送數(shù)8位數(shù)據(jù)
BS8112_I2CAck(); //發(fā)送第9位ACK位,同時增加幾個延時,等待從設(shè)備處理數(shù)據(jù)
}
BS8112_I2CSendByte((unsigned char)sum); //發(fā)送校驗和
BS8112_I2CAck(); //發(fā)送第9位ACK位,同時增加幾個延時,等待從設(shè)備處理數(shù)據(jù)
BS8112_I2CStop();
return 1;
}
//==============================================================
// Function Name:unsigned char BS8112_GetKeyStateReg(unsigned char dat)
// Parameters: dat:要讀取的狀態(tài)數(shù)據(jù)的寄存器地址
//
// Return value: none
// Description: this function is used to get the sate of the REG
// Tips:
// 1,該函數(shù)讀取觸摸按鍵的狀態(tài)數(shù)據(jù)寄存器, 0 表示沒有觸摸,1表示有觸摸
// 0x08: 讀取狀態(tài)寄存器0的數(shù)據(jù),包含按鍵1-按鍵8的按鍵的狀態(tài)
// 0x09: 讀取狀態(tài)寄存器1的數(shù)據(jù),包含按鍵9-按鍵16的按鍵的狀態(tài)
//============================================================
unsigned int BS8112_GetKeyValue(void)
{
unsigned int KeyStatus=0;
unsigned int Key_Val_H=0;
unsigned int Key_Val_L=0;
Key_Val_L = BS8112_ReadData(0x08); //按鍵1-8的狀態(tài)信息
BS8112_DELAY;
BS8112_DELAY;
Key_Val_H = BS8112_ReadData(0x09); //按鍵9-16的狀態(tài)信息
KeyStatus = (Key_Val_H<<8) | Key_Val_L;
return KeyStatus;
}
//==============================================================
// Function Name:unsigned char BS8112_DetectKey(void)
// Parameters:
// Return value: none
// Description: this function is used to get the sate of the REG
// Tips:
// 檢測是否有按鍵按下,正常情況下該腳是NMOS上拉輸出高,當(dāng)有按鍵時輸出低電平
//============================================================
unsigned char BS8112_DetectKey(void)
{
if(!BS8112_DETEC_OUT())//當(dāng)被拉低時,有按鍵
{
return 1; //表示檢測到按鍵
}
return 0; //表示沒有檢測到按鍵
}
//========================================================================================
復(fù)制代碼
0.png
(5.48 KB, 下載次數(shù): 77)
下載附件
2019-10-14 15:35 上傳
所有資料51hei提供下載:
bs8112a-3.zip
(4.06 KB, 下載次數(shù): 71)
2019-10-14 08:20 上傳
點擊文件名下載附件
bs8112a-3
下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
在线视频一区二区
|
久久精品欧美一区二区三区不卡
|
一本色道精品久久一区二区三区
|
国产欧美精品区一区二区三区
|
国产在线观看一区二区三区
|
97成人精品
|
日韩久久久久久久
|
日韩激情免费
|
亚洲aⅴ精品
|
欧美美女爱爱视频
|
欧美成人一区二区三区片免费
|
欧美亚洲成人网
|
精品一区在线
|
日韩视频精品在线
|
99久久婷婷国产综合精品电影
|
麻豆一区二区三区
|
国产精品区二区三区日本
|
欧美一级免费黄色片
|
欧美一区免费
|
在线视频99
|
日韩精品一区二区三区久久
|
免费看片国产
|
欧美一级免费看
|
成人在线网址
|
成人av免费播放
|
日本二区
|
成人在线免费视频
|
国产在线精品一区二区
|
黄色片视频网站
|
日韩一二区
|
www.久久久.com
|
在线不卡
|
中文字幕一区在线观看视频
|
可以免费观看的av片
|
最新伦理片
|
日本一区二区高清不卡
|
一区二区三区视频在线观看
|
成年人在线观看视频
|
亚洲视频一区二区三区
|
亚洲 欧美 日韩在线
|
欧美日韩黄色一级片
|