电子琴C程序代码,四乘四矩阵键盘输入

合集下载

实验四4×4键盘输入

实验四4×4键盘输入

实验四: 4 × 4键盘输入实验一、实验目的:1.学习非编码键盘的工作原理和键盘的扫描方式。

2.学习键盘的去抖方法和键盘应用程序的设计。

二、实验原理:键盘是单片机应用系统接受用户命令的重要方式。

单片机应用系统一般采用非编码键4*4矩阵盘,需要由软件根据键扫描得到的信息产生键值编码,以识别不同的键。

本板采用键盘,行信号分别为P1.0-P1.3 ,列信号分别为P1.4-P1.7 。

具体电路连接见下图对于键的识别一般采用逐行(列)扫描查询法,判断键盘有无键按下,由单片机I/O口向键盘送全扫描字,然后读入列线状态来判断。

程序及流程图:ORG 0000HAJMP MAINORG 0000HAJMP MAINORG 0030HMAIN:MOV P2,#0F7HMOV P1,#0F0HMOV R7,#100DJNZ R7,$MOV A,P1ANL A,#0F0HXRL A,#0F0HJZ MAINLCALL D10MSMOV A,#00HMOV R0,AMOV R1,AMOV R2,#0FEH SKEY0:MOV A,R2MOVP1,AMOVR7,#10DJNZ R7,$MOVA,P1ANLA,#0F0HXRLA,#0F0HJNZ LKEYINC R0MOVA,R2RL AMOVR2,AMOVA,R0CJNE A,#04H,SKEY0AJMP MAIN LKEY:JNB ACC,4,NEXT1MOVA,#00HMOVR1,AAJMP DKEYNEXT1:JNB ACC.5,NEXT2MOVA,#01HMOVR1,AAJMP DKEYNEXT2:JNB ACC.6,NEXT3MOVA,#02HMOVR1,AAJMP DKEYNEXT3:JNB ACC.7,MAINMOVA,#03HMOVR1,AAJMP DKEY DKEY:MOV A,R0MOVB,#04HMULABADDA,R1AJMP SQRSQR:MOVDPTR,#TABMOVC A,@A+DPTRMOVP0,AAJMP MAINTAB:DB0C0H,0F9H,0A4H,0B0H,99H, 92H, 82H, 0F8H DB 80H, 90H, 88H, 83H, 0C6H,0A1H,86H, 8EH D10MS:MOV R6,#10L1:MOV R5,#248DJNZ R5,$DJNZ R6,L1RETEND流程图:结束三、思考题:总结 FPGA是如何识别按键的?与单片机读取键值有何不同?答:FPGA的所有 I/O 控制块允许每个 I/O 引脚单独配置为输入口 , 不过这种配置是系统自动完成的。

4X4矩阵式键盘输入程序

4X4矩阵式键盘输入程序

4*4键盘程序readkeyboard:begin: acall key_onjnz delayajmp readkeyboarddelay:acall delay10msacall key_onjnz key_numajmp beginkey_num:acall key_panl a,#0FFhjz beginacall key_ccodepush akey_off:acall key_onjnz key_offpop aretkey_on: mov a,#00horl a,#0fhmov p1,amov a,p1orl a,#0f0hcpl aretkey_p: mov r7,#0efhl_loop:mov a,r7mov p1,amov a,p1orl a,#0f0hmov r6,acpl ajz nextajmp key_cnext: mov a,r7jnb acc.7,errorrl amov r7,aajmp l_looperror:mov a,#00hretkey_c:mov r2,#00hmov r3,#00hmov a,r6mov r5,#04hagain1:jnb acc.0,out1rr ainc r2djnz r5, again1out1: inc r2mov a,r7mov r5,#04hagain2:jnb acc.4,out2rr ainc r3djnz r5,again2out2: inc r3mov a, r2swap aadd a,r3retkey_ccode:push aswap aanl a,#0fhdec arl a ;行号乘4rl amov r7,apop aanl a,#0fhdec aadd a,r7retdelay10ms:anl tmod,#0f0horl tmod,#01hmov th0,#0d8hmov tl0,#0f0hsetb tr0wait:jbc tf0,overajmp waitclr tr0over:ret单片机键盘设计(二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。

