矩阵按键-线翻转法

#include <REGX51.H>

typedef unsigned char u8;
typedef unsigned int u16;

#define KEY_MATRIX_PORT P1
#define SMG_A_DP_PORT P0

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};

void delay_10us(u16 ten_us)
{
while(ten_us–);
}

/行列式扫描法****

u8 key_matrix_ranks_scan(void)
{
u8 key_value=0;

KEY_MATRIX_PORT=0xf7;//第一列为低电平
if(KEY_MATRIX_PORT!=0xf7)
{   delay_10us(1000);//消抖switch(KEY_MATRIX_PORT){case 0x77:key_value=1;break;case 0xb7:key_value=5;break;case 0xd7:key_value=9;break;case 0xe7:key_value=13;break;}
}while(KEY_MATRIX_PORT!=0xf7);//等待按键松开KEY_MATRIX_PORT=0xfb;//第二列为低电平
if(KEY_MATRIX_PORT!=0xfb)
{   delay_10us(1000);//消抖switch(KEY_MATRIX_PORT){case 0x7b:key_value=2;break;case 0xbb:key_value=6;break;case 0xdb:key_value=10;break;case 0xeb:key_value=14;break;}
}while(KEY_MATRIX_PORT!=0xfb);//等待按键松开KEY_MATRIX_PORT=0xfd;//第三列为低电平
if(KEY_MATRIX_PORT!=0xfd)
{   delay_10us(1000);//消抖switch(KEY_MATRIX_PORT){case 0x7d:key_value=3;break;case 0xbd:key_value=7;break;case 0xdd:key_value=11;break;case 0xed:key_value=15;break;}
}while(KEY_MATRIX_PORT!=0xfd);//等待按键松开KEY_MATRIX_PORT=0xfe;//第四列为低电平
if(KEY_MATRIX_PORT!=0xfe)
{   delay_10us(1000);//消抖switch(KEY_MATRIX_PORT){case 0x7e:key_value=4;break;case 0xbe:key_value=8;break;case 0xde:key_value=12;break;case 0xee:key_value=16;break;}
}while(KEY_MATRIX_PORT!=0xfe);//等待按键松开return key_value;//返回键值

}
*****************************************************************/

/线翻转法扫描*************/

