基于51单片机的矩阵键盘+数码管电路及c代码(qin)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

矩阵键盘+数码管+51单片机+c代码+proteus调试图(designedbyqin)2014.8.18#includereg52.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedcharsbitwei_1=P2^0;sbitwei_2=P2^1;sbitwei_3=P2^2;sbitwei_4=P2^3;ucharcodetable[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x9c,0xf0,0xee,0x9e,0x8e,0x6e};//这里是0到9的专门给共阴数码管用的16进制编码还有几个我自己定义的字符ucharkey_tem[4];//这个数组用来保存矩阵键盘输入的4个键值uchartemp,zi,wei,control;uintkey;voiddelay_ms(uintz);voidled_disp(ucharwei2,ucharnum);voidled_init();ucharkey_putdown();voidkey_scan();voiddelay_ms(uintz){uinti;while(z--)for(i=110;i0;i--);}ucharkey_putdown(){P1=0xf0;if(P1==0xf0)_nop_();delay_ms(15);while(P1==0xf0){_nop_();return0;}return1;}voidkey_scan(){key=0;temp=0;//temp用来临时存放P1口的两次扫描结果P1=0xf0;temp=P1;temp=~((temp4)|0xf0);//temp右移4位再跟0xf0按位或再取反即可得到1,2,4,8中的任一个数,每个数代表一行或一列if(temp==1)key=0;elseif(temp==2)key=4;if(temp==4)key=8;elseif(temp==8)key=12;P1=0xff;//P1口本来是置0xf0,若要再次赋值则必须先把P1口置高,否则它会变成0x00P1=0x0f;temp=P1;temp=~(temp|0xf0);//这里不需要右移4位了if(temp==1)key=key+0;elseif(temp==2)key=key+1;if(temp==4)key=key+2;elseif(temp==8)key=key+3;}voidled_init(){wei_1=1;wei_2=1;wei_3=1;wei_4=1;P0=0x00;}voidled_disp(ucharwei2,ucharnum){P0=table[num];switch(wei2)//这个switch用来控制数码管的位选{case1:wei_1=1;wei_2=1;wei_3=1;wei_4=0;break;case2:wei_1=1;wei_2=1;wei_3=0;wei_4=1;break;case3:wei_1=1;wei_2=0;wei_3=1;wei_4=1;break;case4: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;}voidmain(){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;}while(1){switch(control)//这个switch用来控制数码管显示矩阵键盘已经输入过的值,因为数码管的结构问题,要让它显示已经输入过的值有点麻烦{case1:led_disp(1,key_tem[0]);break;case2:led_disp(1,key_tem[0]);led_disp(2,key_tem[1]);break;case3:led_disp(1,key_tem[0]);led_disp(2,key_tem[1]);led_disp(3,key_tem[2]);break;case4:led_disp(1,key_tem[0]);led_disp(2,key_tem[1]);led_disp(3,key_tem[2]);led_disp(4,key_tem[3]);break;}if(key_putdown())//这个if是转到第一个while的必要条件break;}}}

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功