80C51矩阵键盘相关代码和电路设计
2016-10-31 20:52
225 查看
本文主要记录两种方式:
1 扫描法
2 线反转法
1 扫描法
#include<reg51.h> //扫描法 //键盘扫描用P0口,数码管显示用P2口 #define keyport P0 #define seg7port P2 //共阳极八段数码管编码 unsigned char coding[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e }; void display(unsigned char temp); void delay(unsigned int i); void main() { while(1) { keyport=0x0f; if((keyport&0x0f)!=0x0f) { delay(10);//去抖动proteus仿真需要根据实际情况调节 if((keyport&0x0f)!=0x0f) { //扫描开始 keyport=0xef;//扫描第一列 if((keyport&0x0f)!=0x0f) { switch(keyport&0x0f){ case 0x0e: display(0); break; case 0x0d: display(1); break; case 0x0b: display(2); break; case 0x07: display(3); break; } break; } keyport=0xdf;//扫描第二列 if((keyport&0x0f)!=0x0f) { switch(keyport&0x0f){ case 0x0e: display(4); break; case 0x0d: display(5); break; case 0x0b: display(6); break; case 0x07: display(7); break; } break; } keyport=0xbf;//扫描第三列 if((keyport&0x0f)!=0x0f) { switch(keyport&0x0f){ case 0x0e: display(8); break; case 0x0d: display(9); break; case 0x0b: display(10); break; case 0x07: display(11); break; } break; } keyport=0x7f;//扫描第四列 if((keyport&0x0f)!=0x0f) { switch(keyport&0x0f){ case 0x0e: display(12); break; case 0x0d: display(13); break; case 0x0b: display(14); break; case 0x07: display(15); break; } break; } } } } } void delay(unsigned int i){ unsigned char j=0; for(j=255;j>0;j--) for(;i>0;i--); } void display(unsigned char temp){ seg7port=coding[temp]; }
2 线反转法
#include<reg51.h> //线反转法 //键盘扫描用P0口,数码管显示用P2口 #define keyport P0 #define seg7port P2 //共阳极八段数码管编码 unsigned char code coding[4][4]={ {0xc0,0xf9,0xa4,0xb0}, {0x99,0x92,0x82,0xf8}, {0x80,0x90,0x88,0x83}, {0xc6,0xa1,0x86,0x8e} }; unsigned char x,y;//x为行号,y为列号 void display(unsigned char temp); void delay(unsigned int i); void main() { while(1) { keyport=0x0f;//列输出0 if((keyport&0x0f)!=0x0f)//行不全为1说明有键按下 { delay(10);//去抖动proteus仿真需要根据实际情况调节 if((keyport&0x0f)!=0x0f) { switch(keyport&0x0f){ case 0x0e: x=0; break; //行号为0 case 0x0d: x=1; break; //行号为1 case 0x0b: x=2; break; //行号为2 case 0x07: x=3; break; //行号为3 } keyport=0xf0;//行输出0 switch(keyport&0xf0){ case 0xe0: y=0; break; //列号为0 case 0xd0: y=1; break; //列号为1 case 0xb0: y=2; break; //列号为2 case 0x70: y=3; break; //列号为3 } display(coding[x][y]); } } } } void delay(unsigned int i){ unsigned char j=0; for(j=255;j>0;j--) for(;i>0;i--); } void display(unsigned char temp){ seg7port=temp; }
相关文章推荐
- [转]如何让.Net控件在设计时InitializeComponent()中不生成相关代码
- 如何让.Net控件在设计时InitializeComponent()中不生成相关代码(C#组件开发)
- 如何让.Net控件在设计时InitializeComponent()中不生成相关代码
- 设计自己的软渲染器-附代码相关
- Java中2.5D游戏的设计与实现(3)—八方走法实现原理及相关代码
- 光模块光路与电路设计辅助工具代码(随便写写玩下,能够提高您能对光模块的理解,不过有待进一步补充)
- Java中2.5D游戏的设计与实现(3)—八方走法实现原理及相关代码
- 电路设计_CC1110功耗相关
- 如何让.Net控件在设计时InitializeComponent()中不生成相关代码
- 高速电路设计相关
- 小车电机驱动及相关电路设计
- Java2.5D游戏的设计与实现(3)—八方走法实现原理及相关代码 推荐
- 代码质量、重构、软件设计相关的一些资料收集
- 如何让.Net控件在设计时InitializeComponent()中不生成相关代码
- 微机原理之跑马灯课程设计设计报告及相关汇编代码(包含原理图)
- Java中2.5D游戏的设计与实现(3)—八方走法实现原理及相关代码
- [置顶] 完整VS2010中使用MFC+Opencv设计视频读取(有代码和相关解析)
- 利用后台代码设计或实现水晶报表工具栏相关功能
- 追MM与设计模式(Factory代码)
- 常用的网页设计代码