




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 #include <reg52.h>#define uchar unsigned char #define uint unsigned int #define key_io P2/ 0 1 2 34 5 6 7 8 9uchar code smg_du=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;uchar code smg_we=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;uchar dis_smg8;uchar key_can ;uchar num;void delay_1ms(uin
2、t q)uint i,j;for(i=0;i<q;i+)for(j=0;j<120;j+);void dis()uchar i;for(i=0;i<3;i+)P0 = 0xff;P1 = smg_wei;P0 = dis_smgi;delay_1ms(1); void key_4()key_io = 0x0f;key_can = 10;if(key_io != 0x0f)delay_1ms(1);if(key_io != 0x0f)switch(key_io & 0x0f)case 0x0e: key_can = 1; break;case 0x0d: key_can
3、 = 2; break;case 0x0b: key_can = 3; break;case 0x07: key_can = 4; break;while(key_io != 0x0f)key_io = key_io | 0x0f;dis();void smg_dis()if(key_can = 1)num+;/if(num >= 20)/num = 20;dis_smg0= smg_dunum % 10;dis_smg1= smg_dunum / 10 % 10;dis_smg2= smg_dunum / 100 % 10;if(key_can = 2)/if(num != 0)num
4、-;dis_smg0= smg_dunum % 10;dis_smg1= smg_dunum / 10 % 10;dis_smg2= smg_dunum / 100 % 10;void main()while(1)key_4();dis();if(key_can < 5)smg_dis();51单片机矩阵键盘的C语言程序与分析学习51单片机矩阵键盘时,我有点迷乱了,不知道是怎样处理的,经过仔细分析电路,然后终于明白其中的原理,这样的话,再看程序,就是那样的简单了。首先看一下电路图是怎样连接的,我买的开发板上是AT89S52单片机,矩阵键盘在P3口。接法如下图:当然上面的图的意思是P3.1
5、P3.3 跟P3.4P3.7不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。如果给P3一个扫描初值的话:如0x0F ,则没有键按下时为:P3.1P3.3为1,P3.4P3.7为0。如果有键按下,则情况发生变化:高电平接入低电平:如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。则P3此时为:0000 0111,这时如果用P3&0x0F,则高四位为0,低四位保留,可以得到低四位的内容了。通过去抖操作,即一个delay,可以得到低四位内容。这里设为:h=P3&0x0F;如果再得到高四位内容,则可以组成一个数,来定位哪个键了。用P3=h|0xF0;
6、这会出现什么情况呢?1|0=1 1| 1 =1,这里难道高四位全置1 吗?不是的,当赋值后,如果有键按下的话,P3高四位不会全为1111,被拉到0了。如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。 即:0111 0111,&F0之后,得到0111 0000,这样的话,我们得到高四位的值了,用高四位+低四位,就可以得到一个数值,确定一个键。下面看看人家编写的程序,相信不是太难了吧。/keyboard.c 这里的行与列的扫描,也就是把字节的8位,高四位与低四位分开来,从而确定坐标。/行列扫描程序,可以自己定义端口和扫描
7、方式,这里做简单介绍#include <reg52.h>/包含头文件#define uchar unsigned char#define uint unsigned intunsigned char const dofly=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x
8、5e,0x79,0x71;/0-F,数码管来显示按下键的值。uchar keyscan(void); /主要的矩阵键盘扫描函数。void delay(uint i);void main()uchar key;P2=0x00;/1数码管亮 按相应的按键,会显示按键上的字符while(1)key=keyscan();/调用键盘扫描,switch(key)case 0x7e:P0=dofly0;break;/0 按下相应的键显示相对应的码值 原理就是高四位一列低四位一列
9、的组/合。0111 1110 7e 0表示按键后为0,1表示没有按键按下的。即P3.7与P3.1连接为低电平,为S1键/其他类推。case 0x7d:P0=dofly1;break;/1case 0x7b:P0=dofly2;break;/2case 0x77:P0=dofly3;break;/3case 0xbe:P0=dofly4;break;/4case 0xbd:P0=dofly5;break;/5case 0xbb:P0=dofly6;break;/6case 0xb7:P0=dofly7;break;/7cas
10、e 0xde:P0=dofly8;break;/8case 0xdd:P0=dofly9;break;/9case 0xdb:P0=dofly10;break;/acase 0xd7:P0=dofly11;break;/bcase 0xee:P0=dofly12;break;/ccase 0xed:P0=dofly13;break;/dcase 0xeb:P0=dofly14;break;/ecase 0xe7:P0=dofly15;break;/fuchar keyscan(void)/键盘扫描函数,使用行列反转扫描法 比如:行为低电位,列为高四位uchar cord_h,cord_l;/行
11、列值P3=0x0f; /行线输出全为0cord_h=P3&0x0f; /读入列线值if(cord_h!=0x0f) /先检测有无按键按下delay(100); /去抖if(cord_h!=0x0f) cord_h=P3&0x0f; /读入列线值 P3=cord_h|0xf0; /输出当前列线值 cord_l=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机械工程师考试效果反馈与改进
- 酒店市场开发与管理试题及答案
- 机械工程师资格证前沿问题与试题及答案
- 视觉设计在品牌营销中的策略试题及答案
- 2024年商务礼仪师考试知识考核试题及答案
- 2025-2030年中国家具行业运行趋势及市场需求前景预测研究报告
- 女性创业者妇联2025年扶持计划
- 2025-2030年中国女装品牌发展竞争分析及投资趋势预测研究报告
- 高考体育专项技能提升训练计划
- 2025-2030年中国塑料细绳市场运行状况分析及前景趋势调研报告
- 油气管道输送试题及答案
- 2025-2030中国非邻苯二甲酸酯类增塑剂行业市场发展趋势与前景展望战略研究报告
- 2025年台球理论测试题及答案
- 2024-2025学年新教材高中数学 第4章 概率与统计 4.3 统计模型 4.3.1 第2课时 相关系数与非线性回归说课稿 新人教B版选择性必修第二册
- 虚拟电厂接入配电网电力系统调度优化
- 用户能耗监测的智能插座原型设计
- 新能源汽车废旧动力电池综合利用行业规范条件(2024年本)
- 分子生物学知到智慧树章节测试课后答案2024年秋上海海洋大学
- 2024年01月22096经济法学期末试题答案
- 【MOOC】粮油储藏学(A)-河南工业大学 中国大学慕课MOOC答案
- 国开(内蒙古)2024年《汉语中的中国文化》形成性考核1-3终结性考核答案
评论
0/150
提交评论