基于51单片机的4×4矩阵键盘电子琴

基于51单片机的4×4矩阵键盘电子琴

基于51单片机的4×4矩阵键盘电子琴基于51单片机的4×4矩阵键盘电子琴前些日子,做而论道写了一篇关于单片机发音的文章,后来,就不断有网友来电询问单片机电子琴的设计方法。

以前制作过一个24键(独立按键)的,程序是用汇编语言写的,估计多数人看不了。

下面,把新设计的16按键的电子琴,公布给网友。

电路图如下:图片链接:/picture/detail/b05f67dd8b5c82da3af4 83a4f974902b5660a0da制作说明:单片机采用51系列的都行,AT89C2051也可;图中没有画出复位和晶振电路,实际制作时,不可省略,晶振可以使用11.0592或12MHz;扬声器应该按照图中给出的附图加上驱动电路;显示器及七段译码器不接,单片机电子琴也可以正常工作。

74LS47 和数码管之间,应该接上“限流电阻”,约470 欧姆即可。

C语言程序如下:/************************************************************* * 程序功能 : 对4×4矩阵键盘进行扫描,显示键值和输出音响**************************************************************/ #include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit SPK = P3^7; //P3.7外接扬声器uint FreqTemp;unsigned int code Freqtab[] = { //定时半周期的初始值64021,64103,64260,64400, //低音3 4 5 664524,64580,64684,64777, //低音7,中音1 2 364820,64898,64968,65030, //中音4 5 6 765058,65110,65157,65178}; //高音1 2 3 4//关于半周期的初始值与频率的关系,可见:///do_sermon/item/8cff22baf5142245bb 0e1247/************************************************************* * 函数功能 : 用扫描法读 P1 外接4×4 键盘* 函数返回 : 按下键:返回0~15、如无键按下:返回16**************************************************************/ uchar Keyscan(void){uchar i, j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};for(j = 0; j < 4; j++) { //循环四次,扫描四行P1 = Buffer[j]; //在低四位分别输出一个低电平_nop_();temp = 0x80; //计划先读出P1.7位for(i = 0; i < 4; i++) { //循环四次,检查四列if(!(P1 & temp)) { //从高四位,截取1位return (i + j * 4); //返回取得的按键值}temp >>= 1; //换右边一位} }return 16; //没有键按下就返回16}/************************************************************** * 函数功能 : 将参数分成十位、个位,分别显示到P2* 输入 : k (键盘数值)*************************************************************** /void Display(uchar k){P2 = ((k / 10) << 4) + (k % 10);}/************************************************************** * 主函数*************************************************************** /void Main(void){uchar Key_Value = 16, Key_Temp1, Key_Temp2;//读出的键值TMOD = 0x01; //T0定时方式1ET0 = 1; //允许T0中断EX0 = 1; //允许X0中断EA = 1;while(1) {TR0 = 0; //暂不发音Key_T emp1 = Keyscan(); //读入按键if(Key_Temp1 != 16) { //有键按下Display(Key_Value); //显示键值、延时消抖Key_T emp2 = Keyscan(); //再读一次if (Key_Temp1 == Key_T emp2) {//两次相等Key_Value = Key_T emp1; //就确认下来FreqTemp = Freqtab[Key_Value]; //根据键值,取出定时半周期的初始值Display(Key_Value); //显示TR0 = 1; //启动定时器,发音while (Keyscan() < 16); //等待释放SPK = 1; //停止发音} } } }//===================================== ==========void T0_INT(void) interrupt 1{TL0 = FreqTemp; //载入定时半周期的初始值TH0 = FreqTemp >> 8;SPK = ~SPK; //发音}//===================================== ==========#单片机有关。

4X4矩阵式键盘输入程序

