C语言 4x4键盘扫描程序
4×4键盘扫描程序开启原理及实例(精心整理)

4×4键盘扫描程序开启原理及实例(精心整理)单片机4*4键盘扫描程序时如何开启的?按照行顺序,一行一行的开启,如下图:4*4共16键,假设P0.0-P0.3为H0-H3,P0.4-P0.7为L0-L3(列) L0 L1 L2 L3(行) H0 0 1 2 3H1 4 5 6 7H2 8 9 A BH3 C D E F首先让H0 = 0,然后依次检测L0-L3,看那个键按下了,则对应的L0-L3为0,这样第一行检测结束。
比如扫描H0行时第一个键按下了,则L0=0,获得的P0=0xee,你也可以返回一个值,比如就是0,来代表第一个键(0)被按下,这样依次检测就扫描满16个键就行了。
4*4键盘扫描程序#include //包含头文件#define uchar unsigned char#define uint unsigned intunsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-Fuchar keyscan(void);void delay(uint i);void main(){uchar key;P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符while(1){key=keyscan();//调用键盘扫描,switch(key){case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值case 0x7d:P0=dofly[1];break;//1case 0x7b:P0=dofly[2];break;//2case 0x77:P0=dofly[3];break;//3case 0xbe:P0=dofly[4];break;//4case 0xbd:P0=dofly[5];break;//5case 0xbb:P0=dofly[6];break;//6case 0xb7:P0=dofly[7];break;//7case 0xde:P0=dofly[8];break;//8case 0xdd:P0=dofly[9];break;//9case 0xdb:P0=dofly[10];break;//acase 0xd7:P0=dofly[11];break;//bcase 0xee:P0=dofly[12];break;//ccase 0xed:P0=dofly[13];break;//dcase 0xeb:P0=dofly[14];break;//ecase 0xe7:P0=dofly[15];break;//f}}}uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法{uchar cord_h,cord_l;//行列值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=P3&0xf0; //读入行线值return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}void delay(uint i)//延时函数{while(i--);}以下为详细解释:假设按下的是S1键进行如下检测(4*4键盘)先在P3口输出p3 00001111低四位行会有变化cord_h =00001111&00001110 =00001110if !=00001111延时0.1uscord_h=00001110&00001111=00001110if !=00001111P3再输出11111110P3 =00001110|11110000=11111110输出高四位cord_l=P3&0xf0 //此时P3口就是输入值01111110 而不是上面的11111110cord_l=01111110&11110000=01110000cord_h+cord_l=00001110+01110000=01111110=0x7e //此编码即为S1的编码#include //包含头文件#define uchar unsigned char#define uint unsigned intunsigned char const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-Fuchar keyscan(void);void delay(uint i);void main(){uchar key;P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符while(1){key=keyscan();//调用键盘扫描,switch(key){case 0x7e:P0=table[0];break;//0 按下相应的键显示相对应的码值case 0x7d:P0=table[1];break;//1case 0x7b:P0=table[2];break;//2case 0x77:P0=table[3];break;//3case 0xbe:P0=table[4];break;//4case 0xbd:P0=table[5];break;//5case 0xbb:P0=table[6];break;//6case 0xb7:P0=table[7];break;//7case 0xde:P0=table[8];break;//8case 0xdd:P0=table[9];break;//9case 0xdb:P0=table[10];break;//acase 0xd7:P0=table[11];break;//bcase 0xee:P0=table[12];break;//ccase 0xed:P0=table[13];break;//dcase 0xeb:P0=table[14];break;//ecase 0xe7:P0=table[15];break;//f}}}uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法{ uchar cord_h,cord_l;//行列值P3=0x0f; //行线输出全为0cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{delay(100); //去抖cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f){P3=cord_h|0xf0; //输出当前列线值cord_l=P3&0xf0; //读入行线值return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}void delay(uint i)//延时函数{while(i--);}在P3口做的键盘你的去抖检测没有做好通过电平输入来引发中断,必须是由P3.2或P3.3引脚输入,这样才能触发中断。
实验四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 引脚单独配置为输入口 , 不过这种配置是系统自动完成的。
4_4矩阵键盘扫描

