找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机+8229BSF触摸按键+数码管源程序

[复制链接]
跳转到指定楼层
楼主
16键触摸按键,商家给的资料很少,芯片功能很丰富,这个例程仅实现16个按键单独使用,灵敏度不错,要短按第三个才能16键使用,否则只能使用8个按键。



单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. //#include<reg51.h>
  4. //#include<intrins.h>

  5. sbit scl=P1^0;
  6. sbit sdo=P1^1;
  7. //sbit a=P1^2;
  8. sbit BEEP = P3^6;                  //蜂鸣器驱动线

  9. unsigned char  n,shift,i;
  10. unsigned int  display[2];
  11. unsigned char code disp_code[]={
  12.               0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  13.               0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}        ;

  14. //unsigned char code key2[]={'1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F','-'};

  15. unsigned char  key1[16];


  16. void delay10us(unsigned int n)
  17. {
  18.         while(n--);
  19. }


  20. void delay(unsigned z)
  21. {
  22.      unsigned int x,y;
  23.      for(x = z; x > 0; x--)
  24.          for(y = 114; y > 0 ; y--);
  25. }
  26. /**********************************************************

  27.   蜂鸣器驱动子函数

  28. **********************************************************/
  29. void beep(void)
  30. {
  31.   unsigned char i;
  32.   for (i=0;i<180;i++)
  33.   {
  34.     delay10us(500);
  35.     BEEP=!BEEP;       //BEEP取反
  36.   }
  37.    BEEP=1;            //关闭蜂鸣器
  38.    delay10us(500);      //延时     
  39. }




  40. void ttp229_write(void)
  41. {
  42.      unsigned char i;

  43.      sdo=0;
  44.      delay10us(10);//115.02us
  45.      sdo=1;
  46.      delay10us(2);    //36us
  47.      for(i=0;i<16;i++)
  48.      {
  49.                  key1[i]='1';

  50.              scl=0;

  51.         if(!sdo)   {key1[i]='0';}
  52.          scl=1;            //132KHz


  53.      }
  54. }
  55. main()
  56. {
  57.       unsigned char i;
  58.          unsigned int i1;         
  59.    P0 = 0xbf;
  60.    P2 = 0x7f;            //数码管显示"-"

  61.    T2CON = 0x00;               //设置T2CON寄存器         
  62.    TH2 = 0xfc;                 //1ms定时
  63.    TL2 = 0x66;
  64.    ET2 = 1;                    //启用Timer2中断
  65.    EA = 1;                     //总中断允许
  66.    TR2 = 1;                    //启动定时器2        
  67.    while(1)
  68.      {
  69.        delay(200);//500ms
  70.          ttp229_write();        
  71. //         i1=16;
  72. //         i=0;
  73.                
  74.                             for(i=0;i<16;i++)
  75.     {
  76.                                   if (key1[i]=='0')
  77.                                  {
  78.                                   display[0]=i;
  79.                                   display[1]=i;
  80.                                  }

  81.          }
  82.                  

  83.    }
  84. }



  85. /*********************************************************

  86. Timer2中断函数

  87. **********************************************************/
  88. void  timer2() interrupt 5
  89. {
  90.    TR2 = 0;
  91.    TF2 = 0;                         //手工清中断标志  
  92.    TH2 = 0xfc;                      //1ms定时常数
  93.    TL2 = 0x66;

  94.    if(n >= 2)                       //3位数码管显示
  95.    {
  96.      n = 0;
  97.      shift = 0x7f;                  //送位码初值
  98.      P2 = 0xff;                     //关闭显示
  99.    }
  100.    else
  101.    {

  102.      P0 = disp_code[display[n++]];    //送段码
  103.      P2 = shift;                    //送位码
  104.      shift = (shift>>1)|0x80;       //调整位码
  105.    }
  106.    TR2 = 1;
  107. }
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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