4X4矩阵式键盘输入程序

4*4 键盘程序readkeyboard: orl a,#0f0h mov a, r2begin: acall key_on mov r6,a swap a jnz delay cpl a add a,r3ajmp readkeyboard jz next retdelay:acall delay10ms ajmp key_c key_ccode:push a acall key_on next: mov a,r7 swap ajnz key_num jnb acc.7,error anl a,#0fhajmp begin rl a dec akey_num:acall key_p mov r7,a rl a ; 行号乘anl a,#0FFh ajmp l_loop 4jz begin error:mov a,#00h rl aacall key_ccode ret mov r7,apush a key_c:mov r2,#00h pop akey_off:acall key_on mov r3,#00h anl a,#0fh jnz key_off mov a,r6 dec apop a mov r5,#04h add a,r7ret again1:jnb acc.0,out1retkey_on: mov a,#00h rr a delay10ms: orl a,#0fh inc r2 anl tmod,#0f0h mov p1,a djnz r5, again1 orl tmod,#01h mov a,p1 out1: inc r2 mov th0,#0d8h orl a,#0f0h mov a,r7 mov tl0,#0f0h cpl a mov r5,#04h setb tr0ret again2:jnb acc.4,out2wait:jbc tf0,overkey_p: mov r7,#0efh rr a ajmp waitl_loop:mov a,r7 inc r3 clr tr0 mov p1,amov a,p1 djnz r5,again2out2: inc r3 单片机键盘设计over:ret二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。

4×4矩阵键盘数码管显现按键值程序

4×4矩阵键盘数码管显现按键值程序

4×4矩阵键盘数码管显现按键值程序4;x;4矩阵键盘数码管显现按键值程序//电路阐明如下。

//单片机:运用51系列兼容的即可;//4;x;4矩阵键盘:接在P1口;//两位数码显现器:P0口输出七段码,P2口输出位选码。

//===================================================== =========//C言语程序如下。

/****************************************************** ********文件名:KEY_LED.c*功用:对4;x;4矩阵键盘进行输出,在数码管后两位显现按键值。

******************************************************* *******/#includelt;reg51.h#includelt;intrins.h#defineuintunsignedint#defineucharunsignedchar//ucharcodetable[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x 01,0x09};ucharcodetable[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x8 0,0x90};/****************************************************** *********称谓:Delay_1ms()*功用:延时子程序,延时时刻为1ms*x*输入:x(延时一毫秒的个数)*输出:无******************************************************* ********/voidDelay_1ms(uintx){uinti;ucharj;for(i=0;ilt;x;i++)for(j=0;jlt;=148;j++);}/*******************************************************称谓:Keyscan()*功用:P1外接4;x;4按键,依照扫描法读出键值*输出:按键值0~15/如无键按下,回来16******************************************************* ********/ucharKeyscan(void){uchari,j,temp,Buffer[4]={0xef,0xdf,0xbf,0x7f};for(j=0;jlt;4;j++){//循环四次P1=Buffer[j];//在P1高四位别离输出一个低电平temp=0x01;//方案先判别P1.0位for(i=0;ilt;4;i++){//循环四次if(!(P1temp))//从P1低四位,截取1位return(i+j*4);//回来获得的按键值templt;lt;=1;//判别的位,左移一位}}return16;//判别完毕,没有键按下,回来16}//哈哈,实质性的句子不过8行,即是这么简练!/*******************************************************称谓:Display(uchark)*功用:将参数分红十位、个位别离显现*输入:k(键盘数值)*输出:P0口输出七段码,P2口输出位选码******************************************************* ********/voidDisplay(uchark){P2=0;//消隐P0=table[k/10];P2=0x02;Delay_1ms(5);//显现5ms十位P2=0;//消隐P0=table[k%10];P2=0x01;Delay_1ms(5);//显现5ms个位}/****************************************************** *********称谓:Main()*功用:主函数******************************************************* ********/voidMain(void){ucharKey_Value=16,Key_Temp1,Key_Temp2;//两次读出的键值while(1){//---------以下读入按键、消抖、等候按键开释P1=0xff;Key_Temp1=Keyscan();//先读入按键if(Key_Temp1!=16){//假如有键按下//Delay_1ms(10);//延时一下Display(Key_Value);//可用显现替代延时Key_Temp2=Keyscan();//再读一次按键if(Key_Temp1==Key_Temp2){//有必要是两次持平Key_Value=Key_Temp1;//才保留下来,这即是消除颤动while(Keyscan()lt;16)//等候按键开释Display(Key_Value);//等候时期显现键值//---------以下是对按键的处理Display(Key_Value);//显现键值}}Display(Key_Value);//没有按键按下,也显现键值}}//用PROTEUS仿真作业时的屏幕截图如下:。

