200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Proteus仿真-矩阵键盘(实验一)

Proteus仿真-矩阵键盘(实验一)

时间:2024-06-17 10:36:12

相关推荐

Proteus仿真-矩阵键盘(实验一)

最近,由于在学习51单片机,学会了用proteus进行仿真

Proteus仿真-矩阵键盘

由于一般的按键是单独接在一根I/O线上,构成所谓的独立式键盘。其特点是电路简单,易于编程,但占用的I/O口线比较多,当需要较多按键时可能产生I/O口资源紧张问题。为此,可以采用行列式键盘方案,具体做法是,将I/O口分为行线和列线,按键设置在跨接行线和列线的交点上,列线通过上拉电阻接正电源。

分为4x4行列式键盘,其中键盘从左到右,上到下分别标号1-16,有四位数码管,其中第一个,第二位共同显示键盘的标号,第三位和第四位分别显示所按按键的行列标号,如下

我们在上面的基础上,可以在增加一个蜂鸣器,按标号显示次数,如05,则蜂鸣器响5声。

电阻可以设置成1k,蜂鸣器电压可以设置成2V.

完整的图如下.

在keil 51中,对应的代码如下.

//由于本次实验内容较简单,未考虑代码优化和代码工程化.#include <reg52.h>char key_buf[4][4]={{0xee,0xde,0xbe,0x7e},{0xed,0xdd,0xbd,0x7d},{0xeb,0xdb,0xbb,0x7b},{0xe7,0xd7,0xb7,0x77}}; // 第一行的第一列....第四列...第二行....char led_mod[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//1 2 3 4 5 6 7 8 9 0 共阴数码管.sbit wela1 = P3^0; //位选口sbit wela2 = P3^1;sbit wela3 = P3^2;sbit wela4 = P3^3;sbit beep = P1^0;//蜂鸣器.char ValueH=0,ValueL=0,ValueX=0,ValueY=0,M=0;static int times = 0,Q=0;void delay(int Z);//延迟函数,可用定时器精确void NoteNumber();//记下按下的行,列数void ShowNumber();//显示数码void Buzzer();void main(){beep=1;while(1){NoteNumber();}}void Buzzer(){char flag = M;//几次的标记int n=0,m=0;while(flag){for(n=0;n<2;n++){beep=~beep;for(m=0;m<20;m++)ShowNumber();}flag = flag - 1;}}void delay(int Z){int i=0;while(Z--){for(i=0;i<113;i++);}}void NoteNumber(){char key_scan[4] = {0xfe,0xfd,0xfb,0xf7}; //0xfe,对应端口高到低.分别为第一行.....第四行int i=0,j=0,n=0,m=0;for(i=0;i<4;i++){P2 = key_scan[i];if((P2&0x0f)!=0x0f){//有按键按下,判断是哪个.delay(2);if ((P2&0x0f)!=0x0f) {//按键消抖for(j=0;j<4;j++){if (P2==key_buf[i][j]){//哪个,显示.M = i*4+j+1; //几个.//重新开始计时ValueH=M/10;ValueL=M%10;ValueX = i + 1;ValueY = j + 1;Buzzer();}}}}}ShowNumber();}void ShowNumber(){P0 = led_mod[ValueH];wela1=0; //打开位选delay(2); //延迟,否则可能不显示.wela1=1; //关闭位选P0 = led_mod[ValueL];wela2=0;delay(2);wela2=1;P0 = led_mod[ValueX];wela3=0;delay(2);wela3=1;P0 = led_mod[ValueY];wela4=0;delay(2);//几行几列.wela4=1;}

最后也有一些困惑,按照C语言的思路来理解keil C,似乎有些地方不同(不是指语法方面),例如变量问题,明明全局变量,在ShowNumber()中修改不行,而在NoteNumber()中修改又可以?

由于作者水平有限,总有些知识漏洞,希望大家批评指正。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。