找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机没有任何错误警告实验效果完全没有,矩阵按键的

[复制链接]
跳转到指定楼层
楼主
ID:1062123 发表于 2023-2-8 12:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned  int u16;
#define KEY_MATRIX_PORT P1
#define SMG_PORT P0
u8 gsmg_code[17]={0x3f,0x0b,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay_10us(u16 ten_us)
{
        while(ten_us--);
}
u8 key_matrix(void)
{
        u8 key_is=0;
         KEY_MATRIX_PORT=0xf7;
         if( KEY_MATRIX_PORT!=0xf7)
         {         delay_10us(1000);
                 switch( KEY_MATRIX_PORT)
                {
                        case 0x77:key_is=1;break;
                        case 0xb7:key_is=5;break;
                        case 0xd7:key_is=9;break;
                        case 0xe7:key_is=13;break;
                }         
         }
         while(KEY_MATRIX_PORT!=0xf7);
         return key_is;
         KEY_MATRIX_PORT=0xfb;
         if( KEY_MATRIX_PORT!=0xfb)
         {          delay_10us(1000);
                 switch( KEY_MATRIX_PORT)
                {
                        case 0x7b:key_is=2;break;
                        case 0xbb:key_is=6;break;
                        case 0xdb:key_is=10;break;
                        case 0xeb:key_is=14;break;
                }         
         }
         while(KEY_MATRIX_PORT!=0xfb);
         return key_is;
KEY_MATRIX_PORT=0xfd;
         if( KEY_MATRIX_PORT!=0xfd)
         {           delay_10us(1000);
                 switch( KEY_MATRIX_PORT)
                {
                        case 0x7d:key_is=3;break;
                        case 0xbd:key_is=7;break;
                        case 0xdd:key_is=11;break;
                        case 0xed:key_is=15;break;
                }         
         }
         while(KEY_MATRIX_PORT!=0xfd);
         return key_is;
         KEY_MATRIX_PORT=0xfe;
         if( KEY_MATRIX_PORT!=0xfe)
         {           delay_10us(1000);
                 switch( KEY_MATRIX_PORT)
                {
                        case 0x7e:key_is=4;break;
                        case 0xbe:key_is=8;break;
                        case 0xde:key_is=12;break;
                        case 0xee:key_is=16;break;
                }         
         }
         while(KEY_MATRIX_PORT!=0xfe);
         return key_is;
}                                          
void main()
{        u8 key=0;
        while(1)
        {
                key=key_matrix();
               
                SMG_PORT=gsmg_code[key-1];
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2023-2-8 14:32 | 只看该作者
  1. #include <REG51.H>
  2. typedef unsigned char u8;
  3. typedef unsigned  int u16;
  4. #define KEY_MATRIX_PORT P1
  5. #define SMG_PORT P0
  6. u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,
  7. 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
  8. 0x39,0x5e,0x79,0x71,0x40};
  9. u8 key_is=16;

  10. void delay_10us(u16 ten_us)
  11. {
  12.         while(ten_us--);
  13. }
  14. void  key_matrix(void)
  15. {
  16.         static bit a=0;
  17.         KEY_MATRIX_PORT=0xf0;
  18.         if(KEY_MATRIX_PORT!=0xf0)
  19.         {
  20.                 delay_10us(1000);
  21.                 if(KEY_MATRIX_PORT!=0xf0 && a==0)
  22.                 {
  23.                         a=1;
  24.                         switch(KEY_MATRIX_PORT)
  25.                         {
  26.                                 case(0Xe0):key_is = 0;break;
  27.                                 case(0Xd0):key_is = 1;break;
  28.                                 case(0Xb0):key_is = 2;break;
  29.                                 case(0X70):key_is = 3;break;
  30.                         }         
  31.                         KEY_MATRIX_PORT=0x0f;
  32.                         switch(KEY_MATRIX_PORT)
  33.                         {
  34.                                 case(0X0e):key_is += 0;break;
  35.                                 case(0X0d):key_is += 4;break;
  36.                                 case(0X0b):key_is += 8;break;
  37.                                 case(0X07):key_is +=12;break;
  38.                         }
  39.                 }
  40.         }
  41.         else                                //按键抬起
  42.         {
  43.                 a=0;
  44.         }
  45. }
  46. void main()
  47. {
  48.         while(1)
  49.         {
  50.                 key_matrix();
  51.                 SMG_PORT=gsmg_code[key_is];
  52.         }
  53. }
复制代码


回复

使用道具 举报

板凳
ID:161164 发表于 2023-2-8 14:46 | 只看该作者
真机还是仿真?
回复

使用道具 举报

地板
ID:275826 发表于 2023-2-8 15:05 | 只看该作者
KEY_MATRIX_PORT=0xf7;          if( KEY_MATRIX_PORT!=0xf7)          {       delay_10us(1000);                  switch( KEY_MATRIX_PORT&0xf0)                 {                         case 0x70:key_is=1;break;                         case 0xb0:key_is=5;break;                         case 0xd0:key_is=9;break;                         case 0xe0:key_is=13;break;                 }                                         while(KEY_MATRIX_PORT&0xf0!=0xf0);                             return key_is;                                 }
回复

使用道具 举报

5#
ID:94031 发表于 2023-2-8 15:58 | 只看该作者
改了一下,请参考。

#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned  int u16;
#define KEY_MATRIX_PORT P1
#define SMG_PORT P0
u8 gsmg_code[17]={0x3f,0x0b,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

u8 key_matrix(void)
{
        u8 jisu;
        u8 key_is=0;

        KEY_MATRIX_PORT=0xf7;
        jisu=0;
        while( KEY_MATRIX_PORT!=0xf7)
        {
                 switch( KEY_MATRIX_PORT)
                {
                        case 0x77:key_is=1;break;
                        case 0xb7:key_is=5;break;
                        case 0xd7:key_is=9;break;
                        case 0xe7:key_is=13;break;
                }
                jisu=jisu+1;if(jisu>200){break;}
        }
         
         KEY_MATRIX_PORT=0xfb;
        jisu=0;
        while( KEY_MATRIX_PORT!=0xfb)
        {   
                switch( KEY_MATRIX_PORT)
                {
                        case 0x7b:key_is=2;break;
                        case 0xbb:key_is=6;break;
                        case 0xdb:key_is=10;break;
                        case 0xeb:key_is=14;break;
                }
                jisu=jisu+1;if(jisu>200){break;}
         }
                  
   KEY_MATRIX_PORT=0xfd;
         jisu=0;
         while( KEY_MATRIX_PORT!=0xfd)
         {     
                 switch( KEY_MATRIX_PORT)
                 {
                                case 0x7d:key_is=3;break;
                                case 0xbd:key_is=7;break;
                                case 0xdd:key_is=11;break;
                                case 0xed:key_is=15;break;
                 }
                 jisu=jisu+1;if(jisu>200){break;}
         }
                                 
         KEY_MATRIX_PORT=0xfe;
         jisu=0;
         while( KEY_MATRIX_PORT!=0xfe)
         {        
                        switch( KEY_MATRIX_PORT)
                        {
                                case 0x7e:key_is=4;break;
                                case 0xbe:key_is=8;break;
                                case 0xde:key_is=12;break;
                                case 0xee:key_is=16;break;
                        }
      jisu=jisu+1;if(jisu>200){break;}                       
         }
         return key_is;
}                                          
void main()
{
        u8 key=0;
        while(1)
        {
                key=key_matrix();
         
                SMG_PORT=gsmg_code[key-1];
        }
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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