找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1159|回复: 1
收起左侧

单片机程序 16个按键+1个数码管+Uart通信

[复制链接]
ID:1017814 发表于 2022-4-17 16:17 | 显示全部楼层 |阅读模式
  1. /*此函数为按键发送 ,同时在数码管上显示
  2. /*功能:单片机向PC发送按键字符,0-9 英文
  3. //                上下左右对错,U,D,L,R,Y,N
  4. //                 按一下,发送一个,不按不发送,
  5. //                长按一直发送
  6. //                 数码管上显示0-9 ABCDEF
  7. //日期:2022-4-14AM 
  8. ***********************************************/
  9. #include <reg52.h>
  10. #include "key16-2.h"
  11. typedef   unsigned int   u16;
  12. sbit led=P2^2;
  13. u8 temp,n;
  14. void delay(u16 n)
  15. {
  16.         while(n--);
  17. }
  18. void UART_init(void)
  19. {
  20.         SCON = 0x50;
  21.         TMOD = 0x20;
  22.         TH1  = 0xFD;
  23.         TL1  = 0xFD;
  24.         TR1  = 1;
  25.         //ES   = 1;
  26.         //EA   = 1;
  27. }
  28. void Uart_send(u8 dat)
  29. {
  30.         SBUF = dat;
  31.         while(!TI);
  32. }

  33. main()
  34. {
  35.         UART_init();
  36.         led=0;
  37.         while(1)
  38.         {
  39.                 temp=key_scan();
  40.                 if(temp!=0xff)
  41.                 {
  42.                          Uart_send(temp);
  43.                         switch (temp)
  44.                         {
  45.                                  case 'Y': temp=11;break;
  46.                                 case 'N': temp=10;break;
  47.                                 case 'L': temp=12;break;
  48.                                 case 'D': temp=13;break;
  49.                                 case 'U': temp=14;break;
  50.                                 case 'R': temp=15;break;
  51.                                
  52.                         }
  53.                         P0=~num[temp];                //加“~”是因为我的代码表是共阴数码的,而板
  54.                         delay(30000);                        //子上是共阳的
  55.                 }
  56.         }
  57. }

复制代码

  1. #ifndef _KEY16_H_
  2. #define _KEY16_H_

  3. typedef unsigned char u8;

  4. sbit hang1=P1^7;
  5. sbit hang2=P1^6;
  6. sbit hang3=P1^5;
  7. sbit hang4=P1^4;

  8. sbit lie1=P1^3;
  9. sbit lie2=P1^2;
  10. sbit lie3=P1^1;
  11. sbit lie4=P1^0;

  12. u8 code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  13.                            0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
  14. };
  15. u8 key_val=0xff;
  16. void key_delay()
  17. {
  18.         u8 x,y;
  19.         for(x=200;x>0;x--)
  20.                 for(y=220;y>0;y--);
  21. }
  22. u8 key_scan()
  23. {
  24.         hang1=0;
  25.         hang2=1;
  26.         hang3=1;
  27.         hang4=1;
  28.         if(lie1==0)                                //right         15
  29.         {
  30.                  key_delay();
  31.                 if(lie1==0)
  32.                 {
  33.                    return 'R'+'\0';
  34.                 }
  35.                 while(lie1==0);
  36.         }
  37.         if(lie2==0)                                   //up                14
  38.         {
  39.                  key_delay();
  40.                 if(lie2==0)
  41.                 {
  42.                    return 'U'+'\0';
  43.                 }
  44.                 while(lie2==0);
  45.         }
  46.         if(lie3==0)                                //down           13
  47.         {
  48.                  key_delay();
  49.                 if(lie3==0)
  50.                 {
  51.                    return 'D'+'\0';
  52.                 }
  53.                 while(lie3==0);
  54.         }
  55.         if(lie4==0)                                        //left           12
  56.         {
  57.                  key_delay();
  58.                 if(lie4==0)
  59.                 {
  60.                    return 'L'+'\0';
  61.                 }
  62.                 while(lie4==0);
  63.         }
  64.         hang1=1;
  65.         hang2=0;
  66.         hang3=1;
  67.         hang4=1;
  68.         if(lie1==0)                                //ok
  69.         {
  70.                  key_delay();
  71.                 if(lie1==0)
  72.                 {
  73.                    return 'Y'+'\0';
  74.                 }
  75.                 while(lie1==0);
  76.         }
  77.         if(lie2==0)                                   //9
  78.         {
  79.                  key_delay();
  80.                 if(lie2==0)
  81.                 {
  82.                    return 9;
  83.                 }
  84.                 while(lie2==0);
  85.         }
  86.         if(lie3==0)                                //3
  87.         {
  88.                  key_delay();
  89.                 if(lie3==0)
  90.                 {
  91.                    return 3;
  92.                 }
  93.                 while(lie3==0);
  94.         }
  95.         if(lie4==0)                                        //6
  96.         {
  97.                  key_delay();
  98.                 if(lie4==0)
  99.                 {
  100.                    return 6;
  101.                 }
  102.                 while(lie4==0);
  103.         }
  104.         hang1=1;
  105.         hang2=1;
  106.         hang3=0;
  107.         hang4=1;
  108.         if(lie1==0)                                //0
  109.         {
  110.                  key_delay();
  111.                 if(lie1==0)
  112.                 {
  113.                    return 0;
  114.                 }
  115.                 while(lie1==0);
  116.         }
  117.         if(lie2==0)                                   //8
  118.         {
  119.                  key_delay();
  120.                 if(lie2==0)
  121.                 {
  122.                    return 8;
  123.                 }
  124.                 while(lie2==0);
  125.         }
  126.         if(lie3==0)                                //2
  127.         {
  128.                  key_delay();
  129.                 if(lie3==0)
  130.                 {
  131.                    return 2;
  132.                 }
  133.                 while(lie3==0);
  134.         }
  135.         if(lie4==0)                                        //5
  136.         {
  137.                  key_delay();
  138.                 if(lie4==0)
  139.                 {
  140.                    return 5;
  141.                 }
  142.                 while(lie4==0);
  143.         }
  144.         hang1=1;
  145.         hang2=1;
  146.         hang3=1;
  147.         hang4=0;
  148.         if(lie1==0)                                //ESC
  149.         {
  150.                  key_delay();
  151.                 if(lie1==0)
  152.                 {
  153.                    return 'N'+'\0';
  154.                 }
  155.                 while(lie1==0);
  156.         }
  157.         if(lie2==0)                                   //7
  158.         {
  159.                  key_delay();
  160.                 if(lie2==0)
  161.                 {
  162.                    return 7;
  163.                 }
  164.                 while(lie2==0);
  165.         }
  166.         if(lie3==0)                                //1
  167.         {
  168.                  key_delay();
  169.                 if(lie3==0)
  170.                 {
  171.                    return 1;
  172.                 }
  173.                 while(lie3==0);
  174.         }
  175.         if(lie4==0)                                        //4
  176.         {
  177.                  key_delay();
  178.                 if(lie4==0)
  179.                 {
  180.                    return 4;
  181.                 }
  182.                 while(lie4==0);
  183.         }
  184.         return 0xff;                   
  185. }
  186. #endif
复制代码


评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1017814 发表于 2022-4-17 16:26 | 显示全部楼层
定义按键和按键扫描函数在include文件里
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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