//4*4矩阵式键盘扫描程序module keyscan(row, col, clk, key_buf);input [3:0] col; //列线定义input clk; //150MHZoutput [3:0] row; //行线定义output [7:0] key_buf; //键值输出口reg [3:0] row;reg [7:0] key_buf; //键值输出缓冲寄存器reg [7:0] key_buf1; //键值暂存器reg [3:0] count1;reg [14:0] count2;reg [3:0] state;reg [3:0] state_temp;reg sec, en;/*********************产生5MHZ方波****************/ always@(posedge clk )beginif(count1 == 4'd15)beginsec <= ~sec;count1 <= 4'd0;endelsecount1 <= count1+1'b1;endalways@(negedge sec)beginif(en)begincase(state)/******************** 准备进入行扫描状态*************/4'd0://KEY //开始扫描beginrow[3:0] <= 4'b0000; //行线全部置零state_temp = 4'd1;state = 4'd9; //5ms消抖end/*********************扫描第一行**********************/4'd1://KEYTEMPbeginif(col[3:0] == 4'b1111) //判断是否有键按下?state = 4'd0; //没有就重新扫描elsebeginrow[3:0] <= 4'b1110;state_temp = 4'd2;state = 4'd9; //如果有就延时去抖endend/********************检测第一行键值*******************/4'd2://ROW1begincase({row[3:0],col[3:0]}) //第一行判断8'b1110_1111: //无键按下beginkey_buf1 <= 8'b1111_1111;state = 4'd3; //进入第二行扫描end8'b1110_1110: //键值1beginkey_buf1 <= 8'b1111_1110; //键值放入key_buf1state = 4'd10; //等待弹起end8'b1110_1101: //键值2beginkey_buf1 <= 8'b1111_1101;state = 4'd10;end8'b1110_1011: //键值3beginkey_buf1 <= 8'b1111_1011;state = 4'd10;end8'b1110_0111: //键值4beginkey_buf1 <= 8'b1111_0111;state = 4'd10;enddefault:beginkey_buf1 <= 8'b1111_1111;state = 4'd3; //进入第二行扫描endendcaseend/*********************第二行扫描*********************/4'd3://ROW2TEMPbeginrow[3:0] <= 4'b1101;state_temp = 4'd4;state = 4'd9;end/***********************检测第二行键值***************/4'd4://ROW2begincase({row[3:0], col[3:0]})8'b1101_1111: //若无键按下beginkey_buf1 <= 8'b1111_1111;state = 4'd5; //进入第三行扫描end8'b1101_1110: //键值5beginkey_buf1 <= 8'b1110_1111;state = 4'd10; //等待弹起end8'b1101_1101: //键值6beginkey_buf1 <= 8'b1101_1111;state = 4'd10;end8'b1101_1011: //键值7beginkey_buf1 <= 8'b1011_1111;state = 4'd10;end8'b1101_0111: //键值8beginkey_buf1 <= 8'b0111_1111;state = 4'd10;enddefault:beginkey_buf1 <= 8'b1111_1111;state = 4'd5; //进入第三行扫描endendcaseend/**********************第三行扫描********************/4'd5://ROW3TEMPbeginrow[3:0] <= 4'b1011;state_temp = 4'd6;state = 4'd9;end/*********************检测第三行键值*****************/4'd6://ROW3begincase({row[3:0], col[3:0]})8'b1011_1111: //若无键按下beginkey_buf1 <= 8'b1111_1111;state = 4'd7; //进入第四行扫描end8'b1011_1110: //键值9beginkey_buf1 <= 8'b1111_1110;state = 4'd10; //等待弹起end8'b1011_1101: //键值10beginkey_buf1 <= 8'b1111_1100;state = 4'd10;end8'b1011_1011: //键值11beginkey_buf1 <= 8'b1111_1000;state = 4'd10;end8'b1011_0111: //键值12beginkey_buf1 <= 8'b1111_0000;state = 4'd10;enddefault:beginkey_buf1 <= 8'b1111_1111;state = 4'd7; //进入第四行扫描endendcaseend/********************第四行扫描**********************/4'd7://ROW4TEMPbeginrow[3:0] <= 4'b0111;state_temp = 4'd8;state = 4'd9;end/*********************检测第四行键值******************/ 4'd8://ROW4begincase({row[3:0], col[3:0]})8'b0111_1111: //若无键按下beginkey_buf1 <= 8'b1111_1111;state = 4'd0; //重新进入扫描end8'b0111_1110: //键值13beginkey_buf1 <= 8'b1110_0000;state = 4'd10; //等待弹起end8'b0111_1101: //键值14beginkey_buf1 <= 8'b1100_0000;state = 4'd10;end8'b0111_1011: //键值15beginkey_buf1 <= 8'b1000_0000;state = 4'd10;end8'b0111_0111: //键值16beginkey_buf1 <= 8'b0000_0000;state = 4'd10;enddefault:beginkey_buf1 <= 8'b1111_1111;state = 4'd0; //重新进入扫描endendcaseend/***********************去抖延时********************/ 4'd9://DELAYbeginif(count2 ==15'd25000)beginstate = state_temp;count2 <= 0;endelsecount2 <= count2+1'b1;end/************************等待弹起******************/ 4'd10://WAITbeginif(col[3:0] == 4'b1111)beginkey_buf <= key_buf1;state <= 4'd0;endelsestate = 4'd10;endendcaseend/*******************否则,变量初始化****************/ elsebeginstate = 4'd0;count2 <= 0;key_buf <= 8'b0000_0000;row[3:0] <= 4'b0000;en <= 1;endendendmodule附:程序配套的4*4矩阵键盘电路图其中:P2.3 ~P2.0对应row[3:0];P3.7 ~P3.4对应line[3:0]。
51单片机4×4矩阵按键扫描方法

