普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 5605|回复: 7

独立键盘控制LED灯和蜂鸣器

 关闭 [复制链接]

20

主题

1344

帖子

8389

积分

论坛元老

Rank: 8Rank: 8

积分
8389
发表于 2017-1-22 09:19:04 | 显示全部楼层 |阅读模式
有朋友想用独立键盘控制LED灯和蜂鸣器,这里有一个我早期编的程序,可以作为例子。板子:HC6800-ES-V2.0
芯片:STC89C52RD
一直都添加不了附件,所以直接上程序了。
  1. /*
  2. 本实例是独立键盘实验
  3. 1、键盘消抖动的含义和编程时的做法
  4. 2、熟悉C语言,让结果丰富多彩
  5. 3、复习了静态数码管
  6. */

  7. #include<reg51.h>
  8. #include<intrins.h>       

  9. #define GPIO_LED P2
  10. #define GPIO_DIG P0

  11. sbit LSA=P2^2;
  12. sbit LSB=P2^3;
  13. sbit LSC=P2^4;

  14. sbit k1=P3^1;
  15. sbit k2=P3^0;
  16. sbit k3=P3^2;
  17. sbit k4=P3^3;

  18. sbit Beep =  P1^5 ;

  19. void Delay(unsigned int i);
  20. void Delay10ms(unsigned int c);

  21. unsigned char code DIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
  22. 0x77,0x7c,0x39,0x5e,0x79,0x71};

  23. void main(void)
  24. {
  25.         unsigned int i,j,n;//i为松手消抖计数变量;j为LED灯状态暂存变量;n为移动LED灯的循环
  26.         bit f;                        //计数变量和发声音的脉冲次数计数变量;f为蜂鸣器刚才响过的声音标志
  27.         f=0;
  28.         j=0xff;
  29.         GPIO_LED=j;
  30.         while(1)
  31.         {       
  32.                 if(k1==0)//扫描键盘k1
  33.                 {
  34.                         Delay10ms(1);
  35.                         if(k1==0)
  36.                         {
  37.                                 if(j==0xff)//如果全灭
  38.                                 {
  39.                                         j=0x00;//则全开
  40.                                         GPIO_LED=j;
  41.                                 }
  42.                                 else//反之
  43.                                 {
  44.                                         j=0xff;//则全灭
  45.                                         GPIO_LED=j;
  46.                                 }
  47.                             while((i<50)&&(k1==0))
  48.                             {
  49.                                     Delay10ms(1);
  50.                                     i++;
  51.                             }
  52.                             i=0;
  53.                         }

  54.                 }
  55.                 if(k2==0)//扫描键盘k2
  56.                 {
  57.                         Delay10ms(1);
  58.                         if(k2==0)
  59.                         {
  60.                                 if(j<0x80)//如果亮的LED灯第7位亮了,其它位也可能亮着
  61.                                 {
  62.                                     j=0x7f;//则只亮第7位
  63.                                         GPIO_LED=j;
  64.                                         Delay10ms(10);
  65.                                         for(n=0;n<7;n++)//并以此向右移动LED灯
  66.                                     {
  67.                                             j=_cror_(j,1);
  68.                                                 GPIO_LED=j;
  69.                                                 Delay10ms(10);
  70.                                         }
  71.                                 }
  72.                                 else//反之
  73.                                 {
  74.                                     j=0xfe;//亮第0位LED灯
  75.                                         GPIO_LED=j;
  76.                                         Delay10ms(10);
  77.                                         for(n=0;n<7;n++)//并以此向左移动LED灯
  78.                                     {
  79.                                             j=_crol_(j,1);
  80.                                                 GPIO_LED=j;
  81.                                                 Delay10ms(10);
  82.                                         }

  83.                                 }
  84.                             while((i<50)&&(k2==0))
  85.                             {
  86.                                     Delay10ms(1);
  87.                                     i++;
  88.                             }
  89.                             i=0;
  90.                         }
  91.                 }
  92.                 if(k3==0)//扫描键盘k3
  93.                 {
  94.                         Delay10ms(1);
  95.                         if(k3==0)
  96.                         {
  97.                         j=0xff;//初始化:关闭LED灯
  98.                         GPIO_LED=j;
  99.                             if(f==0)//如果刚才响过低音
  100.                             {n=0;
  101.                         while(n<5000)
  102.                         {
  103.                         Beep= 1;
  104.                         Delay(10);//时间间隔短,高音
  105.                         Beep= 0;
  106.                         Delay(10);
  107.                     n++;
  108.                         }
  109.                                     f=1;//记录这次响的是高音
  110.                              }
  111.                                  else//反之
  112.                  {n=0;
  113.                          while(n<1000)
  114.                          {
  115.                          Beep= 1;
  116.                          Delay(50);//时间间隔长,低音
  117.                          Beep= 0;
  118.                          Delay(50);
  119.                          n++;
  120.                          }
  121.                                      f=0;//记录这次响的是低音
  122.                              }
  123.                             while((i<50)&&(k3==0))
  124.                             {
  125.                                     Delay10ms(1);
  126.                                     i++;
  127.                             }
  128.                             i=0;
  129.                         }
  130.                 }
  131.                 if(k4==0)
  132.                 {
  133.                         Delay10ms(1);
  134.                         if(k4==0)
  135.                         {
  136.                                 j=0xff;//初始化:关闭LED灯
  137.                                 GPIO_LED=j;
  138.                                 LSA=0;LSB=0;LSC=0;//数码管静态显示
  139.                                 GPIO_DIG=DIG_CODE[0];
  140.                                 Delay10ms(50);
  141.                                 LSA=1;LSB=0;LSC=0;
  142.                                 GPIO_DIG=DIG_CODE[1];
  143.                                 Delay10ms(50);
  144.                                 LSA=0;LSB=1;LSC=0;
  145.                                 GPIO_DIG=DIG_CODE[2];
  146.                                 Delay10ms(50);
  147.                                 LSA=1;LSB=1;LSC=0;
  148.                                 GPIO_DIG=DIG_CODE[3];
  149.                                 Delay10ms(50);
  150.                                 LSA=0;LSB=0;LSC=1;
  151.                                 GPIO_DIG=DIG_CODE[4];
  152.                                 Delay10ms(50);
  153.                                 LSA=1;LSB=0;LSC=1;
  154.                                 GPIO_DIG=DIG_CODE[5];
  155.                                 Delay10ms(50);
  156.                                 LSA=0;LSB=1;LSC=1;
  157.                                 GPIO_DIG=DIG_CODE[6];
  158.                                 Delay10ms(50);
  159.                                 LSA=1;LSB=1;LSC=1;
  160.                                 GPIO_DIG=DIG_CODE[7];
  161.                                 Delay10ms(50);
  162.                                 LSA=0;LSB=0;LSC=0;
  163.                                 GPIO_DIG=DIG_CODE[8];
  164.                                 Delay10ms(50);
  165.                                 LSA=1;LSB=0;LSC=0;
  166.                                 GPIO_DIG=DIG_CODE[9];
  167.                                 Delay10ms(50);
  168.                                 LSA=0;LSB=1;LSC=0;
  169.                                 GPIO_DIG=DIG_CODE[10];
  170.                                 Delay10ms(50);
  171.                                 LSA=1;LSB=1;LSC=0;
  172.                                 GPIO_DIG=DIG_CODE[11];
  173.                                 Delay10ms(50);
  174.                                 LSA=0;LSB=0;LSC=1;
  175.                                 GPIO_DIG=DIG_CODE[12];
  176.                                 Delay10ms(50);
  177.                                 LSA=1;LSB=0;LSC=1;
  178.                                 GPIO_DIG=DIG_CODE[13];
  179.                                 Delay10ms(50);
  180.                                 LSA=0;LSB=1;LSC=1;
  181.                                 GPIO_DIG=DIG_CODE[14];
  182.                                 Delay10ms(50);
  183.                                 LSA=1;LSB=1;LSC=1;
  184.                                 GPIO_DIG=DIG_CODE[15];
  185.                                 Delay10ms(50);
  186.                                 GPIO_DIG=0x00;
  187.                         }
  188.                 }
  189.         }               
  190. }
  191. void Delay10ms(unsigned int c)
  192. {
  193.     unsigned char a,b;
  194.     for(c;c>0;c--)
  195.         for(b=38;b>0;b--)
  196.             for(a=130;a>0;a--);
  197. }
  198. void Delay(unsigned int i)//延时19.3us
  199. {
  200.     char j;
  201.     for(i; i > 0; i--)
  202.         for(j = 200; j > 0; j--);
  203. }
