写了个单片机矩阵按键控制数码管显示数字的程序,只需要显示0到9就好了。但是自己写的调不出来,谢谢帮忙

2022-03-28 综合 56阅读

#include 

#define uchar unsigned char 

#define uint unsigned int 

uchar code table[]=

{

  0xc0,0xf9,0xa4,0xb0,

  0x99,0x92,0x82,0xf8,

  0x80,0x90,0x88,0x83,

  0xc6,0xa1,0x86,0x8e

} ;//共阳极数码管0 为亮

sbit wei=P1^0;

void delay(uchar t)//毫秒延

{

   uint i,j;

   for(i=0; i

      for(j=0; j

}

void display(uchar d)

{  

   P1=0x00;

   wei=1; //第一个数码管点亮

   P0=table[d];

       

}

 

void main()

{  

   uchar v,temp;

   uchar key_l,key_h;// 定义列和行

   uchar key;

   while(1)

   {

         P2=0xf0;

         temp=P2;

         temp=temp&0xf0;

         if(temp!=0xf0)  //检测到有按键按下

     {

      delay(10);//消抖

      if(temp!=0xf0)//再次确认一下有否真的有按下

      {

        temp=P2;//把这次的检测值作为真值

        key_l=temp&0xf0;

        P2=key_l|0x0f;//让低四位置1 1110 1111

        temp=P2;//赶紧读取P口值

        key_h=temp&0x0f;//得到行值 0000 1110

        key=key_l+key_h;//1110 0000

                     //+  0000 1110

                     //ee 1110 1110

       }

       

      switch(key)               

         {

            case 0xee:display(0);break;

            case 0xde:display(1);break;

            case 0xbe:display(2);break;

            case 0x7e:display(3);break;

            case 0xed:display(4);break;

            case 0xdd:display(5);break;

            case 0xbd:display(6);break;

            case 0x7d:display(7);break;

            case 0xeb:display(8);break;

            case 0xdb:display(9);break;

            case 0xbb:display(10);break;

            case 0x7b:display(11);break;

            case 0xe7:display(12);break;

            case 0xd7:display(13);break;

            case 0xb7:display(14);break;

            case 0x77:display(15);break;

        }

      }

     

   }

}

把行列扫描的值相加 key=key_l+key_h;  我也是调了很长时间 你要把原理彻底搞明白了 呵呵

声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com