4乘4矩阵式键盘使用

4乘4矩阵式键盘使用

4乘4矩阵式键盘在单片机中的应用--C语言下图为4*4键盘的结果图,用单片机的P1口接4×4矩阵键盘,接法如图所示,用数码管显示按键的值,按下键S1,数码管显示0,按下S2,数码管显示1,按下S16,显示F。

先看程序代码:#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//八段数码管对应0—F值。

void Delay_1ms(uint i)//1ms延时{uchar x, j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void delay()//消除按键抖动延时{int i,j;for(i=0; i<=10; i++)for(j=0; j<=2; j++);}uchar Keyscan(void){uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};for(j=0; j<4; j++){P1 = Buffer[j];delay();temp = 0x10;for(i=0; i<4; i++){if(!(P1 & temp)){return (i+j*4);}temp <<= 1;}}}void Main(void){uchar Key_V alue; //读出的键值while(1){P1 = 0xf0;if(P1 != 0xf0){Delay_1ms(15); //按键消抖if(P1 != 0xf0){Key_Value = Keyscan();}}P0 = table[Key_V alue];//P0口输出数据到数码管}}代码分析:程序从Main开始执行,Key_V alue用来存放Keyscan();的返回值,Key_V alue为1,则数码管会显示1。

基于51单片机4乘4矩阵键盘的设计

