单片机44矩阵键盘控制数码管如何写最简单

  单片机4*4矩阵键盘控制数码管如何写最简单

  注册游戏账号◀◀◀点击图片进入游戏————◀◀◀◀———点击图片进入游戏———扑克牌技巧,真钱扎金花游戏,现金扎金花游戏

  第一次写,也算是对我研究了几天的代码做一个总结
程序基于AT89S51芯片,两个573锁存器(控制 段选位选)
P3口接矩阵键盘,其中P3.0~P3.3接行线,P3.4~P3.7接列线,P0口接共阴极7段数码管。


反转法的原理:
反转法就是通过给单片机的端口赋值两次,最后得出所按键的值的一种算法。


给P3口赋值0x0f,即00001111,假设0键按下了,则这时P3口的实际值为00001110;
给P3口再赋值0xf0,即11110000,如果0键按下了,则这时P3口的实际值为11100000;
通过这两次P3口的实际值相加得11101110,即0xee。


由此我们便得到了按下0键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,矩阵键盘编程问题也就解决了,也就是程序的算法已经有了。


(上述方法来源于网络)
好了下面直接进入程序
#include<at89x52.h> //头文件

  #define uchar unsigned char //宏定义

  #define uint unsigned int

  uchar key,n,i; //定义变量

  uchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //反转法矩阵键盘的各个按键的计算值

  uchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管显示0~F

  void delay(uint i) //延时函数

  {

   while(i--);

  }

  void keyscan()

  {

   uchar l,h,i; //定义局部变量,用l得出低4位的值,用h得出高4位的值

   P3=0x0f; //给P3赋值00001111

   l=P3&0x0f;

   if(l!=0x0f)

   {

   delay(100); //延迟后再检测

   P3=0x0f;

   l=P3&0x0f;

   if(l!=0x0f)

   {

   h=P3&0xf0; //若有键按下,得出高四位的值

   P3=0xf0; //给P3赋值11110000

   h=P3&0xf0; //若有键按下,得出低四位的值

   key=l+h; //高4位的值与低4位的值相加

   for(i=0;i<16;i++)

   {

   if(key==table[i]) //通过查表得出n的值

   n=i;

   }

   }

   }

   }

  void main()

  {

  while(1)

   {

   keyscan();

   for(i=0;i<6;i++) //送入位选信号控制数码管

   {

   P2_6=1;P2_7=0;

   P0=yin[n];

   P2_6=0;P2_7=1;

   switch(i)

   {

   case 0:P0=0xfe;break;

   case 1:P0=0xfd;break;

   case 2:P0=0xfb;break;

   case 3:P0=0xf7;break;

   case 4:P0=0xef;break;

   case 5:P0=0xdf;break;

   default:break;

   }

   P2_6=0;P2_7=0;

   delay(100);

   }

   }

  } 新手标注可能不够到位,多多理解,如有错误请多多指教。

  单片机4*4矩阵键盘控制数码管如何写最简单

Comments

Popular posts from this blog

听到的几个很好笑的滚球解释

布琼布拉博彩公司,布琼布拉博彩网站

捕鱼游戏怎么赚话费