找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 890|回复: 0
打印 上一主题 下一主题
收起左侧

stc89c52rc单片机矩阵键盘 线反转法

[复制链接]
跳转到指定楼层
楼主
ID:812531 发表于 2021-1-12 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 朝朝1 于 2021-1-14 17:56 编辑
  1. #include<reg52.h>


  2. #define DataPort P0
  3. sbit LATCH1=P2^6;
  4. sbit LATCH2=P2^7;
  5. sbit BEEP=P2^3;
  6. sbit key=P3^4;
  7. unsigned char num1;
  8. unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
  9.                                                    0x77,0x7c,0x39,0x5e,0x79,0x71};
  10. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  11. unsigned char TempData[8];

  12. void DelayUs2x(unsigned char t);
  13. void DelayMs(unsigned char t);
  14. void Display(unsigned char FirstBit,unsigned char Num);
  15. unsigned char KeyScan(void);
  16. unsigned char KeyPro(void);
  17. void Init_Timer0(void);
  18. void beep();


  19. void main (void)
  20. {

  21. unsigned char num;                  
  22. Init_Timer0();

  23. while (1)         
  24.   {


  25.         
  26.         KeyPro();        
  27. num=KeyPro();

  28. if(num!=0xff)
  29.    {        
  30.                                 TempData[1]=dofly_DuanMa[num1];


  31.                

  32.   }


  33.         
  34.         
  35.         }
  36.         
  37. }
  38.         
  39.         
  40. void DelayUs2x(unsigned char t)
  41. {   
  42. while(--t);
  43. }
  44. void DelayMs(unsigned char t)
  45. {

  46. while(t--)
  47. {
  48.      //????1mS
  49.      DelayUs2x(245);
  50.          DelayUs2x(245);                                                              
  51.          
  52. }
  53. }
  54. void Display(unsigned char FirstBit,unsigned char Num)
  55. {
  56.       static unsigned char i=0;
  57.          

  58.            DataPort=0;   //????,???????
  59.        LATCH1=1;     //???
  60.        LATCH1=0;

  61.        DataPort=dofly_WeiMa[i+FirstBit]; //???
  62.        LATCH2=1;     //???
  63.        LATCH2=0;

  64.        DataPort=TempData[i]; //?????,??
  65.        LATCH1=1;     //???
  66.        LATCH1=0;

  67.            i++;
  68.        if(i==Num)
  69.               i=0;


  70. }
  71. void Init_Timer0(void)
  72. {
  73. TMOD |= 0x01;          //????1,16????,??"|"?????????????????                     
  74. //TH0=0x00;              //????
  75. //TL0=0x00;
  76. EA=1;            //?????
  77. ET0=1;           //???????
  78. TR0=1;           //???????
  79. }
  80. void Timer0_isr(void) interrupt 1
  81. {
  82. TH0=(65536-2000)/256;                  //???? 2ms
  83. TL0=(65536-2000)%256;

  84. Display(0,8);       // ???????

  85. }

  86. unsigned char KeyScan(void)  //??????,?????????
  87. {
  88. unsigned char temp,num;//???????
  89. P3=0x0f;            //??????0
  90. temp=P3&0x0f;     //?????
  91. if(temp!=0x0f)    //?????????
  92. {
  93.   DelayMs(10);        //??
  94.   if((P3&0x0f)!=0x0f)
  95.   {
  96.    temp=P3&0x0f;  //?????
  97.     P3=temp|0xf0;  //???????
  98.     num=P3&0xf0;  //?????

  99.     while((P3&0xf0)!=0xf0);//???????

  100.     return(temp+num);//????????
  101.    }
  102.   }     //????
  103. }
  104. /*
  105. unsigned char KeyPro(void)
  106. {
  107. switch(KeyScan())
  108. {
  109.   case 0x7e:return 0;break;//0 ??????????????
  110.   case 0x7d:return 1;break;//1
  111.   case 0x7b:return 2;break;//2
  112.   case 0x77:return 3;break;//3
  113.   case 0xbe:return 4;break;//4
  114.   case 0xbd:return 5;break;//5
  115.   case 0xbb:return 6;break;//6
  116.   case 0xb7:return 7;break;//7
  117.   case 0xde:return 8;break;//8
  118.   case 0xdd:return 9;break;//9
  119.   case 0xdb:return 10;break;//a
  120.   case 0xd7:return 11;break;//b
  121.   case 0xee:return 12;break;//c
  122.   case 0xed:return 13;break;//d
  123.   case 0xeb:return 14;break;//e
  124.   case 0xe7:return 15;break;//f
  125.   default:return 0xff;break;
  126. }
  127. }
  128. */
  129. void beep()
  130. {
  131.     unsigned char y;

  132.         BEEP=0;
  133.           DelayMs(0.8);

  134.     BEEP=1;                      //?????
  135. }



  136. unsigned char KeyPro(void)
  137. {
  138. switch(KeyScan())
  139. {
  140.   case 0x7e:num1=0;break;//0 ??????????????
  141.   case 0x7d:num1=1;break;//1
  142.   case 0x7b:num1=2;break;//2
  143.   case 0x77:num1=3;break;//3
  144.   case 0xbe:num1=4;break;//4
  145.   case 0xbd:num1=5;break;//5
  146.   case 0xbb:num1=6;break;//6
  147.   case 0xb7:num1=7;break;//7
  148.   case 0xde:num1=8;break;//8
  149.   case 0xdd:num1=9;break;//9
  150.   case 0xdb:num1=10;break;//a
  151.   case 0xd7:num1=11;break;//b
  152.   case 0xee:num1=12;break;//c
  153.   case 0xed:num1=13;break;//d
  154.   case 0xeb:num1=14;break;//e
  155.   case 0xe7:num1=15;break;//f
  156.   default:return 0xff;break;
  157. }
  158. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表