基于51单片机4乘4矩阵键盘的设计
case 0xbd:KEY=6;break;
case 0x7d:KEY=7;break;
case 0xeb:KEY=8;break;
case 0xdb:KEY=9;break;
case 0xbb:KEY=10;break;
case 0x7b:KEY=11;break;
case 0xe7:KEY=12;break;
控制任务:
编程实现4乘4的矩阵键盘控制连接在P0口和P1口上的16个LED,当按下某键并释放后只有对应的LED灯亮,例如按S0后D0亮,按S1后D1亮。
程序及仿真:
#include<reg51.h>
unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
b=P2;
a=a|b;
switch(a)
{
case 0xee:KEY=0;break;
case 0xde:KEY=1;break;
case 0xbe:KEY=2;break;
case 0x7e:KEY=3;break;
case 0xed:KEY=4;break;
case 0xdd:KEY=5;break;
{
P0=0xff;
P1=led[n-8];
}}
int main(void)
{
whilsplay(KEY);
}
return 0;
}
更多资源,请关注微博“风竹弈星”,私聊。
unsigned char KEY=0xff;
void keyscan(void)
{
unsigned char a,b;
P2=0xf0;//高四位作为输入(高电平),低四位输出低电平

4×4矩阵键盘的工作原理与编程

4×4矩阵键盘的工作原理与编程

4×4矩阵键盘的工作原理与编程ME300B单片机学习开发系统应用之三---4×4矩阵键盘的工作原理与编程作者:山西太原贵国庆本文介绍如何在ME300B型51/AVR单片机学习开发系统上使用数码管显示4×4矩阵键盘的键值。

一、硬件工作原理的简单介绍该实验使用ME300B上的8位数码管显示电路和4×4矩阵键盘电路。

现将这二部分的电路工作原理进行简单的介绍:1、4×4矩阵键盘的工作原理矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。

在行线和列线的每一个交叉点上,设置一个按键。

这样键盘中按键的个数是4×4个。

这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。

图1为ME300B矩阵键盘电路图,行线接P1.4-P1.7,列线接P1.0-P1.3。

地显示。

图3 数码管电路数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。

数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。

若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。

所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮度,又要数码管显示时不产生闪烁现象。

在ME300B单片机开发系统中使用数码管来显示信息时,要将JP2的2、3端短接。

见图3二、演示程序的编程方法1、4×4矩阵键盘的编程方法:1.1、先读取键盘的状态,得到按键的特征编码。

先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。

再从P1口的低四位输出低电平,高四位输出高电平,从P1口的高四位读取键盘状态。

将两次读取结果组合起来就可以得到当前按键的特征编码。

使用上述方法我们得到16个键的特征编码。

举例说明如何得到按键的特征编码:假设“1”键被按下,找其按键的特征编码。

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

电子琴C程序代码,四乘四矩阵键盘输入#include <reg52.h>
#define uchar unsigned char #define uint unsigned int
sbit duan=P 2八6;
sbit wei=P 2八7;
sbit bee=P 2八3;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code tablewe[]={
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe};
uchar disp[16]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; // 在里面输入按下键值为0~15 对应要显示的第一位码值uchar disp1[16]={0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x3f}; // 在里面输入按下键值为0~15 对应要显示的第二位码值unsigned char temp;
unsigned char key;
unsigned char i,j;
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]={
//63625, 63833, 64019, 64104, 64260, 64400, 64524 ,// 低音区:1 2 3 4
64580, 64685, 64778, 64820, 64898, 64968, 65030 ,// 中音区:1 2 3 4 5 65058, 65110, 65157, 65178, 65217, 65252, 65283 ,// 高音区:1 2 3 4 5
65297 ,// 超高音:1 }; // 音调数据表可改
void delay(uchar x)
uchar y,z;
for(y=x;y>0;y--)
for(z=0;z<110;z++);
void init()
TMOD=0x01;
ET0=1;
EA=1;
void display() {
for(i=0;i<2;i++)
P0=tablewe[i];
wei=1;
wei=0;
if(i==0)
P0=disp[key];
else
P0=disp1[key]; duan=1;
duan=0;
delay(4);
void main(void) { init();
while(1)
P3=0xef;
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f)
delay(5);
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f)
temp=P3;
temp=temp & 0x0f; switch(temp)
case 0x0e:
key=0;
break;
case 0x0d:
key=1;
break;
case 0x0b:
key=2;
break;
case 0x07:
key=3;
break;
temp=P3;
STH0=tab[key]/256; STL0=tab[key]%256; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f)
display();
temp=P3;
temp=temp & 0x0f;
P3=0xdf;
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f)
delay(5);
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f)
temp=P3;
temp=temp & 0x0f; switch(temp)
key=4;
case 0x0e:
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=7;
break;
temp=P3;
STH0=tab[key]/256; STL0=tab[key]%256; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f)
display();
temp=P3;
temp=temp & 0x0f;
}
P3=0xbf;
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f)
delay(5);
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f)
temp=P3;
temp=temp & 0x0f; switch(temp)
case 0x0e:
key=8;
break;
case 0x0d:
key=9;
break;
case 0x0b:
key=10;
break;
case 0x07:
key=11;
break;
temp=P3;
STH0=tab[key]/256; STL0=tab[key]%256; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f)
display();
temp=P3;
temp=temp & 0x0f;
P3=0x7f;
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f)
delay(5);
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f)
temp=P3;
temp=temp & 0x0f; switch(temp)
case 0x0e:
key=12;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
temp=P3;
STH0=tab[key]/256; STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
display();
temp=P3;
temp=temp & 0x0f;
bee=1;
TR0=0;
display();
void t0(void) interrupt 1 using 0
TH0=STH0;
TL0=STL0;
bee=~bee;
}。

相关文档
最新文档