基于单片机 X 矩阵键盘控制数码管显示的Proteus仿真

合集下载

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。

(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。

在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

操作方完成矩阵式键盘实验。

具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。

完成思考题。

三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。

2.在keil上进行编译后生成“xxx.hex”文件。

3.编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。

单片机实验报告——矩阵键盘数码管显示

单片机实验报告——矩阵键盘数码管显示

单片机实验报告信息处理实验实验二矩阵键盘专业:电气工程及其自动化指导老师:***组员:明洪开张鸿伟张谦赵智奇学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日矩阵键盘一、实验内容1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。

按其它键没有结果。

二、实验目的1、学习独立式按键的查询识别方法。

2、非编码矩阵键盘的行反转法识别方法。

3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。

4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。

5、掌握利用Keil51软件对程序进行编译。

6、会根据实际功能,正确选择单片机功能接线,编制正确程序。

对实验结果能做出分析和解释,能写出符合规格的实验报告。

三、实验原理1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。

2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。

3、识别键的闭合,通常采用行扫描法和行反转法。

行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。

行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。

然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。

这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。

由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。

自己写的单片机矩阵键盘显示程序及仿真

自己写的单片机矩阵键盘显示程序及仿真

Protues 电路连接图如下所示:PS:矩阵键盘说明——4×4矩阵从左到右依次编码为1,,3,4,5,6,7,8,9,10,11,12,13,14,15,16按下某一按键,Led数码管就会显示相应的数字。

Keil C51 程序如下:有点不足望改进。

O(∩_∩)O谢谢!!!/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////#include <reg51.h>#define uchar unsigned char //宏的定义变量类型 uchar 代替 unsigned char#define uint unsigned int //宏的定义变量类型 uint 代替 unsigned intuchar dis_buf; //显示缓存uchar temp;uchar l,h,j; //定义行列void delay0(uchar x); //x*0.14MS// 此表为 LED 的字模 0 1 2 3 4 5 6 78 9uchar code LED7Code[] = {0xc0,0xf9,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};/************************************************************* * ** 延时子程序 ** **************************************************************/void delay(uchar x){ uchar j;while((x--)!=0) //CPU执行x*12次,x=10{ for(j=0;j<50;j++){;}}}/************************************************************* * * * 键扫描子程序 (4*4的矩阵) P1.4 P1.5 P1.6 P1.7为行 * * P1.0 P1.1 P1.2 P1.3为列 ** * *************************************************************/void keyscan(void){ temp=0;P1=0xF0; //高四位输入行为高电平列为低电delay(3); //延时temp=P1; //读P1口temp=temp&0xF0;//屏蔽低四位temp=~((temp>>4)|0xF0); //高四位取反无键按下取反应为0xf0if(temp==1) //0001 [1,1] 被拉低h=1;else if(temp==2) //0010[2,1] 被拉低h=2;else if(temp==4) //0100[3,1] 被拉低h=3;else if(temp==8) //1000[4,1] 被拉低h=4;dis_buf = h;dis_buf = (dis_buf<<4) & 0xf0; //行信息现存在第四位delay(10);P1=0x0F; //低四位输入列为高电平行为低电平delay(3); //延时temp=P1; //读P1口temp=temp&0x0F; //屏蔽高四位temp=~(temp|0xF0); //取反if(temp==1) //1列被拉低l=1;else if(temp==2) //2列被拉低l=2;else if(temp==4) //3列被拉低l=3;else if(temp==8) //4列被拉低l=4;l= l & 0x0f;delay(3);dis_buf= l | dis_buf;}/************************************************************** **判断键是否按下 ** **************************************************************/void keydown(void){P2=0xF0; //显示00P3=0xf0;//将高4位全部置1 低四位全部置0if(P1!=0xF0) //判断按键是否按下如果按钮按下会拉低P1其中的一个端口{keyscan(); //调用按键扫描程序}}void display( ){j=50;while(j){P2= 0x80;P0= LED7Code[0];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display1( ){j=50;while(j){P2= 0x80;P0= LED7Code[2];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display2( ){j=50;while(j){P2= 0x80;P0= LED7Code[3];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display3( ){j=50;while(j){P2= 0x80;P0= LED7Code[4];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display4( ){j=50;while(j){P2= 0x80;P0= LED7Code[5];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;} }void display5( ){j=50;while(j){P2= 0x80;P0= LED7Code[6];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}/************************************************************** ** 主程序 ** **************************************************************/ void main(){P0=0xc0;delay(20); //延时while(1){ keydown(); //调用按键判断检测程序switch( dis_buf){case 0x11 : P2=0x80; P0= LED7Code[1]; break;case 0x12 : P2=0x80; P0= LED7Code[2]; break;case 0x13 : P2=0x80; P0= LED7Code[3]; break;case 0x14 : P2=0x80; P0= LED7Code[4]; break;case 0x21 : P2=0x80; P0= LED7Code[5]; break;case 0x22 : P2=0x80; P0= LED7Code[6]; break;case 0x23 : P2=0x80; P0= LED7Code[7]; break;case 0x24 : P2=0x80; P0= LED7Code[8]; break;case 0x31 : P2=0x80; P0= LED7Code[9]; break;case 0x32 : display();break;case 0x33 : P2 = LED7Code[1]; P0= LED7Code[1]; break;case 0x34 : display1(); break;case 0x41 : display2(); break;case 0x42 : display3();; break;case 0x43 : display4();; break;case 0x44 : display5();; break;}delay(250);}}/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////(注:本资料素材和资料部分来自网络,仅供参考。

proteus矩阵键盘

proteus矩阵键盘

实验三:矩阵键盘电路设计(一)实验目的1掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。

2学会使用proteus软件设计矩阵键盘电路掌。

3握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。

(二)实验要求能熟练的编写8951单片机汇编程序设计键盘接口仿真电路图,并使之正常运行(三)连接图(四)结果图当矩阵键盘的3号键被按下时,P2口的七段数码管显示的数据为3.如下图1所以:当矩阵键盘的A号键被按下时,P2口的七段数码管显示的数据为A.如下图2所以:(五)代码ORG 0000HAJMP MAINORG 0030HMAIN:MOV DPTR,#TABLE ;将表头放入DPTRLCALL KEY ;调用键盘扫描程序MOVC A,@A+DPTR ;查表后将键值送入ACCMOV P2,A ;将ACC值送入P0口LJMP MAIN ;返回反复循环程序KEY: LCALL KS ;调用检测按键子程序JNZ K1 ;若有按键按下,则继续LCALL DELAY2 ;若无按键按下,则调用延时去抖程序 AJMP KEY ;返回,继续检测按键K1: LCALL DELAY2LCALL DELAY2 ;若有按键按下,则延时去抖动LCALL KS ;再调用检测按键程序JNZ K2 ;确认有键按下,进行下一步AJMP KEY ;若无按键按下,则返回继续检测K2: MOV R2,#0EFH ;将扫描值送入R2暂存MOV R4,#00H ;将第1列值送入R4暂存K3: MOV P1,R2 ;将R2的值送入P1口L6: JB P1.0,L1 ;P1.0等于1跳转到L1 MOV A,#00H ;将第1行值送入ACCAJMP LK ;跳转到键值处理程序L1: JB P1.1,L2 ;P1.1等于1跳转到L2 MOV A,#04H ;将第2行值送入ACCAJMP LK ;跳转到键值处理程序进行键值处理L2: JB P1.2,L3 ;P1.2等于1跳转到L3 MOV A,#08H ;将第3行值送入ACCAJMP LK ;跳转到键值处理程序L3: JB P1.3,NEXT ;P1.3等于1跳转到NEXT处 MOV A,#0CH ;将第4行值送入ACCLK: ADD A,R4 ;将行值与列值相加后的键值送入APUSH ACC ;将A中的值送入堆栈暂存K4: LCALL DELAY2 ;调用延时去抖程序LCALL KS ;调用检测按键程序JNZ K4 ;若按键没有松开,则继续返回检测POP ACC ;键堆栈的值送入ACCRETNEXT:INC R4 ;将列值加一MOV A,R2 ;将R2的值送入AJNB ACC.7,KEY ;扫描至KEY处进行下一扫描RL A ;扫描未完,将A中的值右移一位进行下一列的扫描MOV R2,A ;将ACC的值送入R2暂存AJMP K3 ;跳转到K3继续KS: MOV P1,#0FH ;将P1口的高4为置0,低4位置1 MOV A,P1 ;读P1口XRL A,#0FH ;将A中的值与0FH相异或RET ;子程序返回DELAY2: ;40ms延时去抖子程序MOV R5,#08HL7: MOV R6,#0FAHL8: DJNZ R6,L8DJNZ R5,L7RETTABLE: ;7段显示器的数据定义DB 0C0H,0F9H,0A4H,0B0H,99H ;01234DB 92H,82H,0F8H,80H,90H ;56789DB 88H,83H,0C6H,0A1H,86H ;ABCDEDB 8EH ;FEND ;程序结束。

51单片机矩阵键盘PROTEUS仿真演示

51单片机矩阵键盘PROTEUS仿真演示

51单片机矩阵键盘PROTEUS仿真演示51单片机矩阵键盘PROTEUS仿真演示(图、程序)作者:给力哈哈程序如下:#include#define uchar unsigned char;uchar key_val=0; //定义键值,初始默认为0uchar code TAB[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x8e}; //0~F共阳数码管显示段码void Check_Key(void){unsigned char row,col,tmp1,tmp2;tmp1 = 0x10; //tmp1用来设置P1口的输出,取反后使P1.4~P1.7中有一个为0for(row=0;row<4;row++) // 行检测{P1 = 0x0f; // 先将p1.4~P1.7置高P1 =~tmp1; // 使P1.4~p1.7中有一个为0tmp1*=2; // tmp1左移一位if ((P1 & 0x0f) < 0x0f) // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测{tmp2 = 0x01; // tmp2用于检测出哪一列为0for(col =0;col<4;col++) // 列检测{if((P1 & tmp2)==0x00) // 该列如果为低电平则可以判定为该列{key_val = row*4 +col; // 获取键值,识别按键return; // 退出循环}tmp2*=2; // tmp2左移一位}}}}void main(){P2=0xFF; //位码,这里全部置高,点亮8位数码管while(1){Check_Key();P0=TAB[key_val]; //显示}}。

MSP430单片机 矩阵键盘与数码管实验(附原理图)

MSP430单片机 矩阵键盘与数码管实验(附原理图)

MSP430单片机矩阵键盘与数码管实验(附原理图)/************************************************************* *MSP430单片机矩阵键盘与数码管实验*功能:用共阳极数码管显示按键的键值*适用:MSP430各系列单片机*by:duyunfu1987*************************************************************/ #include "msp430x44x.h"#define ROW P2OUT //矩阵键盘的行宏定义#define COL P2IN //矩阵键盘的列宏定义#define DPYOUT P3OUT //数码管输出口宏定义unsigned char keyval; //键值//共“阳”极数码管的码表unsigned char LED7CA[] ={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D, ~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71,0xff};/********************************************************函数名称:keyscan()*功能:扫描4*3矩阵键盘,并返回键值*出口参数:若有按键则返回键值,若无按键返回15*4*3矩阵键盘:0 1 2 3* 4 5 6 7* 8 9 A b*******************************************************/ unsigned char keyscan(){int i=0;unsigned char key=0;ROW = 0x8f; //先置三行输出低电平if((COL & 0x0f)!= 0x0f) //是否有按键{do i++;while(i<3000); //消抖动延时ROW = 0xbf; //扫描第一行if((COL & 0x0f)== 0x0f){ ROW = 0xdf; //扫描第二行if((COL & 0x0f)== 0x0f){ ROW = 0xef; //扫描第三行if((COL & 0x0f)== 0x0f)key = 15;else key = ~((ROW & 0XF0)|(COL & 0X0F));}else key = ~((ROW & 0XF0)|(COL & 0X0F));}else key = ~((ROW & 0XF0)|(COL & 0X0F));if(key != 15)switch(key) //获取有效地键值{ case 0x48: key=0; break;case 0x44: key=1; break;case 0x42: key=2; break;case 0x41: key=3; break;case 0x28: key=4; break;case 0x24: key=5; break;case 0x22: key=6; break;case 0x21: key=7; break;case 0x18: key=8; break;case 0x14: key=9; break;case 0x12: key=10;break;case 0x11: key=11;break;default: key=15;}}else key = 15;keyval=key;return key;}void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P3DIR |= 0xff;P3OUT = 0xff; //共阳极数码管输出口初始化P2DIR |= BIT4 +BIT5+BIT6; //先配置矩阵键盘的行(输出)//P2.6 第一行,P2.5 第二行,P2.4 第三行//P2.3 第一列,P2.2 第二列,P2.1 第三列,P2.0 第四列keyval=16;while(1){ keyscan();if(keyval != 15 && keyval<17)DPYOUT = LED7CA[keyval];//数码管显示键值}}。

基于51单片机的矩阵键盘

基于51单片机的矩阵键盘
case 3:wei_1=1;wei_2=0;wei_3=1;wei_4=1;break;
case 4:wei_1=0;wei_2=1;wei_3=1;wei_4=1;break;
}
delay_ms(2)
P0=0x00;
//每次显示完后都要消隐,这非常重要!这句一缺数码管就会闪屏
wei_1=1;wei_2=1;wei_3=1;wei_4=1;
if(temp==1)key=key+0;
else if(temp==2)key=key+1;
if(temp==4)key=key+2;
else if(temp==8)key=key+3;
}
void led_init()
{
wei_1=1;wei_2=1;wei_3=1;wei_4=1;
P0=0x00;
break;
}
if(key_putdown())//这个if是转到第一个while的必要条件
break;
}
}
}
}
void main()
{
wei=1;
control=0;
led_init();
if(key_putdown())
while(1)
//这里用了两个while(1)嵌套
{
key_scan();
key_tem[control++]=key;
if(control==5){led_init();control=0;}
}
void led_disp(uchar wei2,uchar num)
{
P0=table[num];
switch(wei2)

4×4矩阵键盘在单片机中的应用(Proteus)

4×4矩阵键盘在单片机中的应用(Proteus)

4×4矩阵键盘原理及其在单片机中的简单应用基于Proteus仿真1、4×4矩阵键盘的工作原理如下图所示,4×4矩阵键盘由4条行线和4条列线组成,行线接P3.0-P3.3,列线接P3.4-P3.7,按键位于每条行线和列线的交叉点上。

按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。

第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。

当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。

第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。

第三步,将第一步得到的列码和第二步得到的行码拼合成被按键的位置码,即Y0Y1Y2Y3X0X1X2X3(因为行线和列线各有一条为低电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。

当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y0Y1Y2Y3X0X1X2X3为0111 0111,即0X77。

当5键按下时,行线X1和列线Y1为低电平,其余行列线为高电平,于是可得到5键的位置码Y0Y1Y2Y3X0X1X2X3为1011 1011,即0XBB。

全部矩阵键盘的位置码如下:2、4×4矩阵键盘在单片机的简单应用举例(一)如下图所示,运行程序时,按下任一按键,数码管会显示它在矩阵键盘上的序号0~F,并且蜂鸣器发出声音,模拟按键的声音。

此处采用线反转法识别按键。

C程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit buzzer=P1^0;uchar code dis[]= //0~9,A~F的共阳显示代码{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E};uchar code tab[]= //矩阵键盘按键位置码{0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};void delay(uint x) //延时函数{uchar i;while(x--)for(i=0;i<120;i++);}uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;P3=0XF0; //P3口输出11110000a=P3; //读取列码delay(10); //防抖延时10msP3=0X0F; //P3口输出00001111b=P3; //读取行码c=a+b; //得到位置码for(i=0;i<16;i++)if(c==tab[i])return i; //查表得到按键序号并返回return -1; //无按键,则返回-1}void beep() //蜂鸣器发出声音,模拟按键的声音{ uchar i;for(i=0;i<100;i++){buzzer=~buzzer;delay(1);}buzzer=0;}void main(){uchar key;buzzer=0; //关闭蜂鸣器while(1){key=scan(); //得到按键号if(key!=-1) //有按键则显示,并且蜂鸣器发出声音{P0=dis[key];beep();delay(100);}}}Proteus仿真运行结果如下:3、4×4矩阵键盘在单片机的简单应用举例(二)如下图所示,运行程序时,按下的按键键值越大,点亮的LED灯越多,例如,按下1号键时,点亮一只LED灯,按下2号键时,点亮两只LED灯,按下16号键时,点亮全部LED 灯。

4X4矩阵键盘+1602——51单片机的Proteus实验

4X4矩阵键盘+1602——51单片机的Proteus实验

4X4矩阵键盘+1602——51单片机的Proteus实验本文转载自小波电子工作室。

C语言源代码//======================================================依次可以从键盘输入0-f,在1602LCD上显示出来(此程序在所买开发板上验证通过)//======================================================//******** 小波电子工作室All rights reserved******//******** 个人主页:/niejinbo **//******** 文件名:lcd_key.1.c ************//******** 功能概要:4*4矩阵键盘扫描***********//******** MCU: STC89C52 晶振:11.0592Mhz **********//******** 设计者:聂金波************//******** 完成日期:2008-07-14 ************//******** 当前版本:0714.1 ************//******** 改进说明:暂无************//******** 补充说明: 从键盘输入0-F,在LCD上显示出来//*********头文件区*******************#include<reg52.h>#include<math.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int//*********定义变量区*******************sbit dula=P2^6; //关闭数码管显示之用sbit wela=P2^7;sbit lcden=P3^4; //LCD使能信号sbit lcdrs=P3^5; //LCD数据/命令选择信号uchar tab_key[50];uchar code tab[]="0123456789abcdef";uchar n=0,temp,key;//*********函数声明区********************void lcd_disp(); //LCD显示函数void lcd_init(); //LCD初始化函数void write_com(uchar); //写命令函数void write_data(uchar); //写数据函数void delay(uint); //延迟函数void key_scan(); //键盘扫描函数void key_manage1(); //键盘功能分配函数void key_manage2();void key_manage3();void key_manage4();void key_manage5();void key_manage6();void key_manage7();void key_manage8();void key_manage9();void key_manage10();void key_manage11();void key_manage12();void key_manage13();void key_manage14();void key_manage15();void key_manage16();//**********主函数开始**********void main(){lcd_init();write_com(1);while(1){key_scan();lcd_disp();}}//**********LCD显示函数开始***********void lcd_disp(){uchar a,i=0;write_com(0x80);for(i=0;i<n;i++){a=tab_key[i];write_data(tab[a]);}}//**********LCD初始化函数开始*********void lcd_init(){dula=0;wela=0; // 关闭数码管显示lcden=0;write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口write_com(0x0c); //开显示,显示光标,光标闪烁write_com(0x06); //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动write_com(0x80); //设置光标指针}//**********写命令函数开始************void write_com(uchar com){lcdrs=0; //低电平写命令P0=com; //写入命令delay(3); //延时约3mslcden=1; //LCD使能端置高电平delay(5); //延时约5mslcden=0; //LCD使能端拉低电平}//**********写数据函数开始************void write_data(uchar dat){lcdrs=1; //低电平写数据P0=dat; //写入命令delay(3); //延时约3mslcden=1; //LCD使能端置高电平delay(5); //延时约5mslcden=0; //LCD使能端拉低电平}//**********键盘扫描函数开始**** void key_scan(){//**********扫描第一行*********P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xee:key_manage1();break;case 0xde:key_manage2();break;case 0xbe:key_manage3();break;case 0x7e:key_manage4();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第二行*********P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xed:key_manage5();break;case 0xdd:key_manage6();break;case 0xbd:key_manage7();break;case 0x7d:key_manage8();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第三行********* P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key_manage9();break;case 0xdb:key_manage10();break;case 0xbb:key_manage11();break;case 0x7b:key_manage12();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第四行********* P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key_manage13();break;case 0xd7:key_manage14();break;case 0xb7:key_manage15();break;case 0x77:key_manage16();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}//*********延时函数开始************** void delay(uint k){uint i,j;for(i=k;i>0;i--)for(j=50;j>0;j--);}//******键盘功能分配函数群开始********// 键盘功能示意图// 设计者:聂金波//** 1 ** 2 ** 3 ** 4 **//** 5 ** 6 ** 7 ** 8 **//** 9 ** 0 ** s ** c **//** M1** M2** M3** M4**void key_manage1(){tab_key[n]=0;n++;}void key_manage2(){tab_key[n]=1;n++;}void key_manage3(){tab_key[n]=2;n++;}void key_manage4() {tab_key[n]=3;n++;}void key_manage5() {tab_key[n]=4;n++;}void key_manage6() {tab_key[n]=5;n++;}void key_manage7(){tab_key[n]=6;n++;}void key_manage8(){tab_key[n]=7;n++;}void key_manage9() {tab_key[n]=8;n++;}void key_manage10(){tab_key[n]=9;n++;}void key_manage11() {tab_key[n]=10;n++;}void key_manage12(){tab_key[n]=11;n++;}void key_manage13(){tab_key[n]=12;n++;}void key_manage14(){tab_key[n]=13;n++;}void key_manage15(){tab_key[n]=14;n++;}void key_manage16(){tab_key[n]=15;n++;}Proteus仿真图依次从键盘输入:abcd 277817639 (本人QQ号)4X4矩阵键盘-Proteus截图。

基于单片机4X4矩阵键盘控制数码管显示的Proteus仿真

基于单片机4X4矩阵键盘控制数码管显示的Proteus仿真

P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
21 22 23 24 25 26 27 P2.6 28 P2.7
10 11 12 13 14 15 16 17
K0
K1
K4
K5
K8
K9
KC
KD
图 3-2:当按下 K4 键时,数码管显示数字‘4’
软件设计方面,我感觉到在编写循环嵌套程序时非常容易出错,需要反复的查错 和耐心的调试。我虽然能够编写出程序,其可读性却有待于提高。
经过这次仿真设计,我对 51 系统的单片机内部构造的了解认识有了一定程度的提 高。我体会到做设计是一项细致的工作,必须要投入时间及精力,要有耐心有韧性。
我相信这几次的仿真设计会为我以后的发展打下一定的基础,我会更加努力,争取 自己在单片机的开发上有更深层次的提高,与此同时经过此次仿真,锻炼了团队协作 能力。
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
21 22 23 24 25 26 27 P2.6 28 P2.7
10 11 12 13 14 15 16 17
K0
K1
K2
K3
K4

51单片机--矩阵键盘仿真

51单片机--矩阵键盘仿真

51单片机--矩阵键盘仿真矩阵键盘实验该实验采用proteus 7.4 sp3进行的仿真,仿真原理图如下图所示,该实验是4×4矩阵键盘实验,每按一个键最后一个数码管显示,原先显示的数左移一位,六位都显示后从新从第一个开始显示。

键盘输入值如下图键盘上标注。

输入0、1、2时的显示结果:有输入5、6、7后的显示结果:/********************************************************************** * 程序名; 矩阵键盘实验* 功能:数码管通过动态扫描显示键盘输入的数字,输入一个数,数码管上* 显示的数左移一位,达到六位后从第一个开始显示.* 编程者:ZPZ* 编程时间:2009/8/11**********************************************************************/ #include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charbit flag=0;uchar temp,i,m,s=0,s1,s2,s3,s4,s5;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void display(uchar a);void delay(uint z);void keyscan();void keyin(uchar zhi,uchar a,uchar b,uchar c,uchar d);/****************** 主函数*******************/ void main(){while(1){keyscan();if(flag==0){P1=0xff;P0=0xff;}if(flag==1){display(m);}}}/****************** 显示函数*******************/ void display(uchar a){if(s==1){P1=0x20;P0=table[a];s1=table[a];delay(1);}if(s==2){P1=0x10;P0=s1;delay(1);P1=0x20;P0=table[a];s2=table[a];delay(1);} if(s==3){P1=0x08;P0=s1;delay(1);P1=0x10;P0=s2;delay(1);P1=0x20;P0=table[a];s3=table[a];delay(1);} if(s==4){P1=0x04;P0=s1;delay(1);P1=0x08;P0=s2;delay(1);P1=0x10;P0=s3;delay(1);P1=0x20;P0=table[a];s4=table[a];delay(1);} if(s==5){P1=0x02;P0=s1;delay(1);P1=0x04;P0=s2;delay(1);P1=0x08;P0=s3;delay(1);P1=0x10;P0=s4;delay(1);P1=0x20;P0=table[a];s5=table[a];delay(1);} if(s==6){P1=0x01;P0=s1;delay(1);P1=0x02;P0=s2;delay(1);P1=0x04;P0=s3;delay(1);P1=0x08;P0=s4;delay(1);P1=0x10;P0=s5;delay(1);P1=0x20;P0=table[a];delay(1);}if(s>6){s=1;}}/****************** 延时子函数*******************/ void delay(uint z){uint j,k;for(j=z;j>0;j--)for(k=120;k>0;k--);}/****************** 键扫描函数*******************/ void keyscan(){P3=0xff;keyin(0xfe,0,1,2,3);keyin(0xfd,4,5,6,7);keyin(0xfb,8,9,10,11);keyin(0xf7,12,13,14,15);}/****************** 键输入函数*******************/void keyin(uchar zhi,uchar a,uchar b,uchar c,uchar d){P3=zhi;temp=P3;temp=P3&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=P3&0xf0;if(temp!=0xf0){temp=P3;temp=P3&0xf0;switch(temp){case(0xe0):m=a;break;case(0xd0):m=b;break;case(0xb0):m=c;break;case(0x70):m=d;break;default:break;}flag=1;delay(200);s++;if(s>6)s=1;}delay(10);}}。

Protues 仿真8051单片机实现矩阵键盘扫描

Protues 仿真8051单片机实现矩阵键盘扫描

Protues仿真8051单片机实现矩阵键盘扫描,7段数码管静态显示该例程使用80C52单片机实现矩阵键盘的扫描。

为简化程序,代码中定义了一个二维数组table[i][j]与矩阵键盘位置一一对应,方便键盘扫描的编写。

键盘扫描函数scan()通过写读、写读单片机P3口的状态确定按下键的位置,并改变i、j的值,并返回table[i][j],显示函数display(scan( ))将对应位置的字型输出到数码管上。

电路图中,键盘的1~4行分别与P3口的P3.0、P3.1、P3.2、P3.3连接。

程序中使用了行扫描函数linescan(uchar a,ucharnum),其中a分别是0xfe,0xfd,0xfb和0xf7,是向单片机P3的数,分别让是矩阵键盘的第1、2、3和4行变为低电平,然后从各列读取键盘按下位置。

num是行标号,扫描第一行时为0,依次递增。

数码管为共阳极7段数码管。

用两个74HC573锁存器分别控制段选(dula)和位选(位选)。

程序代码如下:#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbitdula=P2^6; //段选sbitwela=P2^7; //位选uchari,j,temp; //全局变量uchar code table[5][4]={0xc0,0xf9,0xa4,0xb0, //4*4键盘字型(共阳极)0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f}; //初始输出字型void init(); //初始化函数void delay(uint z); //延时函数uchar scan(); //键盘扫描函数void linescan(uchar,uchar);//行扫描函数void display(uchar); //显示//@@@@@@@@@@@@@ main函数void main(){init();while(1){display(scan());}}void init() //¥¥¥¥初始化{dula=0;wela=1;P0=0xff;wela=0;i=4; //初始化输出字型j=0;}void delay(uint z){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar scan() //¥¥¥¥键盘扫描{linescan(0xfe,0); //第1行扫描linescan(0xfd,1); //第2行扫描linescan(0xfb,2); //第3行扫描linescan(0xf7,3); //第4行扫描//返回输出字型return table[i][j];}void linescan(uchara,ucharnum) //¥¥¥¥行扫描{P3=a;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);P3=a;temp=P3;temp=temp&0xf0;if(temp!=0xf0){i=num; //扫描第i行switch(temp){case 0xe0:j=0; //第1列有键按下break;case 0xd0:j=1; //第2列按下break;case 0xb0:j=2; //第3列按下break;case 0x70:j=3; //第4列按下break;}while(temp!=0xf0) //松手检查,{temp=P3;temp=temp&0xf0;}}}}void display(ucharkeyno){dula=1;P0=keyno;dula=0;}。

单片机矩阵键盘及Protues仿真

单片机矩阵键盘及Protues仿真

单片机4*4 矩阵键盘程序及Protues仿真1、截图如下2、键盘及显示程序#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define key P1sbitledle二P3P;sbitlede二P3X;void delay(uint z)// 延迟函数{uintx,y;for(x=z;x>0;x--)for(y=112;y>0;y--);}uchar code table[]={〃显示数据编码0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x79,0x38,0x3f,0};//#include<keyboard.h>uchar keyboa rd 1 ()//带返回值的子程序:键盘扫描的子程序{uchartemp,num;key=0xfe;// 扫描要经过四个过程段,0xfe,0xfd,0xfb,0xf,temp=key;// 读取P3 口的信心temp=temp&0xf0;// 位与,为下面的判断提供条件while(temp!=0xf0)// 判断P3 口(即键盘)有无被按下,若是,于OxfO,否则等于{下delay(5);// 延时再做一次判断,消抖、防抖动temp=key;temp=temp&0xf0;while(temp!=0xf0){// 确定有按键被按下,进入判断阶段,以判断那一个键被按switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;则temp 不等temp=key;b「eak 」wh=e((DmpHoxfo)//建®>s〉w s鼬薄薄建斗〉淫CD m pH ox f o s 漠K i M w h =e ^^“w n^“H wt ^p 3口」w曲專>s宀CDmpHkewCD m p A e mP QO O x s s k ey Hxfd八CDmpHkewCD m p A e m p QO o x swhi-e((DmpHoxfo)宀 de-ay (5)-CDmpHkewCDm p A e m p QO o x s whi-e((DmpHoxfo)aempHkey 八swifchaemp)宀caseOxecknumGbreakcase oxdcknum6 breakcaseoxbcknumHdbreakcase 0X 72n u m H o?b「eak 」whi-e((DmpHoxfo)oempHkewtemp=temp&0xf0;}}}key=0xfb;temp=key;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=key;temp=temp&0xf0;while(temp!=0xf0){temp=key;switch(temp){case 0xeb:num=9;break;}case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}while(temp!=0xf0){temp=key;temp=temp&0xf0;}} key=0xf7; temp=key; temp=temp&0xf0; while(temp!=0xf0){delay (5); temp=key;temp=temp&0xf0;while(temp!=0xf0){temp=key;switch(temp){case 0xe7: num=13; break; case 0xd7: num=14;break;case 0xb7: num=15; break;case 0x7e:num=16;break;}while(temp!=0xf0){temp=key;temp=temp&0xf0;}}}return num;// 返回值,}void main(){lede=0; ledle=1;while (1){P2=table[keyboard1()];//P2=table[4];delay(5);}}。

基于Proteus软件的4x4矩阵键盘设计与仿真

基于Proteus软件的4x4矩阵键盘设计与仿真

基于Proteus软件的4x4矩阵键盘设计与仿真4*4矩阵键盘仿真摘要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。

单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。

由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。

单片机系统的开发过程中,程序设计语言的选择尤为重要。

C51提供高效的代码,结构化的编程和丰富的操作符,多被采用。

C51是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能,而且可以直接实现对硬件的控制。

本毕业设计以AT89S51芯片为核心,程序设计采用汇编语言,辅以必要的电路,并运用proteus软件设计了4*4矩阵键盘仿真。

目录前言 (1)第一章单片机的概述.................................................................. 2 1.1什么是单片机.......................................................................................2 1.2MCS-51单片机内部结构............................................................ 2 1.3单片机的应用领域 (3)1.4 AT89C51简介.......................................................................................4 第二章软件的介绍及使用............................................................ 7 2.2 Proteus软件的介绍和使用.................................................................. 7 2.1Keil uVision2软件的介绍和使用............................................................ 9 第三章系统总体设计..................................................................14 3.1 系统原理.......................................................................................... 14 3.2电路组成.......................................................................................... 14 3.2.1键盘部分..........................................................................................14 3.2.2LED显示.......................................................................................... 15 3.2.3晶振电路..........................................................................................16 3.3系统功能和原理图................................................................................. 16 3.3.1实现功能....................................................................................... 16 3.3.2硬件电路原理图.............................................................................. 16 3.4系统与硬件的连接................................................................................. 17 第四章系统软件设计........................................................................... 18 4.1程序流程图.......................................................................................... 18 4.2源程序................................................................................................ 18 第五章程序的编译调试与仿真............................................................... 21 5.1程序的编译 (21)5.2调试与仿真 (22)第六章结束语………………………………………………………………………………24 6.1论文总结…………………………………………………………………………………24 6.2工作展望.............................................................................................24 参考文献 (25)致谢 (25)前言随着人们生活水平的提高,19世纪兴起的数字电路以其先天的便捷、稳定的优点在现代电子技术电路中占有越来越重要的地位。

基于msc51单片机实现的四位4乘4矩阵键盘计算器的C语言程序及其PROTUES电路和仿真_课程设计报告

基于msc51单片机实现的四位4乘4矩阵键盘计算器的C语言程序及其PROTUES电路和仿真_课程设计报告

单片机原理及接口技术课程设计报告设计题目:计算器设计信息与电气工程学院二零一三年七月计算器设计单片机体积小,功耗小,价格低,用途灵活,无处不在,属专用计算机。

是一种特殊器件,需经过专门学习方能掌握应用,应用中要设计专用的硬件和软件。

近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。

与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。

影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。

其中系统的抗干扰性能是系统可靠性的重要指标。

数学是科技进步的重要工具,数据的运算也随着科技的进步越发变得繁琐复杂,计算器的出现可以大大解放人在设计计算过程中的工作量,使计算的精度、速度得到改善,通过msc51单片机,矩阵键盘和LED数码管可以实现简单的四位数的四则运算和显示,并当运算结果超出范围时予以报错。

注:这一部分主要描述题目的背景和意义,对设计所采取的主要方法做一下简要描述。

字数不要太多,300-500字。

另注:本文要当做模板使用,不要随意更改字体、字号、行间距等,学会使用格式刷。

文中给出的各项内容都要在大家的报告中体现,可采用填空的方式使用本模板。

1. 设计任务结合实际情况,基于AT89C51单片机设计一个计算器。

该系统应满足的功能要求为:(1) 实现简单的四位十进制数字的四则运算;(2) 按键输入数字,运算法则;(3) LED数码管移位显示每次输入的数据和运算结果;(4) 当运算结果超出范围时实现报错。

主要硬件设备:AT89C51单片机、LED数码管、矩阵键盘。

注:这一部分需要写明系统功能需求,用到的主要硬件(参考实验箱的说明书)。

2. 整体方案设计计算器以AT89C51单片机作为整个系统的控制核心,应用其强大的I/O功能和计算速度,构成整个计算器。

通过矩阵键盘输入运算数据和符号,送入单片机进行数据处理。

4.矩阵键盘实验

4.矩阵键盘实验

实验四矩阵键盘实验一、实验目的1.掌握矩阵键盘的工作原理;2.学会编写程序完成简单的键盘功能;3.熟悉proteus软件仿真环境,并掌握程序仿真能力。

二、实验内容编写程序,并在proteus里连接线路仿真完成简单的键盘显示功能:当按下其中的任意一个按键时,经过扫描后,在数码管上显示出该键对应的数字。

三、实验程序#include<reg52.h>#define uchar unsigned char #define uint unsigned int sbit dx=P2^6;sbit wx=P2^7;uchar num,temp,shuzhi; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0}; uchar keyscan();void delay (uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); }void main(){wx=1;P0=0xfe;wx=0;num=16;while(1){shuzhi=keyscan();dx=1;P0=table[shuzhi];dx=0;}}uchar keyscan() {P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=7;break;case 0xde:num=8;break;case 0xbe:num=9;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;while(temp!=0xf0){ temp=P3; switch(temp) { case 0xed:num=4;break; case 0xdd:num=5;break; case 0xbd:num=6;break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } }P3=0xfb; temp=P3;temp=temp&0xf0; while(temp!=0xf0) { delay(10);temp=P3;temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb:num=1;break; case 0xdb:num=2;break; case 0xbb:num=3;break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } }return num; }四、实验数据仿真图记录如下:五、实验心得通过此次实验我逐渐掌握了矩阵键盘的工作原理,也学会编写程序完成简单的键盘功能,进一步熟悉了proteus 软件仿真环境,并掌握程序仿真能力。

Proteus+keil仿真软件在单片机矩阵键盘教学中的应用

Proteus+keil仿真软件在单片机矩阵键盘教学中的应用

Proteus+keil仿真软件在单片机矩阵键盘教学中的应用作者:马华玲来源:《科教导刊》2014年第30期摘要单片机结合电子自动设计软件proteus+keil仿真软件的教学模式,使得教学效果相比纯理论教学提高很多,文章使用了proteus+keil实现单片机软件和硬件相结合的虚拟教学实验平台,并以4X4矩阵键盘为例,给出了proteus+keil仿真软件在单片机矩阵键盘中的应用。

关键词 proteus+keil 单片机教学矩阵键盘中图分类号:G424 文献标识码:A0 引言Proteus软件是英国Labcenter electronics公司出版的EDA工具软件。

它不仅具有其它EDA 工具软件的仿真功能,还能仿真单片机及外围器件。

它是目前最好的仿真单片机及外围器件的工具。

Keil是一款单片机开发系统平台,支持C语言、汇编、PLM、以及混合编程。

利用Proteus+keil 仿真软件来辅助单片机的教学具备以下意义:其一,在教学中老师可以直观展示各种硬件电路的设计,同时也可以向学生展示软件的编写过程和调试过程,使学生容易掌握单片机学习的各个过程。

其二,Proteus+keil仿真软件可使学生有更多的动手机会,包括硬件设计和软件调试,易于修改程序或者硬件电路的各种错误,在实际电路设计前使用仿真软件能有效缩短了单片机电路设计的时间,提高了电子电路设计的效率。

其三,利用Proteus+keil的仿真可以实现实践和理论相结合的一体化教学的效果,可以提高教学质量,对教学效果产生积极的影响。

本文将以单片机接口电路中的重要内容矩阵键盘的扫描为例,利用Proteus+keil仿真软件实现4X4矩阵键盘软硬件的三种扫描方式,并在仿真过程中遇到的问题给出相应的解决方案。

1 单片机矩阵键盘的扫描方式单片机连接矩阵键盘是为了节省单片机的I/O口,常用的有4X4,8X8等矩阵键盘,按键较多的一般要加扩展芯片,但按键使用较少时则直接连接到单片机的I/O口上,以节省硬件成本,下面以单片机直接连接4X4矩阵键盘为例,按下的按键返回值直接显示在共阴极数码管上,介绍Proteus软件仿真电路的三种扫描方式。

基于51单片机-STC-4X4矩阵键盘-实验-Proteus仿真-程序

基于51单片机-STC-4X4矩阵键盘-实验-Proteus仿真-程序

矩阵键盘显示调试实训
一、实训目的
1.学会使用I/O口的基本输入、输出功能。

2.了解矩阵键盘接口技术及编程方法。

二、原理图
图16-1 DA402矩阵键盘模块
三、实训模块
DA001 MCS51主机、DA102六位动态数码管显示、DA402矩阵键盘模块、DA701电源模块。

四、实训步骤
1.用8P扁平数据排线将“DA001 MCS51主机”的P0.0~P0.7(JD1口)、P
2.0~P2.7(JD3口)连接到“DA102 六位动态数码管显示”的A~DP(JD1口)、DIG1~DIG6(JD2口),“DA001 MCS51主机”的P1.0~P1.7(JD2口)连接到“DA402矩阵键盘模块”的JD1口。

2.接上各模块的电源。

3.将仿真器接头插到“DA001 MCS51主机”上的40P仿真接口(J10)中(注意方向)。

4.打开“V系列仿真器集成调试软件”,在软件中打开文件“…\THETDA-3 型实训程序\16 矩阵键盘\矩阵键盘.asm”。

5.将程序下载到仿真器中,全速运行程序。

6.现象:按下“DA402矩阵键盘模块”相应的按键,“DA102 六位动态数码管显示”显示相应数字。

7.也可以将编译生成的可执行文件用ISP烧录器烧录到89S52芯片中运行(ISP烧录器的使用查看附录1)。

51单片机教程:按键输入、矩阵按键(按键巧用)proteus仿真+keil

51单片机教程:按键输入、矩阵按键(按键巧用)proteus仿真+keil

51单⽚机教程:按键输⼊、矩阵按键(按键巧⽤)proteus仿真+keil⽂章⽬录IO⼝原理(P1⼝最简单,所以这⾥只介绍P1,其他IO⼝原理类似)P1⼝原理可以看到的是P1⼝的⼯作原理⽐较简单,⾸先⽤P1⼝做输⼊输出较为好理解。

1、内部总线:就是内部P1.X位寄存器的值,⽐如说内部总线P1.0上电压为0V,那么对应P1.0=0;内部总线P1.0上电压为5V,那么对应P1.0=1;2、P1.X引脚:对应单⽚机引脚接⼝3、读锁存器:读锁存器为1,允许读锁存器。

为0,不允许读锁存器。

4、读引脚:为0不允许读引脚,为1允许读引脚5、写锁存器:提供⼀个上升沿锁存数据(写数据到单⽚机IO⼝上时⾃动提供⼀个脉冲)⼏个核⼼问题:1、读锁存器与读引脚区别是什么?读锁存器:读锁存器Q的电平读引脚:读P1.X引脚的电平2、读锁存器与读引脚能不能同时读?不能,两个输⼊缓冲器只能同时打开⼀个,所以只能同时读取⼀个电平。

3、什么时候读锁存器,什么时候读引脚?凡属于读-修改-写⽅式的指令,从锁存器读⼊信号,其它指令则从端⼝引脚线上读⼊信号。

也就是说遇到读指令时,相应的输⼊缓冲器才会打开,⼀般是出于关闭状态4、如果P1.0⼝⼀开始置⼀,然后⽤按键拉低,松开按键后P1.0⼝会是低电平吗?不会,锁存器锁1,没有写⼊0之前⼀直输出1,按下按键只不过P1.0引脚变低了,松开后依然是⾼电平(有了以上知识,我们就可以轻松解决很多问题了)按键输⼊按键由于是机械结构,按下的时候难免产⽣抖动,⼀般抖动会在按下的时候与松开的时候产⽣,抖动时间⼤概是10ms⼆、打开proteus仿真,绘制电路功能:利⽤⼀个按键对⼀个发光⼆极管进⾏控制。

这个可以说是最简单的按键输⼊实验了!由于是51单⽚机,内部有上拉电阻,我们就不要浪费材料在按键上接上拉了三、打开keil,编写如下代码sbit key=P1^0;//定义key为P1.0sbit led=P2^0;//定义LED为P2.0void delay10(void)//延时10ms{int n=1000;while(n--);}void main(void){while(1){if(key==0)//读P1.0引脚,如果引脚为低电平,则进⼊if{delay10();//延时10ms消抖if(key==0)//再次判断按键是否按下,防⽌⼲扰,增强稳定{led =!led;//led状态改变while(key==0);//等待按键松开,防⽌往下执⾏}}}}博主有个疑问也很不解,当"key"换成"P2^0"后程序就不能正常运⾏了,知道的⼩伙伴能不能给我解解惑。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

void main()
{
disnum=16;
wela=0;
while(1)
{
P3=0xf0;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
temp=temp|0x0f;
P3=temp;
key=P3;
switch(key)
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
{
case 0xee : disnum=0;
2
break; case 0xde : disnum=1;
break; case 0xbe : disnum=2;
break; case 0x7e : disnum=3;
break; case 0xed : disnum=4;
break; case 0xdd : disnum=5;
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
21 22 23 24 25 26 27 P2.6 28 P2.7
10 11 12 13 14 15 16 17
K0
K1
K2
K3
K4
K5
K6
K7
K8
K9
KA
KB
KC
KD
KE
KF
3.仿真 C51 程序
3.电路图仿真效果
当按下键盘时,所显示的效果如图 3-1 至图 3-4
C1
22PF
C2
X1
U1
19 XTAL1
18 XTAL2
22PF
R1
10k
9 RST
C3
10u
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0/T2 P1.1/T2EX P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
2. 仿真电路图
仿真电路图,如图一
C1
22PF
C2
X1
U1
19 XTAL1
18 XTAL2
22PF
R1
10k
9 RST
C3
10u
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0/T2 P1.1/T2EX P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
AT89C52
6
7
break; case 0xe7 : disnum=12;
break; case 0xd7 : disnum=13;
break; case 0xb7 : disnum=14;
break; case 0x77 : disnum=15;
3
break; } } } P0=table_du[disnum]; } }
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
K2
K3
K6
K7
KA
KB
KE
KF
C1
22PF
C2
X1
U1
19 XTAL1
18 XTAL2
22PF
R1
10k
9 RST
C3
10u
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0/T2 P1.1/T2EX P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
AT89C52
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
21 22 23 24 25 26 27 P2.6 28 P2.7
10 11 12 13 14 15 16 17
K0
K1
K4
K5
K8
K9
KC
KD
图 3-2:当按下 K4 键时,数码管显示数字‘4’
Proteus
4x4 矩阵键盘控制数码管显示
班 级: 姓 名:
成 绩:
电信 13-2 段学亮 邓成智 崔俊杰 邓石磊 陈亮 高金玉
电子与信息工程学院 信息与通信工程系
1. 设计要求
单片机的 P3 口的 P3.0~P3.7 连接 4×4 矩阵键盘,P0 口控制一只数码管,当 4×4 矩 阵键盘中的某一按键按下时,数码管上显示对应的键号。例如,1 号键按下时,数码管显 示“1”, 14 号键按下时,数码管显示“E”等等.
1
{ uchar j,k; for(j=0;j<i;j++) for(k=0;k<200;k++);
}
uchar
code
table_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x7f8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,
0x8e,0xff};
AT89C52
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
5
C1
22PF
C2
X1
U1
19 XTAL1
18 XTAL2
22PF
R1
10k
9 RST
C3
10u
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0/T2 P1.1/T2EX P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
AT89C52
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
K2
K3
K6
K7
KA
KB
KE
KF
4
C1
22PF
C2
X1
U1
19 XTAL1
18 XTAL2
22PF
R1
10k
9 RST
C3
10u
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0/T2 P1.1/T2EX P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
AT89C52
图 1:4*4 键盘控制数码管显示
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; uchar disnum,temp,key; void delay(uchar i)
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
21 22 23 24 25 26 27 P2.6 28 P2.7
10 11 12 13 1K2
K3
K4
K5
K6
K7
K8
K9
KA
KB
KC
KD
KE
KF
图 3-3:当按下 K8 键时,数码管显示数字‘8’
break; case 0xbd : disnum=6;
break; case 0x7d : disnum=7;
break; case 0xeb : disnum=8;
break; case 0xdb : disnum=9;
break; case 0xbb : disnum=10;
break; case 0x7b : disnum=11;
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
相关文档
最新文档