复制代码
回复

使用道具 举报

42

主题

563

帖子

1907

积分

金牌会员

Rank: 6Rank: 6

积分
1907
发表于 2017-1-22 12:27:46 | 显示全部楼层
代码略显太长,可以用switch语句改进一下的
回复 支持 反对

使用道具 举报

20

主题

1344

帖子

8389

积分

论坛元老

Rank: 8Rank: 8

积分
8389
 楼主| 发表于 2017-1-22 13:45:32 | 显示全部楼层
大瓶子凌凌漆 发表于 2017-1-22 12:27
代码略显太长,可以用switch语句改进一下的

受教了。谢谢
回复 支持 反对

使用道具 举报

6

主题

35

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2017-2-6 11:56:47 | 显示全部楼层
大哥,你太厉害了!就是后边数字模块显示有点问题,我删除了一部分,就正常了!谢谢啊!
回复 支持 反对

使用道具 举报

20

主题

1344

帖子

8389

积分

论坛元老

Rank: 8Rank: 8

积分
8389
 楼主| 发表于 2017-2-6 12:01:08 | 显示全部楼层
18633200252 发表于 2017-2-6 11:56
大哥,你太厉害了!就是后边数字模块显示有点问题,我删除了一部分,就正常了!谢谢啊!

这也是我刚学会时编的程序,你看还是有高手指点的嘛。大家交流才能进步。
能帮到你就好。
回复 支持 反对

使用道具 举报

139

主题

382

帖子

1531

积分

金牌会员

Rank: 6Rank: 6

积分
1531
发表于 2017-2-7 13:09:42 | 显示全部楼层
顶一下      
回复 支持 反对

使用道具 举报

139

主题

382

帖子

1531

积分

金牌会员

Rank: 6Rank: 6

积分
1531
发表于 2017-2-7 13:10:04 | 显示全部楼层
顶一下      
回复 支持 反对

使用道具 举报

139

主题

382

帖子

1531

积分

金牌会员

Rank: 6Rank: 6

积分
1531
发表于 2017-2-7 13:10:31 | 显示全部楼层
顶一下      
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-5-3 23:45 , Processed in 0.124728 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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