找回密码
 立即注册
查看: 39|回复: 2

看了冲哥教学视频,触摸值成功读取。修改一次发16通道触摸0点键值到串口。

[复制链接]
  • TA的每日心情
    开心
    2024-4-17 14:04
  • 签到天数: 98 天

    [LV.6]常住居民II

    3

    主题

    49

    回帖

    413

    积分

    中级会员

    积分
    413
    发表于 2024-4-8 17:39:22 | 显示全部楼层 |阅读模式

    //刚开始看官方的例程包时,感觉头大,没什么经验看不出那跟那;后来搜到冲哥视频,觉得蛮简单的,跟着教学弄就有了初步收获。
    //一开始用自己的串口收发,不知道为什么没有数据,后来跟视频用官方例程就收到数据了。
    #include "stc8h.h" /*STC8H1K08T调用8H系列单片机文件*///参考了:STC8H实验箱9.6例程包--10-串口1中断模式与电脑收发测试.c
    #include "stdio.h"
    #define MAIN_Fosc 11059200L //定义主时钟(精确计算115200波特率)
    #define Baudrate1 115200L
    #define UART1_BUF_LENGTH 64
    unsigned char  TX1_Cnt; //发送计数
    unsigned char  RX1_Cnt; //接收计数
    bit B_TX1_Busy; //发送忙标志
    unsigned char  xdata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
    unsigned int tk_cnt[16]/*触摸扫描值*/,tk_ldjz[16]/*触摸0点键值*/;unsigned char tk_over=0/*采集状态*/;
    /**********延时函数**********/
    void delayms(unsigned int j){unsigned int i;for(;j>0;j--){for(i=0;i<150;i++);}}
    /**********发送一个字符串**********/
    void PrintString1(unsigned char *puts)
    {
        for (; *puts != 0;  puts++) //遇到停止符0结束
        {
            SBUF = *puts;
            B_TX1_Busy = 1;
            while(B_TX1_Busy);
        }
    }
    /**********选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.**********/
    void SetTimer2Baudraye(unsigned int dat)
    {
        AUXR &= ~(1<<4); //Timer stop
        AUXR &= ~(1<<3); //Timer2 set As Timer
        AUXR |=  (1<<2); //Timer2 set as 1T mode
        T2H = dat / 256;
        T2L = dat % 256;
        IE2  &= ~(1<<2); //禁止中断
        AUXR |=  (1<<4); //Timer run enable
    }
    /**********选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.**********/
    void UART1_config(unsigned char brt)   
    {
        /*********** 波特率使用定时器2 *****************/
        if(brt == 2)
        {
            AUXR |= 0x01; //S1 BRT Use Timer2;
            SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1);
        }
        /*********** 波特率使用定时器1 *****************/
        else
        {
            TR1 = 0;
            AUXR &= ~0x01; //S1 BRT Use Timer1;
            AUXR |=  (1<<6); //Timer1 set as 1T mode
            TMOD &= ~(1<<6); //Timer1 set As Timer
            TMOD &= ~0x30; //Timer1_16bitAutoReload;
            TH1 = (unsigned char)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
            TL1 = (unsigned char)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256);
            ET1 = 0;    //禁止中断
            INTCLKO &= ~0x02; //不输出时钟
            TR1  = 1;
        }
       /*************************************************/
        SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
    //  PS  = 1; //高优先级中断
        ES  = 1; //允许中断
        REN = 1; //允许接收
        P_SW1 &= 0x3f;
        P_SW1 |= 0x00; //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7, 0xC0: P4.3 P4.4
    //  PCON2 |=  (1<<4); //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
        B_TX1_Busy = 0;
        TX1_Cnt = 0;
        RX1_Cnt = 0;
    }
    /**********UART1中断函数**********/
    void UART1_int (void) interrupt 4
    {
        if(RI)
        {
            RI = 0;
            RX1_Buffer[RX1_Cnt] = SBUF;
            if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0; //防溢出
        }
        if(TI)
        {
            TI = 0;
            B_TX1_Busy = 0;
        }
    }
    /**********主函数**********/
    void main()
    {
            char xdata dat[50];unsigned int i;
            P_SW2 |= 0x80; //允许访问XSF
            //1.需要用到的触摸引脚设置为高阻输入
            P1M1 = 0xff;   P1M0 = 0x00; //P1端口设置为高阻
            P3M1 = 0xfc;   P3M0 = 0x00; //P3端口设置为高阻  先不占用串口引脚,要不然收不到数据
            P5M1 = 0x10;   P5M0 = 0x00; //P5端口设置为高阻
            UART1_config(1); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
    //2.配置是否需要同时使用触摸LED指示和触摸检测
      TSRT = 0;//不需要使用LED

    //3.需要用到的触摸通道使能
      TSCHEN1= 0xff;
      TSCHEN2= 0xfc;//先不占用串口引脚,要不然收不到数据

    //4.设置触摸按键的开关频率,参考电压和放电时间
      TSCFG1= (7<<4) + 3;//工作频率设为最低,时钟为1000个系统时钟
            TSCFG2 = 2;//设置参考点

    //5.开启触摸
      TSCTRL = 0xa0;
           
    //6.开启触摸中断并保存数据
            IE2|=0x80;       
      EA = 1; //允许总中断
            delayms(100);/*给时间扫描触摸按键*/
            while(tk_over==1)/*等待采集完成*/
      tk_over=0;i=0;                         
                    for(i=0; i<16; i++)
            {
                    tk_ldjz[i] = tk_cnt[i];//录入0点键值
                    sprintf(dat,"TK%d:%u\r\n",i,tk_ldjz[i]);/*字符串格式化命令*/                 
              PrintString1(dat);  //UART1发送字符串               
            }  
                    while (1)
      {         
                      if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲
            {
                SBUF = RX1_Buffer[TX1_Cnt]; //把收到的数据远样返回
                B_TX1_Busy = 1;
                if(++TX1_Cnt >= UART1_BUF_LENGTH)   TX1_Cnt = 0;
            }
            }
    }
    /**********触摸中断**********/
    void        TKSU_ISR(void) interrupt 35
    {
            unsigned char j=TSSTA2;//读到的数值先保存起来
            if(j & 0x40)//数据溢出中断
            {
                    TSSTA2 |= 0x40;
            }
            if(j & 0x80)//一轮采集完成中断
            {
                    j &= 0x0f;//获取当前通道号
                    TSSTA2 |= 0x80;//清空采集完成的中断
                    tk_cnt[j]=TSDAT;/*保存采集到的数值*/
                    if(j==15){tk_over=1;}/*采集完成*/
            }
    }
    回复 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9235

    回帖

    1万

    积分

    管理员

    积分
    13946
    发表于 2024-4-8 17:45:52 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-17 14:04
  • 签到天数: 98 天

    [LV.6]常住居民II

    3

    主题

    49

    回帖

    413

    积分

    中级会员

    积分
    413
     楼主| 发表于 2024-4-8 17:47:56 | 显示全部楼层
    神农鼎 发表于 2024-4-8 17:45
    https://www.stcaimcu.com/plugin.php?id=x7ree_v:x7ree_v&code_7ree=1&id_7ree=362

    一开始我就是看郭老师的,就是修改串口弄不出数据,我这小板板,木有数码管。
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-30 02:33 , Processed in 0.057346 second(s), 39 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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