c语言暂存按键数据变量,ET6218R按键检测程序

该博客介绍了如何使用C语言编写针对MCU AT89C52的ET6218R按键检测程序。程序包括微秒级延迟函数、写入和读取数据的驱动程序,以及读取按键状态的详细步骤,能够检测2个按键的实时状态,并解释了按键数据的解析过程。
摘要由CSDN通过智能技术生成

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&gt

;>1)|0x80;

else

receive_dat4 = receive_dat4 >> 1;

}

STB=1;//**********************读完数据后拉高

dat_temp1 = receive_dat1;//第一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值