📄 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 + -