u8 key_matrix_flip_scan(void)
{
static u8 key_value=0;//static 保存上一个值;若不加依然返回0
KEY_MATRIX_PORT=0x0f;//行输入低电平
if(KEY_MATRIX_PORT!=0x0f)//行不等于0000 1111,有按键按下
{
delay_10us(1000);//消抖
//测试列
if(KEY_MATRIX_PORT!=0x0f)//有按键按下
{
KEY_MATRIX_PORT=0x0f;//0000 1111
switch(KEY_MATRIX_PORT)
{
case 0x07:key_value=1;break;//第一列0000 0111
case 0x0b:key_value=2;break;//第二列0000 1011
case 0x0d:key_value=3;break;//第三列0000 1101
case 0x0e:key_value=4;break;//第四列0000 1110
}

     //测试行KEY_MATRIX_PORT=0xf0;//1111 0000switch(KEY_MATRIX_PORT){case 0x70:key_value=key_value;break;//0111 0000(第一行) 第一列S1=1/第二列S2=2/第三列S3=3/第四列S4=4case 0xb0:key_value=key_value+4;break;//1011 0000(第二行)第一列S5=1+4/第二列S6=2+4/第三列S7=3+4/第四列S8=4+4case 0xd0:key_value=key_value+8;break;//1101 0000(第三行) 第一列S9=1+8/第二列S10=2+8/第三列S11=3+8/第四列S12=4+8case 0xe0:key_value=key_value+12;break;//1110 0000(第四行)第一列 S13=1+12=13/第二列14=2+12/第三列S15=3+12/第四列S16=4+12}while(KEY_MATRIX_PORT!=0xf0);//等待按键松开}}
elsekey_value=0;
return key_value;

}

void main()
{
u8 key=0;//定义变量
while(1)
{
/调用行列式扫描/
//key=key_matrix_ranks_scan();

 /*调用线翻转法扫描*/        key=key_matrix_flip_scan();if(key!=0)SMG_A_DP_PORT=gsmg_code[key-1];//在程序里0代表第一个,1代表第二个。}

}

C51矩阵按键-行列式法+线翻转法相关推荐

  1. 51单片机学习记录(五)矩阵按键

    文章目录 1.矩阵按键的控制原理 2.矩阵按键实现 1.行列式法实现矩阵按键 2.线翻转法实现矩阵按键 3.按键实战 1.矩阵按键的控制原理 独立按键与单片机连接时, 每一个按键都需要单片机的一个 I ...

  2. 51单片机 | 矩阵按键实验

    文章目录 一.矩阵按键介绍 二.硬件设计 三.软件设计 四.实验现象   开发板上板载了一个 4*4 矩阵键盘.本节所要实现的功能是:通过开发板上的矩阵键盘控制静态数码管显示对应的键值 0-F. 一. ...

  3. 51单片机-独立按键,矩阵按键,点阵

    独立按键:实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开. "1,2"和"3,4"管脚之间距离短,初始不导通,"1,3"和&q ...

  4. 线性代数 --- 三种计算矩阵的行列式的方法之二 莱布尼兹展开法(个人笔记扫描版)

    三种计算矩阵的行列式的方法之二 莱布尼兹展开法 在我的个人的线性代数学习中,我分别记录计算矩阵行列式的三种方法,1,LU分解法,2,拉普拉斯展开法,这里我介绍一下第三种方法,莱布尼兹展开法.   行列 ...

  5. C语言的三个经典题目:三步翻转法、杨氏矩阵、辗转相除法

    文章目录 三步翻转法 杨氏矩阵 辗转相除法 三步翻转法 三步翻转法是C语言中用来求旋转字符串的一种进阶方法,我们以具体例题对其进行介绍. 例:求一个字符串左旋n个字符后得到的新字符串 普通方法实现 我 ...

  6. 线性代数 --- 三种计算矩阵的行列式的方法之一 拉普拉斯展开法(个人笔记扫描版)

     行列式的定义: 用"拉普拉斯展开法"求行列式的值 2x2矩阵的行列式:  3x3矩阵的行列式:  4x4矩阵的行列式: 个人笔记: (全文完) 其他算法: LU分解法: 如何计算 ...

  7. 计算机主机接线视频教程,电脑主板跳线怎么接?电脑机箱与主板跳线接法图解教程...

    电脑组装其实并不难,对于一个DIY老手三下五除二就组装好了,但对于新手装机来说,最大的难点就是主板与机箱之间的跳线的接法,那么电脑主板跳线怎么接?下面装机之家小编分享一下电脑机箱与主板跳线接法图解教程 ...

  8. lcd4linux 1602,详解一种LCD1602 的4线接法

    描述 虽然LCD1602的显示屏幕与显示字符都较小,实用性并不强,但是在一般的教学实验中,它仍不失为一个常用的输出显示设备. LCD1602与单片机连接的线路共有11条,其中有8条数据线,3条控制线. ...

  9. 台式电脑主板插线步骤图_电脑主板跳线插法 装机接线详细图解教程

    组装一台电脑,主板上的跳线接线是最让小白装机用户头疼的事情,接错了轻则启动不了,重则烧毁硬件,但其实具体跳线插法,在机箱连接的跳线接口上以及主板跳线插座上都有详细标注,我们只需要在主板上找到对应插座, ...

最新文章

  1. 对话迈克尔·乔丹:太多人关注个体智能,而不关注体系
  2. python+unittest+excel接口自动化_Python+requests+unittest+excel实现接口自动化测试框架
  3. 全方面了解和学习PHP框架 PHP培训教程
  4. 《研磨设计模式》chap14 迭代器模式(3) 举例
  5. windows 8 “Fetch”远程获取
  6. 使用移动自适应布局+easy mock实现移动界面的简单实现
  7. micropython webrepl_4-5 MicroPython WebREPL 命令行交互环境设置-2 接入点模式
  8. iOS开发之结构体底层探索
  9. 拓端tecdat|在R语言和Stan中估计截断泊松分布
  10. pycharm主题方案
  11. (转载)vmware workstation14永久激活密钥分享
  12. 华为手机热点无法连接_为什么华为手机开热点别的手机连不上?
  13. 谷歌浏览器如何安装插件-以octotree为例
  14. 操作注册表修改防火墙
  15. 新知实验室TRTC初探
  16. 导数与微分 — 高等数学
  17. 阿里云发布首款云电脑“无影”,价格仅传统电脑的一半
  18. 协变 (Covariant)、逆变 (Contravariant) 与不变 (Invariant)
  19. OpenCV cmake配置项BUILD_opencv_world的说明
  20. matlab代码行加不加分号的区别

热门文章

  1. 《前端从傻逼到牛逼》序章
  2. 关于时间英文汇总和换算: millisecond, microsecond, nanosecond, picosecond
  3. PADS 转allegro 17.2
  4. CouchDB 实现原理
  5. Java开发者福音 阿里巴巴宣布连任Java全球管理组织席位
  6. mac上磁盘不能挂载的解决办法
  7. 计算机专业的大学生课外该如何学习(转)
  8. 模拟数据结构:二叉树
  9. PyCharm中如何设置作者信息
  10. 用友NC63界面新增按钮实现方法(转)