博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51单片机独立和矩阵按键(有无中断定时器)待补充ing
阅读量:3948 次
发布时间:2019-05-24

本文共 3127 字,大约阅读时间需要 10 分钟。

单片机按键

——————鄙人萌新,欢迎交流,完善代码。

一、无中断定时器独立按键

if不能嵌套,我之前嵌套一下,后来发现当key0==0(按下)是不允许有key==1(弹起),如果按下里面有弹起则视为抖动,所以不能嵌套。
void key()    {
if(key0==0&&flag==0) {
flag=1; } if(flag==1&&key0==1) {
num++; flag=0; } }

二、无中断定时器矩阵按键

用矩阵编码形式进行赋值传递 0x0f 和 0xf0 分别作为L低位H高位的初始值edb7和edb7的排列组合1111 0000 :0xf00000 1111 :0x0f按下即为0(分别判断L位和H位)
void key_scan()  {
unsigned char temp0=0,temp1=0,temp=0; P1=0xf0; if(P1!=0xf0) {
delay(20); temp0=P1; P1=0x0f; if(P1!=0x0f) {
temp1=P1; } } temp=temp0+temp1; if(temp==0xee) {
num=0; } if(temp==0xed) {
num=1; } if(temp==0xeb) {
num=2; } if(temp==0xe7) {
num=3; } if(temp==0xde) {
num=4; }

三、有中断定时器独立按键

 
bit keysta = 1;//当前值 bit backup = 1; //前次备份值   void key()   {
if(keysta != backup) //说明按键有动作 {
if(backup == 0)//前次值为0,则当前值为1(弹起动作) {
num++; if(num>=10) {
num = 0; } P2 = str[num]; } backup = keysta;//更新备份值为当前值,循环时进行比较 } }/* T0 中断服务函数,用于按键状态的扫描并消抖 */ void InterruptTime0() interrupt 1 {
static unsigned char keybuf = 0xff;//按键抖动扫描缓冲区8位, //保留16ms里面的缓冲扫描值 TH0 = 0xF8; //重新加载初值2ms TL0 = 0xCD; keybuf = (keybuf<<1)|key0;//(0000000key0|xxxxxxx0) → key0 //是1就是1,是0就是0(或运算) if(keybuf == 0x00) //八位16ms都是0 {
keysta = 0; } else if(keybuf == 0xFF) {
keysta = 1; } else {
}//其余情况代表未稳定,不做判断 }

四、有中断定时器矩阵按键

矩阵行和列检测是否按下,每一行进行4ms,4行全部检测时间16ms
void key()  {
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
if(backup[i][j] != keysta[i][j]) {
if(backup[i][j] == 0) {
P2 = str[i*4+j]; } backup[i][j] = keysta[i][j]; } } } }void InterruptTime0() interrupt 1 {
static unsigned char keybuf[4][4] = {
{
0xFF, 0xFF, 0xFF, 0xFF}, {
0xFF, 0xFF, 0xFF, 0xFF}, {
0xFF, 0xFF, 0xFF, 0xFF}, {
0xFF, 0xFF, 0xFF, 0xFF}}; static unsigned char keyout = 0; unsigned char k ; TH0 = 0xFC; TL0 = 0x67; keybuf[keyout][0] = (keybuf[keyout][0] << 1) | L0; keybuf[keyout][1] = (keybuf[keyout][1] << 1) | L1; keybuf[keyout][2] = (keybuf[keyout][2] << 1) | L2; keybuf[keyout][3] = (keybuf[keyout][3] << 1) | L3; //检测 L 列 + 选择 H 行 for(k=0;k<4;k++) {
if((keybuf[keyout][k] & 0x0F) == 0x00) {
keysta[keyout][k] = 0; } if((keybuf[keyout][k] & 0x0F) == 0x0F) {
keysta[keyout][k] = 1; } } keyout++; keyout = keyout & 0x03;//小技巧:到四归零 switch(keyout)//选择H行 {
case 0: H0 = 0; H3 = 1;break; case 1: H1 = 0; H0 = 1;break; case 2: H2 = 0; H1 = 1;break; case 3: H3 = 0; H2 = 1;break; default:break; }}

转载地址:http://tcgwi.baihongyu.com/

你可能感兴趣的文章
“需求为王”才是根本
查看>>
高效率的危害
查看>>
寻找边缘性创新
查看>>
让创意瞄准市场
查看>>
高效经理人应具有的八个重要习惯
查看>>
优秀的领导者能读懂人才
查看>>
大智若愚也是领导力
查看>>
android如何编译MTK的模拟器
查看>>
android如何添加AP中要使用的第三方JAR文件
查看>>
利用sudo命令为Ubuntu分配管理权限
查看>>
Ubuntu下几个重要apt-get命令用法与加速UBUNTU
查看>>
Ubuntu中网页各种插件安装命令
查看>>
使用tar命令备份Ubuntu系统
查看>>
ubuntu flash 文字乱码解决方案
查看>>
在ubuntu中运行exe文件
查看>>
ubuntu安装命令
查看>>
和上司沟通必备8个黄金句
查看>>
联系查看两张卡的未接电话记录
查看>>
把拒接电话作为已经接电话写到call log中
查看>>
FDN号码完全匹配
查看>>