例如:P1是按键,arr[4]4个数值 arr[0]=P1;后面同。

给一个键盘扫描程序参考:void delay(unsigned int a){unsigned int i,j;for(i=0;i

while(1){ LED = 0;//将这句安排在这里,原case后面的那些LED = 0;就可以全部不要了。LED=keyscan();switch(LED){ case 1:D1=~D1;break;case 2:D2=~D2;break;case 3:D3=~D3;break;case 4:D4=~D4

你把值保存到数组num[i]的一个元素中,再 i++。 i == 3,可令result=num[0]*100+num[1]*10+num[2],得到123。然后可以读这些数进行计算。

51单片机矩阵键盘输入的值保存到一个数组了里并显示出来最后再控制LED灯闪烁对应数值的次数

sbit S16 = P3^5; //接在P30口的按钮 sbit S15 = P3^4;sbit S14 = P3^6;sbit S13 = P3^7;//有按键控制时要加防抖动处理 void main (void){ unsigned int a = 0; //定义变量 while(1) {

// 单片机控制八个led灯, 仿真实例 可以改为 各种花样。include define uchar unsigned char define uint unsigned int unsigned char TAB[]= {0xff,0xaa,0xff,0xaa,0xff,0xaa,0xff,0xaa,0xff,0x00,0x

1:首先设定一个变量i,可以是从0到3循环的变化,2:再检测一个经过消抖处理的按键,按一下,即i+1 3:当i值为各个值时,执行相应的变换花样。流水灯参考程序 include include define uchar unsigned char uchar j,tmp

先写矩阵读取,在写LED的工作模式,调用对应工作模式就好了

unsigned int i,j;for(i=0;i

}} void main(void){// Write your code hereunsigned char ct=100;while (1) //主循环{switch(P1) //P1口作为独立按键输入端,检测端口电平并做如下判断{case 0xfe:P0=dofly_table[1];LED0=0;break;//0x

define uchar unsigned charconst tab[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d};const uchar led[]={0x01,0x01,0x04,0x08,0x10,0x20,0x40,0x80};void delay(){ uchar i;for(i=0;i<10;i++){;

用52单片机的4x4矩阵键盘的前八个键分别控制8个LED灯

const uchar led[]={0x01,0x01,0x04,0x08,0x10,0x20,0x40,0x80};void delay(){ uchar i;for(i=0;i<10;i++){;} } void keyscan(){ uchar a,b,c,i;P3=0x0f;a=P3;delay();P3=0xf0;b=P3;delay

八个灯接在单片机的P1口(P0,P2,P3,P4都一样)while(1){ delay(你想要延时的时间);P1=0xff;delay(你想要延时的时间);P1=0;} 注意led最好加驱动,不然单片机会坏的。

//0xfe = 1111 1110,//说明连接在P3.0端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P0=dofly_table[2];LED1=0;break;//调用表中的第三个//元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P

switch(P1){ case 0xfe:P0=0x01;break;case 0xfd:P0=0x02;break;case 0xfb:P0=0x04;break;case 0xf7:P0=0x08;break;case 0xef:P0=0x10;break;case 0xdf:P0=0x20;break;case 0xbf:P0=0x40;break;case 0x

八个按键可以用00-ff表达就是说如果按键为P2的话就可以P2=0x00此时无按键输出,0x01为第一个按键按下。但是要按照具体的外围情况来写 switch(local){ case 0:P2=0x01;P3=0x01;break;case 1:P2=0x02;P3=0x02;bre

void delay(unsigned int a){ unsigned int i,j;for(i=0;i

单片机中用矩阵键盘的8个按键分别控制8个LED,当按下时亮,松手时灭,用switch语句

假设矩阵键盘如上图,LED接P1.0,按键用S4 ORG 00H CLR P3.0 STATAR:JB P3.7,CLR P1.0 JNB P3.7,SETB P1.0 SJMP STATAR END

矩阵单片机怎么从矩阵键盘中提取一个按键来实现“按一下键切换一个LED灯亮”


键盘是最常用也是最主要的输入设备,通过键盘可以将英文字母、数字、标点符号等输入到计算机中,从而向计算机发出命令、输入数据等。 标准计算机键盘共104键,除26个字母键、符号键、数字键外,下面来介绍一下键盘常见按键的功能: 首先将电脑键盘分区: 一、功能键区: 1、ESC退出键:关闭当前窗口。 2、F1帮助键:打开当前应用程序的帮助窗口。 3、F2重命名:选中一个文件或文件夹点击F2快速重命名。 4、在桌面上按F3可打开搜索窗口。 5、F4打开浏览器地址栏列表。 6、F5刷新当前页面。 7、F6快速定位到地址栏。 8、F7在Windows中没有作用。 9、F8启动Windows系统时,显示启动菜单。 10、F9在Windows Media Player中减小音量 11、F10激活Windows或程序中的菜单、在Windows Media Player中加大音量 12、F11使当前资源管理器或浏览器变为全屏显示 13、F12在Word中可以快速打开另存为窗口 二、主键盘区: 1、Tab制表 2、Caps Lock大小写锁定 3、Shift上档 4、Ctrl控制 5、Ctrl右边的是窗口开始键 6、Alt换挡 7、右Ctrl左边的那个键相当于鼠标右键 8、此外还有字母键、数字键、符号键、空格键以及回车键 注: 1、下图区域的按键有两层,上层符号需按住Shift键来使用 2、Windows窗口键:打开开始菜单 3、Windows+D可以快速切换到桌面 三、编辑键区: 1、Print ScreenSysRq屏幕硬拷贝键(全屏截图键) 2、Scroll Lock滚动锁定键 3、Pause Break暂停或中断键 4、Insert插入字符开关键 5、Home起始键 6、Delete 删除 7、END 将光标移动到编辑窗口或非编辑窗口的第一行的最后字上 8、Page UP和Page Down:上下翻页 10、上下左右键 四、数字键符号键与主键盘区完全一致 1、NUM LOCK切换小键盘的数字键与方向键
为了去除按键抖动.因为机械是非常灵敏的,对于人来说,按键有两个状态 ,松开和按下,但是在两个即将触碰到的瞬间,电气设备会产生抖动结果就是设备感觉你非常快的按下松开按下松开.这可能造成你的软件错误.比如你按下按键,有一个变量就自增1,而抖动会让你感觉你按下了一次但是变量自增了N次. 延时是为了使机器在按键抖动的时候不去做任何响应从而去除按键抖动.而这个延时人是感觉不出来的.
四个按键,定义如下: KEY1 BIT P3.0 KEY2 BIT P3.1 KEY3 BIT P3.2 KEY4 BIT P3.3 按键处理程序: ;----------------------------------- READ_KEY: JB KEY1, K2 CALL DELAY JB KEY1, K2 JNB KEY1, $ PUSH ACC INC 75H MOV A, 75H CJNE A, #10, ZINT01 MOV 75H, #0 ZINT01: POP ACC JMP K_EXIT ;--------------- K2: JB KEY2, K3 CALL DELAY JB KEY2, K3 JNB KEY2, $ PUSH ACC INC 76H MOV A, 76H CJNE A, #10, ZINT01 MOV 76H, #0 ZINT01: POP ACC JMP K_EXIT ;--------------- K3: JB KEY3, K4 CALL DELAY JB KEY3, K4 JNB KEY3, $ PUSH ACC DEC 75H MOV A, 75H CJNE A, #255, ZINT03 MOV 75H, #9 ZINT03: POP ACC JMP K_EXIT ;--------------- K4: JB KEY4, K_EXIT CALL DELAY JB KEY4, K_EXIT JNB KEY4, $ PUSH ACC DEC 76H MOV A, 76H CJNE A, #255, ZINT04 MOV 76H, #9 ZINT04: POP ACC K_EXIT: RET ;--------------- DELAY: DJNZ R7, $ DJNZ R7, $ RET ;-----------------------------------
#include #define uchar unsigned char void delay(unsigned int a) { unsigned int i,j; for(i=0;i<a;i++) for(j=0;j<120;j++); } uchar kbscan(void) { unsigned char sccode,recode; P1=0x0f; //发0扫描,列线输入 if ((P2 & 0x0f) != 0x0f) //有键按下 { delay(20); //延时去抖动 if ((P1&0x0f)!= 0x0f) { sccode = 0xef; //逐行扫描初值 while((sccode&0x01)!=0) { P1=sccode; if((P1&0x0f)!=0x0f) { recode=(P1&0x0f)|0xf0; return((~sccode)+(~recode)); } else sccode=(sccode<<1)|0x01; } } } P0=0xff; return 0; //无键按下,返回0 } main() { unsigned char key; while(1) { key=kbscan(); switch(key) { case 0x11:P0=0xfe;break; case 0x12:P0=0xfd;break; case 0x14:P0=0xfb;break; case 0x18:P0=0xf7;break; //+ case 0x21:P0=0xef;break; case 0x22:P0=0xdf;break; case 0x24:P0=0xbf;break; case 0x28:P0=0x7f;break; //- default:break; } } }
[已完成!]电路图如下, #include #include unsigned char code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};void delay_ms(unsigned int ct) //延时{unsigned int t,i;for(i=0;i<ct;i++){t=115;while(--t);}} void main(void){// Write your code hereunsigned char ct=100;while (1) //主循环{switch(P1) //P1口作为独立按键输入端,检测端口电平并做如下判断{case 0xfe:P0=dofly_table[1];LED0=0;break;//0xfe = 1111 1110,//说明连接在P3.0端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P0=dofly_table[2];LED1=0;break;//调用表中的第三个//元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P0=table[3];LED2=0; break;case 0xf7:P0=table[4];LED3=0;break;case 0xef:P0=table[5];LED4=0;break;case 0xdf:P0=table[6];LED5=0;break;case 0xbf:P0=table[7];LED6=0;break;case 0x7f:P0=table[8];LED7=0;break;default:break; //如果都没按下,直接跳出}//主循环中添加其他需要一直工作的程序}} //如果帮到你的话,点一个赞吧!硬件电路工程师-帝国卫兵Tt
给一个键盘扫描程序参考:void delay(unsigned int a){ unsigned int i,j; for(i=0;i<a;i++) for(j=0;j<120;j++);}uchar kbscan(void){ unsigned char sccode,recode; P1=0x0f; //发0扫描,列线输入 if ((P2 & 0x0f) != 0x0f) //有键按下 { delay(20); //延时去抖动 if ((P1&0x0f)!= 0x0f) { sccode = 0xef; //逐行扫描初值 while((sccode&0x01)!=0) { P1=sccode; if((P1&0x0f)!=0x0f) { recode=(P1&0x0f)|0xf0; while((P1&0x0f)!=0x0f);//等待键抬起 return((~sccode)+(~recode)); } else sccode=(sccode<<1)|0x01; } } } return 0; //无键按下,返回0}uchar getkey(void){ unsigned char key,keyval=0xff; key=kbscan(); switch(key) { case 0x11:keyval=1;break; case 0x12:keyval=2;break; case 0x14:keyval=3;break; case 0x18:keyval=10;break; //+ case 0x21:keyval=4;break; case 0x22:keyval=5;break; case 0x24:keyval=6;break; case 0x28:keyval=11;break; //- case 0x41:keyval=7;break; case 0x42:keyval=8;break; case 0x44:keyval=9;break; case 0x48:keyval=12;break; //清除 case 0x81:keyval=13;break; case 0x82:keyval=0;break; case 0x84:keyval=14;break; //小数点 case 0x88:keyval=15;break; //确认 default:keyval=16;break; } return(keyval);}
例如按下1、2、3,我可以令result=num[0]*100+num[1]*10+num[2],得到123。 -- 每次怎么可能按下 1、2、3 ? 每次,只能按下一个。 你把值保存到数组num[i]的一个元素中,再 i++。 i == 3,可令result=num[0]*100+num[1]*10+num[2],得到123。 然后可以读这些数进行计算。