key=0xf0;//低四位为0
if(key==0xf0)//若无变化,证明按键松开
return 0;//返回0
else//否则,按键未松开
return 1;//返回1
}
//*********主函数*********//
int main()
{
key=0xff;//按键初始化
led=0xff;//关闭LED灯
//送至led显示
/*
eg:如果是第三行第二列按键按下
则第3个、第6(2列+4)个LED灯亮
如下图所示(Proteus仿真电路图)
*/
}
}
led_arry[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数组定义,便于显示
//******检测是否有按键按下*****//
uchar Check_Button()
{
key=0x0f;//高四位为0
if(key==0x0f)//若无变化,证明无按键按下
return 0;//返回0
else//否则
return 1;//返回1
}
//********行检测********//
uchar Line[]={0x0e,0x0d,0x0b,0x07}; //那个按键按下,检测出的状态则对应数组中的第几个数
void Check_Line()
{
uchar i;
key=0x0f;//高四位为0
/*****4×4按键扫描******/
/***编程要点
1.首先检测是否有按键按下
2.若有按键按下,即进行行检测,列检测
3.行检测:高4位设为0,低4位为1,进行检测0x0f
4X4键盘扫描程序

4X4键盘扫描程序,采用查表方式,适用于AVR单片机。
此处为4X4键盘软件部分,硬件部分设计请参照:4X4键盘扫描电路分析。
此程序对应的键盘电路为:键盘状态扫描函数/*键盘扫描函数读取当前键盘的状态有按键按下返回相应按键值无按键按下返回"0x00"*/unsigned char key_read(void){unsigned char i;DDRA = 0x00;/*获取列地址*/PORTA = 0x0F;DDRA = 0xF0;i = PINA;DDRA = 0x00;/*获取行地址*/PORTA = 0xF0;DDRA = 0x0F;i |= PINA;DDRA = 0x00;/*输出复位*/PORTA = 0xFF;switch (i) {/*将按键码转换成键值*/case 0x00: return 0x00;case 0xEE: return '1';case 0xDE: return '2';case 0xBE: return '3';case 0x7E: return 'A';case 0xED: return '4';case 0xDD: return '5';case 0xBD: return '6';case 0x7D: return 'B';case 0xEB: return '7';case 0xDB: return '8';case 0xBB: return '9';case 0x7B: return 'C';case 0xE7: return '*';case 0xD7: return '0';case 0xB7: return '#';case 0x77: return 'D';default : return 0x00;}键盘读取函数/*按键获取函数获取按键信号,其中包含有状态记录及按键去颤抖。
4×4键盘扫描程序

键盘程序假设P2.0-P2.3为H0-H3,P2.4-P2.7为L0-L3 (列) L0 L1 L2 L3(行) H0 0 1 2 3H1 4 5 6 7H2 8 9 A BH3 C D E F首先,行为P2口的低四位,而列为高四位。
P0口为数码管输出口。
第一种思路就是逐行逐列判断法。
#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar code table[17] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//八段数码管对应0-F值. uchar temp;void Delay_1ms(uint i)//1ms延时{uint 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,row,col;temp=P2&0xf0;for(i=0; i<4; i++){if(!(temp&(0x10<<i)))row=i;}P2=0x0f;temp=P2&0x0f;for(j=0; j<4; j++){if(!(temp&(0x01<<j)))col=j;}return (row+col*4);}void Main(void){uchar Key_Value=16; //读出的键值uchar i=0;while(1){P2 = 0xf0;temp=P2;if(temp != 0xf0){Delay_1ms(80); //按键消抖if(temp != 0xf0){Key_Value = Keyscan();}Delay_1ms(350); //按键消抖}P0 = table[Key_Value];//P0口输出数据到数码管}次读取结果组合起来就可以得到当前按键的特征编码。
4乘4键盘实验报告1(1)

4乘4键盘实验报告一、摘要本系统以89C51集成块为核心器件,制作一种4横4列的键盘。
采用16个按钮式键盘,以及一个硬件复位器。
在按下其中一个按钮时,在键盘扫描程序的作用下,通过键盘扫描识别后,在数码管上显示出来;按下硬件复位器,数码管只显示小数点,实现复位。
本次设计代码采用C语言编制,方便简单,易于调试。
关键词:89C51,键盘,按纽,数码管二、硬件设计2.1、89C51简介89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。
89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU 和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。
89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:·与MCS-51 兼容·4K字节可编程闪烁存储器·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24MHz·三级程序存储器锁定·128*8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路2.2、元件分析与工作原理VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
一个改进型的44矩阵键盘扫描

一个改进型的4*4矩阵键盘扫描一个改进型的4*4矩阵键盘扫描----用了SWITCH CASE 嵌套之后程序循序简洁了好多#include;#define uchar unsigned char#define uint unsigned intuchar temp,num,bai,shi,ge;uchar key[]={0x3f,0x5f,0x6f};uchar code table[]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d , 0x07 , 0x7f ,0x6f };void keyscan();void delay(uchar z);void dsp(uchar bai,uchar shi,uchar ge);void main(){while(1){keyscan();dsp(bai,shi,ge);}}void delay(uchar z){uchar x,y;for(x=100;x--;x>;0)for(y=z;y--;y>;0);}void dsp(uchar bai,uchar shi,uchar ge) {bai=num/100;shi=num%100/10;ge=num%10;P0=0xfb;P2=table[bai];delay(1);P0=0xfd;P2=table[shi];delay(1);P0=0xfe;P2=table[ge];delay(1);}void keyscan(){ uchar i;for(i=0;i<3;i++){P1=key[i];temp=P1;temp&=0x0f;if(temp!=0x0f) //如果有键按下 {delay(5);temp=P1;temp&=0x0f;if(temp!=0x0f)//确实有键按下 {switch(temp){case 0x07:switch(i){case 1:num=5;break; case 2:num=9;break; };break;case 0x0b:switch(i) {case 0:num=2;break; case 1:num=6;break; case 2:num=10;break; };break;case 0x0d:switch(i) {case 0:num=3;break; case 1:num=7;break; case 2:num=11;break; };break;case 0x0e:switch(i) {case 0:num=4;break;case 2:num=12;break;};;break;while(temp!=0xf0) //松开手后就跳出循环,否则等待松手{temp=P1;temp=temp&0xf0;dsp(bai,shi,ge);}}}}}}。
4x4键盘的程序有扫描法与线反法

4x4键盘的程序有扫描法与线反法,但我个人认为用线反法较好,用扫描法得依次扫描所有行或列,如果用线反法就简单多了。
先使键盘的行置为低、列置为高(或列置为高、行置为低),接着读回端口的值。
比如:如果使用P0为键盘接口就先使低四位为低、高四位为高即P0=0xf0然后就读回P0口的值赋给一个变量,a=P0;紧接就给行列赋相反的值行置为高、列置为低(或列置为低、行置为高)即P0=0x0f然后就读回再与a运算就能得到唯一的识别码下面的程序就是用线反写一个4x4键盘识别程序:#include<AT89X52.H>#include<delay.h>#define KEY_SCAN P1#define uchar unsigned char//char num;/********************************//*函数名称:KEY_DOWN() *//*函数功能:延时子函数 *//*参数:无 *//*返回:返回1或0 *//*备注:1表示有键按下,0则无*//********************************/bit KEY_DOWN(){KEY_SCAN=0x0f; //先给键盘口赋个初值if(KEY_SCAN!=0x0f) //判断是有按键按下,即KEY_SCAN不等于初值时有键按下{delayms(10); //消抖if(KEY_SCAN!=0x0f) //再次判断是否真有键按下return 1; //真有就返回1没有返回零elsereturn 0;}elsereturn 0;}/********************************//*函数名称:SCAN_GET() *//*函数功能:键盘值函数 *//*参数:无 *//*返回:返回1或0 *//*备注:无 *//********************************/uchar SCAN_GET(){char button;uchar key_code;button=KEY_SCAN;KEY_SCAN=0xf0;button=(button|KEY_SCAN);while(KEY_SCAN!=0xf0);delayms(10);switch(button){case 0xd7: key_code='1';break;case 0xdb: key_code='2';break;case 0xdd: key_code='3';break;case 0xb7: key_code='4';break;case 0xbb: key_code='5';break;case 0xbd: key_code='6';break;case 0x77: key_code='7';break;case 0x7b: key_code='8';break;case 0x7d: key_code='9';break;case 0xeb: key_code='0';break;case 0xee: key_code=0xee;break;default : break;}return key_code;}////////////////////////////////////////////////////////////// //此程序是上两个程序结合的/********************************//*函数名称:Key_Get() *//*函数功能:键盘扫描函数 *//*参数:无 *//*返回:无 *//*备注:无 *//********************************/void Key_Get(){char button;KEY_SCAN=0x0f;if(KEY_SCAN!=0x0f){delayms(5);if(KEY_SCAN!=0x0f)button=KEY_SCAN;KEY_SCAN=0xf0;button=(button|KEY_SCAN);while(KEY_SCAN!=0xf0);switch(button){case 0xd7: num='1';P0=0x00;break; case 0xdb: num='2';P0=0x0f;break; case 0xdd: num='3';break;case 0xb7: num='4';break;case 0xbb: num='5';break;case 0xbd: num='6';break;case 0x77: num='7';break;case 0x7b: num='8';break;case 0x7d: num='9';break;case 0xeb: num='0';break;case 0xe7: num='a';break;case 0xed: num='b';break;case 0xee: num='c';break;case 0xde: num='d';break;case 0xbe: num='e';break;case 0x7e: num='f';break;default : break;}}}}qinglei120713的分享分享矩阵键盘C51程序(4*4)(来自互联网) 1111111111111111111111111111111111111111111111 11111111111111111111111111111111111111#include <reg51.h>#include <intrins.h>#define key_port P0 //键盘接口定义sbit key_port_0=key_port^0;sbit key_port_1=key_port^1;sbit key_port_2=key_port^2;sbit key_port_3=key_port^3;/*******************************STC89C59 单片机一毫秒延时函数*******************************/void delay_ms(unsigned int ms){unsigned int i,j;for( i=0;i<ms;i++)for(j=0;j<332;j++); //1947是STC89C58在22.1184MHz晶振下,通过软件仿真反复实验得到的数值}/**************************串口发送一个字符**************************/void com_send_dat( unsigned char dat){SBUF=dat;while (TI== 0);TI= 0 ;}/**************************串口初始化**************************/void init_com( void ){SCON=0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr //UART为模式1,8位数据,允许接收TMOD|=0x20 ; //TMOD: timer 1, mode 2, 8-bit reload //定时器1为模式2,8位自动重装TH1=0xfa ; //Baud:19200 fosc="22.1184MHzTL1=0xfa;PCON|=0x80; //SMOD=1;波特率加倍;ES=1; //Enable Serial InterruptTR1 = 1 ; // timer 1 run}/**************************键盘扫描函数**************************/unsigned char keyscan(void){unsigned char key,i;unsigned char co de key_table[16]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0x bb,0xb7,0x7e,0x7d,0x7b,0x77};key_port=0x0f; //确定行列位置if(key_port==0x0f)return(0);//无键按下返回0delay_ms(10); //调用延时函数,目的是去前沿键抖。
4x4键盘(任意同时按键按下有效)扫程序-数码管显示键值

}
}
void main()
{
unsigned char i, key_key[16];
while(1)
{
for(i=0;i<16;i++)
{
key_4x4();
duan_xuan();_xuan();
}
}
for(i=x;i>0;--i)
for(j=114;j>0;--j);
}
void duan_xuan()
{
wr=0; //时钟输入端WR置低电平
cs1=0;//cs1为低电平选通段码锁存IC
wr=1; //时钟输入端WR置高电平,WR得到上升沿
cs1=1;//cs1为高电平,段码锁存IC锁存输出保持不变
case 4:if(col3==0) key=3;n=5;break;
case 5:row1=0;row0=1;if(col0==0) key=4;n=6;break;
case 6:if(col1==0) key=5;n=7;break;
case 7:if(col2==0) key=6;n=8;break;
{
static unsigned char n=1;
// P2=0XFF;
switch(n)
{
case 1:row0=0;row3=1;if(col0==0) key=0;n=2;break;
case 2:if(col1==0) key=1;n=3;break;
case 3:if(col2==0) key=2;n=4;break;
C语言-4x4键盘扫描程序

C语言 4*4键盘扫描电路模块#include <reg51.h>#define uchar unsigned char //byte#define uint unsigned int //wordvoid keyscan(); //函数声明void fun0(); //定义每个按键的功能函数void fun1();void fun2();void fun3();void fun4();void fun5();void fun6();void fun7();void fun8();void fun9();void fun10();void fun11();void fun12();void fun13();void fun14();void fun15();/**************************************************************************** 主程序****************************************************************************/void main(void){while(1) //循环扫描{keyscan();}}/**************************************************************************** 按键功能函数 fun0~fun15****************************************************************************/ void fun0(void){ P3=0x00; }void fun1(void){ P3=0x01; }void fun2(void){ P3=0x02; }void fun3(void){ P3=0x03; } //fun4~fun15 略/**************************************************************************** 键盘扫描子程序 keyscan(); void keyscan(); //函数声明***** 无返回值,直接执行子函数功能fun0(); void fun0();//函数声明****************************************************************************/void keyscan(void){ unsigned char i,j;unsigned char n;P1=0xfe; n=P1; n&=0xf0; //扫描第一行if(n!=0xf0){ for(i=0;i<20;i++) for(j=0;j<250;j++); //延时P1=0xfe; n=P1; n&=0xf0;if(n!=0xf0){switch(n){case(0x70): fun0(); break;//按键 0 的函数功能 - 替换P3=0x00;case(0xb0): fun1(); break;//按键 1 的函数功能- 替换case(0xd0): fun2(); break;//按键 2 的函数功能- 替换case(0xe0): fun3(); break;//按键 3 的函数功能- 替换}}}P1=0xfd; n=P1; n&=0xf0; //扫描第二行if(n!=0xf0){ for(i=0;i<20;i++) for(j=0;j<250;j++);//延时P1=0xfd; n=P1; n&=0xf0;if(n!=0xf0){switch(n){case(0x70): P3=0x04; break;//按键 4 的函数功能- 替换 P3=0x04;case(0xb0): P3=0x05; break;//按键 5 的函数功能- 替换case(0xd0): P3=0x06; break;//按键 6 的函数功能- 替换case(0xe0): P3=0x07; break;//按键 7 的函数功能- 替换}}}P1=0xfb; n=P1; n&=0xf0; //扫描第三行if(n!=0xf0){ for(i=0;i<20;i++) for(j=0;j<250;j++); //延时P1=0xfb; n=P1; n&=0xf0;if(n!=0xf0){switch(n){case(0x70): P3=0x08; break;//按键 8 的函数功能- 替换P3=0x08;case(0xb0): P3=0x09; break;//按键 9 的函数功能- 替换case(0xd0): P3=0x0A; break;//按键 A 的函数功能- 替换case(0xe0): P3=0x0B; break;//按键 B 的函数功能- 替换}}}P1=0xf7; n=P1; n&=0xf0; //扫描第四行if(n!=0xf0){ for(i=0;i<20;i++) for(j=0;j<250;j++); //延时P1=0xf7; n=P1; n&=0xf0;if(n!=0xf0){switch(n){case(0x70): P3=0x0C; break;//按键 C 的函数功能- 替换 P3=0x0C; case(0xb0): P3=0x0D; break;//按键 D 的函数功能- 替换case(0xd0): P3=0x0E; break;//按键 E 的函数功能- 替换case(0xe0): P3=0x0F; break;//按键 F 的函数功能- 替换}}}}。
4×4键盘扫描原理图

#include <reg51.h> //头文件void main(void){int de = 500;P2 = 0xf0; //根据扫描原理:将行置低电平,列置高电平if((P2 & 0xf0) != 0xf0) //判断是否有键按下while(de--); //延时去抖动if((P2 & 0xf0) != 0xf0) //再次判断是否有键按下{P2= 0xfe; //扫描第一行if((P2 & 0xfe) == 0xee) //扫描第一行第一列P1 = 0x07; //显示第一个键if((P2 & 0xfe) == 0xde) //扫描第一行第二列P1 = 0x7f; //显示第二个键if((P2 & 0xfe) == 0xbe) //扫描第一行第三行P1 = 0x6f; //显示第三个键if((P2 & 0xfe) == 0x7e) //扫描第一行第四行P1 = 0x49; //显示第四个键//###########################P2 = 0xfd; //扫描第二行if((P2 & 0xfd) == 0xed) //扫描第二行第一列P1 = 0x66; //显示第五个键if((P2 & 0xfd) == 0xdd) //扫描第二行第二列P1 = 0x6d; //显示第六个键if((P2 & 0xfd) == 0xbd) //扫描第二行第三列P1 = 0x7d; //显示第七个键if((P2 & 0xfd) == 0x7d) //扫描第二行第四列P1 = 0x76; //显示第八个键//#############################P2 = 0xfb; //扫描第三行if((P2 & 0xfb) == 0xeb) //扫描第三行第一列P1 = 0x06; //显示第九个键if((P2 & 0xfb) == 0xdb) //扫描第三行第二列P1 = 0x5b; //显示第十个键if((P2 & 0xfb) == 0xbb) //扫描第三行第三列P1 = 0x4f; //显示第11个键if((P2 & 0xfb) == 0x7b) //扫描第三行第四列P1 = 0x40; //显示第12个键//##########################P2 = 0xf7; //扫描第四行if((P2 & 0xf7) == 0xe7) //扫描第四行第一列P1 = 0x01; //显示第13个键if((P2 & 0xf7) == 0xd7) //扫描第四行第二列P1 = 0x3f; //显示第14个键if((P2 & 0xf7) == 0xb7) //扫描第四行第三列P1 = 0x09; //显示第15个键if((P2 & 0xf7) == 0x77) //扫描第四行第四列P1 = 0x46; //显示第16个键}}//----------------------------------------------//行\列P2.4 p2.5 P2.6 P2.7// | | | |//P2.0-------|-------|--------|--------|----------//P2.1-------|-------|--------|--------|----------//P2.2-------|-------|--------|--------|-----------//P2.3-------|-------|--------|--------|----------。
C语言键盘扫描程序4

C语言键盘扫描程序4C语言键盘扫描程序4*4测试通过*/#includesbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P2_7=P2^7;sbit P3_7=P3^7;unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99, //0~4 0x92,0x82,0xF8,0x80,0x90, //5~90x88,0x83,0xC6,0xA1,0x86,0x8E}; //A~Fvoid KeyScan();void delay10ms(unsigned char time);void Dispaly(unsigned char k);void buzzer();unsigned char key,temp;void main() //主程序{while(1){KeyScan();}}void KeyScan() //按键扫描子程序{P1=0xFF;P1_0=0;temp=P1;temp&=0xF0;if(temp !=0xF0) {buzzer(); delay10ms(10); temp=P1; temp&=0xF0;if(temp !=0xF0) {temp=P1;temp&=0xF0; switch(temp) {case 0xE0:key=0;break; case 0xD0:key=4;break;case 0xB0:key=8;break; case 0x70:key=12;break; }Dispaly(key); }}P1=0xFF;P1_1=0;temp=P1;temp&=0xF0;if(temp !=0xF0) {buzzer(); delay10ms(10);temp=P1;temp&=0xF0;if(temp !=0xF0) {temp=P1;temp&=0xF0; switch(temp) {case 0xE0:key=1;break; case 0xD0:key=5;break; case 0xB0:key=9;break; case 0x70:key=13;break; }Dispaly(key); }P1=0xFF;P1_2=0;temp=P1;temp&=0xF0;if(temp !=0xF0) {buzzer(); delay10ms(10); temp=P1;temp&=0xF0;if(temp !=0xF0)temp=P1; temp&=0xF0; switch(temp) {case 0xE0: key=2;break; case 0xD0: key=6;break; case 0xB0: key=10;break; case 0x70: key=14;break; }Dispaly(key);}P1=0xFF;P1_3=0;temp=P1;temp&=0xF0;if(temp !=0xF0) {buzzer(); delay10ms(10); temp=P1;temp&=0xF0;if(temp !=0xF0) {temp=P1;temp&=0xF0;switch(temp) {case 0xE0: key=3;break; case 0xD0: key=7;break; case 0xB0: key=11;break; case 0x70: key=15;break; }Dispaly(key); }}}//延时程序void delay10ms(unsigned char time)unsigned char i;while(time--){for(i=0;i<120;i++) ;}}void Dispaly(unsigned char k) //显示程序{P0=table[k];P2_7=0;}void buzzer(){P3_7=0;delay10ms(20);P3_7=1;}6x3扫描键盘驱动程序(C语言编写)〖说明〗18个按键扫描驱动程序,横向扫描第一行:p0.6 第二行:p0.7 第三行:p2.6纵向扫描:第一行:p0.0 第二行:p0.1 第三行:p0.2 第四行:p0.3 第五行:p0.4 第六行:p0.5--------------------------------------------------------------------------------*///#i nclude "reg51.h"//#i nclude "lcd12864.h"#define port p0 //定义p0口sbit p2_6=p2^6; //定义p2.6口unsigned int zdtime=0; unsigned int pingbaotime=0; /*定义18个按键的返回值*/#define runkey 1#define stopkey 2#define upkey 3#define downkey 4#define a_c 5#define d_f 6#define g_i 7#define j_l 8#define m_o 9#define p_s 10#define t_v 11#define w_z 12#define pageupkey 13#define pagedownkey 14#define enterkey 15#define backkey 16#define chineseorenglish 17#define cancelkey 18//按键扫描函数unsigned char getkey(){unsigned char a,b;unsigned int delay=0; //延时变量port=0xff; //p0口复位p2_6=1; //p2.6复位//扫描第三行p2_6=0;while(!(port&0x01)){if(++delay>0x1ff0) { return(pagedownkey);}}while(!(port&0x02)){if(++delay>0x1ff0) { return(chineseorenglish); }}while(!(port&0x04)){if(++delay>0x1ff0) { return(backkey); }}while(!(port&0x08)){if(++delay>0x1ff0) { return(pageupkey); }}while(!(port&0x10)){if(++delay>0x1ff0) { return(cancelkey); }while(!(port&0x20)){if(++delay>0x1ff0) { return(enterkey);} }port=0xff; //p0口复位p2_6=1; //p2.6复位//扫描第一行port=0x7f;delay=0;while(!(port&0x01)){if(++delay>0x1ff0) { return(downkey);}if(delay>0xff0) { return(downkey); } while(!(port&0x02)) {if(++delay>0x1ff0) { return(stopkey);} }if(delay>0xff0) { return(stopkey); } while(!(port&0x04)) {if(++delay>0x5fd0) { return(w_z);}}if(delay>0xff0) { return(w_z); }while(!(port&0x08))if(++delay>0x5fd0) { return(t_v);} }if(delay>0xff0) { return(t_v); }while(!(port&0x10)){if(++delay>0x5fd0) { return(p_s);} }if(delay>0xff0) { return(p_s); } while(!(port&0x20)) {if(++delay>0x5fd0) { return(m_o);} }if(delay>0xff0) { return(m_o); }port=0xff; //p0口复位p2_6=1; //p2.6复位//扫描第二行port=0xbf;delay=0;while(!(port&0x01)){if(++delay>0x1ff0) { return(upkey);} }if(delay>0xff0) { return(upkey); } while(!(port&0x02)) {。
4x4矩阵键盘电路连接图和快速扫描完整程序

else
{
temp=_crol_(temp,1);
}
beis++;
if(beis==4)beis=0;
}
}
////////////////////////////////////////////////////////////////////
//主函数
void main()
{
while(1)
{
key_4x4();
xianshi(key);
}
}
//4*4矩阵扫描,键值保存在key中
void key_4x4()
{
P1=temp;//初值uchar temp=0xfe;
sm=P1;
sm=sm&0xf0;//取P1口高四位的值,如果为0就表示无键按下
if(sm!=0xf0)
{
switch(sm)
{
case 0x70:{key=0+4*beis;break;}
uchar temp=0xfe;//键盘扫描前赋给P1口的试探值
uchar beis=0x00;//键盘扫描的识别倍率
sbit LE1=P2^0;
sbit LE2=P2^1;
uchar key,sm;//key是扫描得到的键值;
////////////////////////////////////////////////////////////////////
case 0xb0:{key=1+4*beis;break;}
case 0xd0:{key=2+4*beis;break;}
case 0xe0:{key=3+4*beis;break;}
44键盘扫描代码

4*4键盘扫描代码#include;//#include ;//#include "STC12C5A60AD.H"//#include "STC12C5202AD.H"#define uchar unsigned char //变量类型标识的宏定义#define uint unsigned intcode ucharSEG7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0 x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};#define OFF 1#define ON 0sbit P2_0=P2^0;sbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P1_4=P1^4;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;uchar key_scan(void);//*********************************************** *****void delay(uint k){uint i,j;for(i=0;i<k;i++){for(j=0;j<120;j++);}}void mcu_init(void){delay(1000);}/***********主函数*********/void main(void){ uchar temp;mcu_init();while(1){temp=key_scan();if(temp<16) //如果有键按下{P0=SEG7[temp];//显示丝印符号P2_0=ON;}else P0=0x00; //否则熄灭显示}}//******************************************** //键值设定code uchar key_set[]={1, 2, 3, 10,4, 5, 6, 11,7, 8, 9, 12,15,0, 14,13};//******************************************** uchar key_scan(void){uchar key;bit find=0;P1=0xf0; //输入带有上拉电阻。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言 4*4键盘扫描电路模块
#include <reg51.h>
#define uchar unsigned char //byte
#define uint unsigned int //word
void keyscan(); //函数声明
void fun0(); //定义每个按键的功能函数
void fun1();
void fun2();
void fun3();
void fun4();
void fun5();
void fun6();
void fun7();
void fun8();
void fun9();
void fun10();
void fun11();
void fun12();
void fun13();
void fun14();
void fun15();
/******************************************************************** ********
主程序
********************************************************************* *******/
void main(void)
{
while(1) //循环扫描
{
keyscan();
}
}
/******************************************************************** ********
按键功能函数 fun0~fun15
********************************************************************* *******/
void fun0(void)
{ P3=0x00; }
void fun1(void)
{ P3=0x01; }
void fun2(void)
{ P3=0x02; }
void fun3(void)
{ P3=0x03; } //fun4~fun15 略
/******************************************************************** ********
键盘扫描子程序 keyscan(); void keyscan(); //函数声明
***** 无返回值,直接执行子函数功能fun0(); void fun0();//函数声明
********************************************************************* *******/
void keyscan(void)
{ unsigned char i,j;
unsigned char n;
P1=0xfe; n=P1; n&=0xf0; //扫描第一行
if(n!=0xf0)
{ for(i=0;i<20;i++) for(j=0;j<250;j++); //延时
P1=0xfe; n=P1; n&=0xf0;
if(n!=0xf0)
{switch(n)
{
case(0x70): fun0(); break;//按键 0 的函数功能 - 替换P3=0x00;
case(0xb0): fun1(); break;//按键 1 的函数功能- 替换
case(0xd0): fun2(); break;//按键 2 的函数功能- 替换
case(0xe0): fun3(); break;//按键 3 的函数功能- 替换
}
}
}
P1=0xfd; n=P1; n&=0xf0; //扫描第二行
if(n!=0xf0)
{ for(i=0;i<20;i++) for(j=0;j<250;j++);//延时
P1=0xfd; n=P1; n&=0xf0;
if(n!=0xf0)
{switch(n)
{
case(0x70): P3=0x04; break;//按键 4 的函数功能- 替换 P3=0x04;
case(0xb0): P3=0x05; break;//按键 5 的函数功能- 替换
case(0xd0): P3=0x06; break;//按键 6 的函数功能- 替换
case(0xe0): P3=0x07; break;//按键 7 的函数功能- 替换
}
}
}
P1=0xfb; n=P1; n&=0xf0; //扫描第三行
if(n!=0xf0)
{ for(i=0;i<20;i++) for(j=0;j<250;j++); //延时
P1=0xfb; n=P1; n&=0xf0;
if(n!=0xf0)
{
switch(n)
{
case(0x70): P3=0x08; break;//按键 8 的函数功能- 替换P3=0x08; case(0xb0): P3=0x09; break;//按键 9 的函数功能- 替换
case(0xd0): P3=0x0A; break;//按键 A 的函数功能- 替换
case(0xe0): P3=0x0B; break;//按键 B 的函数功能- 替换
}
}
}
P1=0xf7; n=P1; n&=0xf0; //扫描第四行
if(n!=0xf0)
{ for(i=0;i<20;i++) for(j=0;j<250;j++); //延时
P1=0xf7; n=P1; n&=0xf0;
if(n!=0xf0)
{
switch(n)
{
case(0x70): P3=0x0C; break;//按键 C 的函数功能- 替换 P3=0x0C; case(0xb0): P3=0x0D; break;//按键 D 的函数功能- 替换
case(0xd0): P3=0x0E; break;//按键 E 的函数功能- 替换
case(0xe0): P3=0x0F; break;//按键 F 的函数功能- 替换
}
}
}
}。