?? wtc6506d32接口程序范例.txt
字號:
8051與WTC6506D32接口的典型操作程序
/*
項目描述:
觸摸與LED顯示一體化的控制芯片WTC6506 4*8LED的DEMO板配套程序
DEMO板功能:
檢測觸摸芯片輸出的信息,并向觸摸芯片的顯示緩沖區寫入數據完成相應的顯示
MCU: AT89C51
晶振頻率: 12MHz
版本信息: V1.0
*/
#include <reg51.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define TIMER1_H 0xFC //1ms定時器初值
#define TIMER1_L 0x17
//--------------------------------主機和觸摸芯片的接口---------------------------------------------
sbit SDA = P1^1; //數據線
sbit SCLK = P1^0; //時鐘信號
//------------------------------------the funtion define-------------------------------------
void init(void); //89C51的初始化程序
void delay_24us(void); //延時程序(延時24us)
uchar read_key_data(void); //讀觸摸按鍵信息
void write_disp_buff(uchar ComDa,uchar SegDa);//向觸摸芯片的顯示緩沖區寫入數據
void disp_key_led(uchar KeyValue);
//------------------------------------the register define -----------------------------------
uchar i,j; //程序中使用的中間變量
uint Counter1ms; //timer1 每1ms中斷一次對Counter1ms加1
uchar KeyValue; //從觸摸芯片讀取的按鍵信息
//顯示緩沖區
uchar Com0DispData; //需要COM0 顯示的數據
uchar Com1DispData; //需要COM1 顯示的數據
uchar Com2DispData; //需要COM2 顯示的數據
uchar Com3DispData; //需要COM3 顯示的數據
//------------------------------------------------------------------------------------------
// 主程序
//------------------------------------------------------------------------------------------
void main(void)
{
init();
Counter1ms = 0;
do
{
} while(Counter1ms <= 100); //等待觸摸芯片完成復位
Com0DispData = 0xff; //關閉COM0的所有顯示
Com1DispData = 0xff; //關閉COM1的所有顯示
Com2DispData = 0xff; //關閉COM2的所有顯示
Com3DispData = 0xff; //關閉COM3的所有顯示
write_disp_buff(0,Com0DispData); //
write_disp_buff(1,Com1DispData); //
write_disp_buff(2,Com2DispData); //
write_disp_buff(3,Com3DispData); //
while(1)
{
while(Counter1ms >= 15) //每15ms讀一次鍵值,并完成顯示
{
Counter1ms = 0; //15ms計數器歸零
KeyValue = read_key_data(); //讀觸摸按鍵的按鍵信息
disp_key_led(KeyValue); //操作觸摸芯片顯示相應的LED
}
}
}
//------------------------------------------------------------------------------------------
//功能:向觸摸芯片的顯示緩沖區寫入要顯示的內容
//入口:1:ComDa 要寫入的緩沖區地址
// 2: SegDa 要寫入的緩沖區數據
//返值:無
//------------------------------------------------------------------------------------------
void write_disp_buff(uchar ComDa,uchar SegDa)
{
TR1 =0;
i = 0;
//-----------------------//發送SDA總線寫數據的起始位----------
SDA =0; //起始位置0,表示要向觸摸芯片的顯示緩沖區寫入數據
SCLK = 0; //產生串行時鐘的下降延信號
delay_24us();
SCLK = 1; //產生串行時鐘的上升延信號
delay_24us();
//----------------------選擇觸摸芯片的顯示緩沖區 COM口地址--------
i = 0;
do
{
if((ComDa & 0x01) == 0) {SDA = 0;} //準備設置緩沖區地址
else {SDA = 1;}
SCLK = 0; //產生串行時鐘的下降延信號
delay_24us();
SCLK = 1; //產生串行時鐘的上升延信號
delay_24us();
ComDa >>= 1;
i++;
}
while(i <2); //設置兩位緩沖區地址
//----------------------向觸摸芯片的顯示緩沖區的暫存buff寫入數據 SEG-------
i = 0;
do
{
if((SegDa & 0x01) == 0) {SDA = 0;} //準備寫入SEG的數據
else {SDA = 1;}
SCLK = 0; //產生串行時鐘的下降延信號
delay_24us();
SCLK = 1; //產生串行時鐘的上升延信號
delay_24us();
SegDa >>= 1;
i++;
}
while(i <8); //寫入8位數據
//-------------產生結束脈沖,將串入暫存buff的內容送入顯示緩沖區開始顯示寫入的數據
SDA = 1; //將SDA置為輸入狀態
SCLK = 0; //產生串行時鐘的下降延信號
delay_24us();
SCLK = 1; //產生串行時鐘的上升延信號
delay_24us();
TR1 =1;
}
//------------------------------------------------------------------------------------------
//功能:從觸摸芯片讀取觸摸按鍵的信息
//入口:無
//返值:從觸摸芯片讀取觸摸按鍵的信息
//------------------------------------------------------------------------------------------
uchar read_key_data(void)
{
uchar KeyValue;
TR1 =0;
i = 0;
//-----------------------//發送SDA總線讀數據的起始位----------
SDA =1; //SDA設置為輸入狀態,上拉電阻將SDA拉高置1,表示要從觸摸芯片//讀出觸摸按鍵的按鍵信息
SCLK = 0; //產生串行時鐘的下降延信號
delay_24us();
SCLK = 1; //產生串行時鐘的上升延信號
delay_24us();
do
{
KeyValue >>= 1;
SCLK = 0; //產生串行時鐘的下降延信號
delay_24us();
if(SDA == 1) //讀取SDA上的數據
{
KeyValue |= 0x80;
}
else
{
KeyValue &= 0x7F;
}
SCLK = 1; //產生串行時鐘的上升延信號
delay_24us();
i++;
}
while(i < 8); //讀8bit數據
//-----------------------//發送SDA總線恢復時鐘脈沖
SCLK = 0; //產生串行時鐘的下降延信號
delay_24us();
SCLK = 1; //產生串行時鐘的上升延信號
delay_24us();
TR1 =1;
return(KeyValue); //返回讀取的觸摸按鍵信息
}
//------------------------------------------------------------------------------------------
//功能:手指觸摸按鍵時點亮被觸摸按鍵上方的指示LED,手指從觸摸按鍵上移開后熄滅相應按鍵上方的指示LED
//入口:從觸摸芯片讀取到的按鍵信息
//返值:無
//------------------------------------------------------------------------------------------
void disp_key_led(uchar KeyValue)
{
if((KeyValue & 0x01) != 0){Com0DispData &= 0xfe;} //KEY0被按下用低電平點 //亮相應的LED
else {Com0DispData |= 0x01;} //KEY0彈起
if((KeyValue & 0x02) != 0){Com0DispData &= 0xfd;} //KEY1被按下
else {Com0DispData |= 0x02;} //KEY1彈起
if((KeyValue & 0x04) != 0){Com0DispData &= 0xfb;} //KEY2被按下
else {Com0DispData |= 0x04;} //KEY2彈起
if((KeyValue & 0x08) != 0){Com0DispData &= 0xf7;} //KEY3被按下
else {Com0DispData |= 0x08;} //KEY3彈起
if((KeyValue & 0x10) != 0){Com0DispData &= 0xef;} //KEY4被按下
else {Com0DispData |= 0x10;} //KEY4彈起
if((KeyValue & 0x20) != 0){Com0DispData &= 0xdf;} //KEY5被按下
else {Com0DispData |= 0x20;} //KEY5彈起
write_disp_buff(0,Com0DispData); //指示LED用COM0顯示
}
//------------------------------------------------------------------------------------------
void init(void)
{
EA = 1; //open the gloabe interrupt enable
EX0 = 0; //disable expend 0 interrupt
EX1=1; //enable expend 1 interrupt for remote
ET0 = 1;
ET1 = 1;
ES = 0;
//IT0 = 0; //level tigger
//IT1 = 0; //level tigger
IT0 = 1; //edge tigger
IT1 = 1; //edge tigger
//TMOD &= 0xF0;
TMOD = 0x11; //timer0, timer1 work as 16 bit timer
TH0 = 0x00;
TL0 = 0x00;
TH1 = TIMER1_H;
TL1 = TIMER1_L;
TR0 = 0;
TR1 = 1; //timer1 start work
}
//------------------------------------------------------------------------------------------
void delay_24us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//------------------------------------------------------------------------------------------
void timer1(void) interrupt 3 using 0 //8051 的timer1中斷服務程序
{
TH1 = 0xFC; //1ms定時器重新設置初值
TL1 = 0x17;
TR1 = 1;
Counter1ms++; //1ms計數器加一
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -