C语言版ET6218R按键检测程序源代码
/************************************************************************
MCU:AT89C52 编译环境:Keil C
*************************************************************************/
#include
#include
#include
#define uint8 unsigned char
#define uint16 unsigned int
sbit DIO=P1^0;//端口定义
sbit CLK=P1^1;
sbit STB=P1^2;
uint8 dat_temp1;//按键接收数据暂存变量
uint8 dat_temp2;//按键接收数据暂存变量
/*********************自己添加一个微秒级延迟******************************/
void _delay_us(uint16 z)//延迟z微秒
{
uint16 i,j;
for(i=z;i>0;i--)
for(j=510;j>0;j--);
}
/**********************驱动程序*********************************/
void write(uint8 data_byte)//写一个字节
{
uint8 j;
STB=0;
for(j=0;j<8;j++)
{
if(data_byte&0x01)
{
DIN=1;
}
else
{
DIN=0;
}
CLK=0;_delay_us(2);
data_byte=data_byte>>1;
CLK=1;_delay_us(2);
}
_delay_us(1);
}
/******************************按键读取**********************************
****************************2个按键同时检测**************************
命令2:读键扫描数据 注:先读出的第一位是b0位.示意图见datasheet
按键硬件连接;
K1SG1/KS1
K1SG2/KS2
通过datasheet,可以确定要读出4个字节(按键按下时相应位变为1,直到松开按键)
以下按键程序是同时读出RAM中4个字节,第1个字节就是所要的数据。
按照datasheet中的图表,可以知道2个按键同时按下时的字节为0x05
注;字节排序按照b0位在最低位,这个要和读取数据时的移位顺序相对应。
****************************************************************************/
void read_date()
{
uint8 i;
uint8 receive_dat1;//接收数据变量
uint8 receive_dat2;
uint8 receive_dat3;
uint8 receive_dat4;
//nop_();延迟1uS
for(i=0;i<8;i++)//读取第一个字节
{
CLK = 1;_delay_us(2);
CLK = 0;_delay_us(2);//下降沿读取数据
if(DIO)
receive_dat1 = (receive_dat1>>1)|0x80;//左移b0到最低位
else
receive_dat1 = receive_dat1>>1;
}
for(i=0;i<8;i++)//读取第二个字节
{
CLK = 1;_delay_us(2);
CLK = 0;_delay_us(2);//下降沿读取数据
if(DIO)
receive_dat2 = (receive_dat2>>1)|0x80;
else
receive_dat2 = receive_dat2>>1;
}
for(i=0;i<8;i++)//读取第三个字节
{
CLK = 1;_delay_us(2);
CLK = 0;_delay_us(2);//下降沿读取数据
if(DIO)
receive_dat3 = (receive_dat3>>1)|0x80;
else
receive_dat3 = receive_dat3>>1;
}
for(i=0;i<8;i++)//读取第四个字节
{
CLK = 1;_delay_us(2);
CLK = 0;_delay_us(2);//下降沿读取数据
if(DIO)
receive_dat4 = (receive_dat4>
;>1)|0x80;
else
receive_dat4 = receive_dat4 >> 1;
}
STB=1;//**********************读完数据后拉高
dat_temp1 = receive_dat1;//第一个