找回密码
 立即注册
查看: 248|回复: 6

(已解决)移植例程16个触摸按键16个灯-8个共阴-8个共阳数码管显示程序失败,不知道是

[复制链接]
  • TA的每日心情
    开心
    昨天 08:06
  • 签到天数: 168 天

    [LV.7]常住居民III

    67

    主题

    848

    回帖

    2844

    积分

    金牌会员

    积分
    2844
    发表于 2023-12-28 11:44:53 | 显示全部楼层 |阅读模式
    本帖最后由 xxkj2010 于 2023-12-29 10:45 编辑

    单片机使用STC8H1K17T,程序从例程16个触摸按键16个灯-8个共阴-8个共阳数码管显示程序中修改,
    当前目的是想用触摸开关控制接在P54的LED灯亮灭,
    移植失败,不知道是硬件问题还是软件问题,请大佬赐教,谢谢!


    STC8H1K17T触摸功能测试(用例程16个触摸按键16个灯-8个共阴-8个共阳数码管显示修改).rar

    32.36 KB, 下载次数: 4

    回复 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9420

    回帖

    1万

    积分

    管理员

    积分
    13985
    发表于 2023-12-28 12:00:42 | 显示全部楼层
    你先把原理图,PCB, 源程序,按3个楼层贴出来,大家一起来帮忙
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:06
  • 签到天数: 168 天

    [LV.7]常住居民III

    67

    主题

    848

    回帖

    2844

    积分

    金牌会员

    积分
    2844
     楼主| 发表于 2023-12-28 12:02:04 | 显示全部楼层
    主要电路原理图
    STC8H1K17T触摸功能测试电路图.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:06
  • 签到天数: 168 天

    [LV.7]常住居民III

    67

    主题

    848

    回帖

    2844

    积分

    金牌会员

    积分
    2844
     楼主| 发表于 2023-12-28 12:07:03 | 显示全部楼层
    PCB
    截图202312281210281836.jpg

    截图202312281211178783.jpg

    截图202312281212101946.jpg

    PCB(单个多页).pdf

    657.76 KB, 下载次数: 3

    PCB(多个单页).pdf

    483.15 KB, 下载次数: 2

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:06
  • 签到天数: 168 天

    [LV.7]常住居民III

    67

    主题

    848

    回帖

    2844

    积分

    金牌会员

    积分
    2844
     楼主| 发表于 2023-12-28 12:07:47 | 显示全部楼层
    1. /*
    2. 单片机:STC8H1K17T
    3. 使用触摸引脚:TK3、TK6、TK7
    4. */
    5. #include        "STC8Hxxx.h"
    6. #include <intrins.h>
    7. #include <stdio.h>
    8. /*************        功能说明        *************
    9. 读取16个触摸按键
    10. 触摸按键的读数本来是16位的, 由于使用了滤波算法, 滤波后数据为14位的.
    11. 参考电容的选取, 未按键时读数是满量程的1/3~1/2比较好, 兼顾灵敏度, 量产时又允许一定的平偏差.
    12. 程序会做缓慢的0点跟踪, 所以本例不合适长按处理, 长按处理还要有别的算法.
    13. P1.0-->TK0,  P1.1-->TK1, P5.4-->TK2, P1.3-->TK3, P1.4-->TK4,  P1.5-->TK5, P1.6-->TK6, P1.7-->TK7,
    14. P5.0-->TK8,  P5.1-->TK9, P5.2-->TK1, P5.3-->TK1, P0.0-->TK1,  P0.1-->TK1, P0.2-->TK1, P0.3-->TK1,
    15. ******************************************/
    16. /*************        本地常量声明        **************/
    17. #define        DIS_BLACK        0x1A
    18. #define        DIS_                0x1B
    19. #define LED P54            //LED
    20. #define ws2812b_IO    P35      //WS2812信号输入口
    21. #define MAIN_Fosc            24000000L        //定义主时钟 11059200
    22. #define BAUD        (65536 - MAIN_Fosc/4/115200)     //定义串口波特率重装值
    23. bit fBusy;                                     //串口发送忙标志
    24. /*************        本地变量声明        **************/
    25. u16        xdata TK_cnt[16];        // 键计数值
    26. u16        xdata TK_zero[16];        // 0点读数
    27. u16        KeyState;                //键状态
    28. u8        KeyCode;                //键码 1~16
    29. bit        B_TK_Lowpass;        //允许低通
    30. bit        B_ReadKeyOk;        //标志已转换完成16个键
    31. u8        TrigLimit;                //触发转换限时
    32. u8        KeyValue;                //显示参数的键号, 0~15
    33. u8        read_cnt;
    34. /*************        本地函数声明        **************/
    35. void  delay_ms(u8 ms);
    36. u8                CheckKey(u16 j);
    37. /****************  外部函数声明和外部变量声明 *****************/
    38.         u16 code T_KeyState[16]   = {0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};
    39. //        u16 code T_KeyPress[16]   = {400,300,200,200, 400,300,200,200, 400,300,200,200, 400,300,200,200};        //读数无平均, 这个值是各键触摸后的变化值, 由于分布电容不同, 所以各键读数变化量不同
    40.         u16 code T_KeyPress[16]   = {200,150,100,100, 200,150,100,100, 200,150,100,100, 200,150,100,100};        //读数有平均, 这个值是各键触摸后的变化值, 由于分布电容不同, 所以各键读数变化量不同
    41. /**********************************************/
    42. void main(void)
    43. {
    44.         u8        i;
    45.         u16        j;
    46.                 fBusy = 0;
    47.         P_SW2 |= 0x80;        //允许访问XSFR(扩展特殊功能寄存器)
    48. //        XOSCCR = 0xc0;           //启动外部晶振
    49. //        while (!(XOSCCR & 1));   //等待时钟稳定
    50. //        CLKDIV = 0x00;           //时钟不分频
    51. //        CKSEL = 0x01;            //选择外部晶振
    52.         P0M0 = 0x00;        P0M1 = 0x00;
    53. //        P1M0 = 0x00;        P1M1 = 0x00;
    54.         P3M0 = 0x00; P3M1 = 0x00;
    55.         P5M0 = 0x10; P5M1 = 0x00;        
    56.     AUXR = 0x40;                                //使用定时器1作为串口波特率发生器
    57.     TMOD = 0x00;
    58.     TL1 = BAUD;
    59.     TH1 = BAUD >> 8;
    60.     TR1 = 1;
    61.     SCON = 0x50;
    62.     ES = 1;
    63.        
    64.         P1n_pure_input(0xff);        //Touch Key设置为高阻
    65. //        TSCHEN = 0xffff;        //TK0~TK15
    66.         TSCHEN1 = 0xff;                //TK0~TK7
    67. //        TSCHEN2 = 0xff;                //TK8~TK15
    68.         TSCFG1  = (7<<4) + 6;        //开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
    69.         TSCFG2  = 1;                //配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
    70. //        TSCTRL = (1<<7) + (1<<6) +3;        //开始扫描, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
    71. //        TSRT = 0x00;                //没有LED分时扫描
    72.         IE2 |= 0x80;                //允许触摸按键中断
    73.         EA = 1;
    74.         delay_ms(50);
    75. //        B_TK_Lowpass = 0;        //禁止低通滤波
    76.         B_TK_Lowpass = 1;        //允许低通滤波
    77.         for(read_cnt=0; read_cnt<40; read_cnt++)                //读40次键, 将此值作为未触摸时的0点, 要求上电时不要触摸按键
    78.         {
    79.         //        TSCTRL = (1<<7) + (1<<6) +3;        //开始扫描, 4次平均, 读数大约为无平均的一半
    80.                 TSCTRL = (1<<7) + (1<<6) +1;        //开始扫描, 2次平均, 读数大约为无平均的一半
    81.         //        TSCTRL = (1<<7) + (1<<6);                //开始扫描, 只转换1次, 无平均
    82.                 B_ReadKeyOk = 0;
    83.                 for(i=0; i<100; i++)
    84.                 {
    85.                         if(B_ReadKeyOk)        break;
    86.                         delay_ms(1);
    87.                 }
    88.         }
    89.         for(i=0; i<16; i++)                TK_zero[i] = TK_cnt[i];        //保存0点
    90.        
    91.         B_TK_Lowpass = 1;        //允许低通
    92.         KeyState = 0;
    93.         read_cnt = 0;
    94.        
    95.         B_ReadKeyOk = 0;
    96.         KeyValue = 10;
    97.         KeyCode = 0;
    98.         delay_ms(2000);
    99.         printf("开始测试----\r\n");
    100.         while (1)
    101.         {
    102.                 delay_ms(1);
    103.                
    104.                 if(++TrigLimit >= 100)        //触发转换
    105.                 {
    106.                         TrigLimit = 0;
    107.                 //        TSCTRL = (1<<7) + (1<<6) +3;        //开始扫描, 4次平均, 读数大约为无平均的一半
    108.                         TSCTRL = (1<<7) + (1<<6) +1;        //开始扫描, 2次平均, 读数大约为无平均的一半
    109.                 //        TSCTRL = (1<<7) + (1<<6);                //开始扫描, 只转换1次, 无平均
    110.                 }
    111.                
    112.                 if(B_ReadKeyOk)                        // 16个键都转换完毕
    113.                 {
    114.                         B_ReadKeyOk = 0;
    115.                         TrigLimit = 100;
    116. //                        printf("B_ReadKeyOk!\r\n");
    117.                         j = KeyState;                //读入上一次键状态
    118.                         for(i=0; i<16; i++)
    119.                         {
    120.                                 if(TK_zero[i] > TK_cnt[i])        //计算与0点的差值
    121.                                 {
    122.                                         TK_zero[i]--;        //缓慢0点跟随
    123.                                                  if((TK_zero[i] - TK_cnt[i]) >= T_KeyPress[i]/2)        KeyState |=  T_KeyState[i];        // 大于按键读数变量的1/2就是按下
    124.                                         else if((TK_zero[i] - TK_cnt[i]) <= T_KeyPress[i]/3)        KeyState &= ~T_KeyState[i];        // 小于按键读数变量的1/3就是释放
    125.                                 }
    126.                                 else
    127.                                 {
    128.                                         KeyState &= ~T_KeyState[i];
    129.                                         if((TK_cnt[i] - TK_zero[i]) > 100)        TK_zero[i] += 50;        //差别很大, 则快速回0点
    130.                                         else                                                                TK_zero[i] += 10;        //差别不大, 则慢速回0点
    131.                                 }
    132.                         }
    133.                         j = (j ^ KeyState) & KeyState;        //检测键是否按下
    134.                         if(j != 0)
    135.                         {
    136.                                 KeyCode = CheckKey(j);        //计算键码 1~16                               
    137.                                 printf("KeyCode:%d\r\n",KeyCode);
    138.                                 if(KeyCode == 3)
    139.                                 {
    140.                                         LED=!LED;
    141.                                 }
    142.                         }
    143.                 }
    144.         }
    145. }
    146. /**********************************************/
    147.   
    148. void  delay_ms(u8 ms)
    149. {
    150.         u16 i;
    151.         do
    152.         {
    153.                 i = MAIN_Fosc / 10000;
    154.                 while(--i)        ;
    155.         }while(--ms);
    156. }
    157. /****************** 检测 计算键码 **************************************/
    158. u8        CheckKey(u16 j)
    159. {
    160.         u8 i;
    161.         if(j == 0)        return 0;        //无键按下
    162.         for(i=0; i<16; i++)
    163.         {
    164.                 if(j & 0x0001)        break;
    165.                 j >>= 1;
    166.         }
    167.         return (i+1);        //键码1~16
    168. }
    169. u8        isr_index;
    170. void        AUXR_ISR(void) interrupt 13
    171. {
    172.         u8        j;
    173.        
    174.         switch(isr_index)
    175.         {
    176.                 case 32:                //0103H 波形发生器5 中断入口
    177.                                                 //用户中断处理代码
    178.                 break;
    179.                 case 33:                //010BH        波形发生器异常2 中断入口
    180.                                                 //用户中断处理代码
    181.                 break;
    182.                 case 34:                //0113H        波形发生器异常4 中断入口
    183.                                                 //用户中断处理代码
    184.                 break;
    185.                 case 35:                //011BH        触摸按键 中断入口
    186.                                                 //用户中断处理代码
    187.                         j = TSSTA2;
    188.                         if(j & 0x40)        //数据溢出, 错误处理(略)
    189.                         {
    190.                                 TSSTA2 |= 0x40;        //写1清零
    191.                         }
    192.                         if(j & 0x80)        //扫描完成
    193.                         {
    194.                                 j &= 0x0f;
    195.                                 TSSTA2 |= 0x80;        //写1清零
    196.                                 if(!B_TK_Lowpass)        TK_cnt[j] = TSDAT/4;        //保存某个通道的读数        无低通滤波
    197.                                 else                                TK_cnt[j] = ((TK_cnt[j] * 3)>>2) + TSDAT/16;        //保存某个通道的读数        低通滤波
    198.                                 if(j == 15)        B_ReadKeyOk = 1;        //读完一次循环
    199.                         }
    200.                 break;
    201.                 case 36:                //0123H        RTC 中断入口
    202.                                                 //用户中断处理代码
    203.                 break;
    204.                 case 37:                //012BH        P0口中断入口
    205.                                                 //用户中断处理代码
    206.                 break;
    207.                 case 38:                //0133H        P1口中断入口
    208.                                                 //用户中断处理代码
    209.                 break;
    210.                 case 39:                //013BH        P2口中断入口
    211.                                                 //用户中断处理代码
    212.                 break;
    213.                 case 40:                //0143H        P3口中断入口
    214.                                                 //用户中断处理代码
    215.                 break;
    216.                 case 41:                //014BH        P4口中断入口
    217.                                                 //用户中断处理代码
    218.                 break;
    219.                 case 42:                //0153H        P5口中断入口
    220.                                                 //用户中断处理代码
    221.                 break;
    222.                 case 43:                //015BH        P6口中断入口
    223.                                                 //用户中断处理代码
    224.                 break;
    225.                 case 44:                //0163H        P7口中断入口
    226.                                                 //用户中断处理代码
    227.                 break;
    228.                 case 45:                //016BH        P8口中断入口
    229.                                                 //用户中断处理代码
    230.                 break;
    231.                 case 46:                //0173H        P9口中断入口
    232.                                                 //用户中断处理代码
    233.                 break;
    234.                
    235.                 default:
    236.                 break;
    237.         }
    238. }
    239. void uart_isr() interrupt 4
    240. {
    241.     if (TI)
    242.     {
    243.         TI = 0;
    244.         fBusy = 0;
    245.     }
    246.    
    247.     if (RI)
    248.     {
    249.         RI = 0;
    250. //        CheckCustomCmd(SBUF);                   //检测命令序列
    251.     }
    252. }
    253. char putchar(char dat)                          //重定义putchar系统函数
    254. {
    255.     while (fBusy);
    256.     fBusy = 1;
    257.     SBUF = dat;   
    258.     return dat;
    259. }
    复制代码


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:06
  • 签到天数: 168 天

    [LV.7]常住居民III

    67

    主题

    848

    回帖

    2844

    积分

    金牌会员

    积分
    2844
     楼主| 发表于 2023-12-28 12:11:58 | 显示全部楼层
    本帖最后由 xxkj2010 于 2023-12-28 13:21 编辑

    实物图:

    实物.jpg
    实物2.jpg


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:06
  • 签到天数: 168 天

    [LV.7]常住居民III

    67

    主题

    848

    回帖

    2844

    积分

    金牌会员

    积分
    2844
     楼主| 发表于 2023-12-29 10:38:17 | 显示全部楼层
    自己弄好了,main代码如下:

    1. /*
    2. 单片机:STC8H1K17T
    3. 使用触摸引脚:TK3、TK6、TK7
    4. */
    5. #include        "STC8Hxxx.h"
    6. #include <intrins.h>
    7. #include <stdio.h>
    8. /*************        功能说明        *************
    9. 读取16个触摸按键
    10. 触摸按键的读数本来是16位的, 由于使用了滤波算法, 滤波后数据为14位的.
    11. 参考电容的选取, 未按键时读数是满量程的1/3~1/2比较好, 兼顾灵敏度, 量产时又允许一定的平偏差.
    12. 程序会做缓慢的0点跟踪, 所以本例不合适长按处理, 长按处理还要有别的算法.
    13. P1.0-->TK0,  P1.1-->TK1, P5.4-->TK2, P1.3-->TK3, P1.4-->TK4,  P1.5-->TK5, P1.6-->TK6, P1.7-->TK7,
    14. P5.0-->TK8,  P5.1-->TK9, P5.2-->TK1, P5.3-->TK1, P0.0-->TK1,  P0.1-->TK1, P0.2-->TK1, P0.3-->TK1,
    15. ******************************************/
    16. /*************        本地常量声明        **************/
    17. #define        DIS_BLACK        0x1A
    18. #define        DIS_                0x1B
    19. #define LED P54            //LED
    20. #define ws2812b_IO    P35      //WS2812信号输入口
    21. #define MAIN_Fosc            24000000L        //定义主时钟 11059200
    22. #define BAUD        (65536 - MAIN_Fosc/4/115200)     //定义串口波特率重装值
    23. bit fBusy;                                     //串口发送忙标志
    24. u16 AUXR_ISR_YN=0;
    25. /*************        本地变量声明        **************/
    26. u16        xdata TK_cnt[16];        // 键计数值
    27. u16        xdata TK_zero[16];        // 0点读数
    28. u16        KeyState;                //键状态
    29. u8        KeyCode;                //键码 1~16
    30. bit        B_TK_Lowpass;        //允许低通
    31. bit        B_ReadKeyOk;        //标志已转换完成16个键
    32. u8        TrigLimit;                //触发转换限时
    33. u8        KeyValue;                //显示参数的键号, 0~15
    34. u8        read_cnt;
    35. /*************        本地函数声明        **************/
    36. void  delay_ms(u8 ms);
    37. u8                CheckKey(u16 j);
    38. /****************  外部函数声明和外部变量声明 *****************/
    39.         u16 code T_KeyState[16]   = {0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};
    40. //        u16 code T_KeyPress[16]   = {400,300,200,200, 400,300,200,200, 400,300,200,200, 400,300,200,200};        //读数无平均, 这个值是各键触摸后的变化值, 由于分布电容不同, 所以各键读数变化量不同
    41.         u16 code T_KeyPress[16]   = {200,150,100,100, 200,150,100,100, 200,150,100,100, 200,150,100,100};        //读数有平均, 这个值是各键触摸后的变化值, 由于分布电容不同, 所以各键读数变化量不同
    42. /**********************************************/
    43. void main(void)
    44. {
    45.         u8        i;
    46.         u16        j;
    47.                 fBusy = 0;
    48.         P_SW2 |= 0x80;        //允许访问XSFR(扩展特殊功能寄存器)
    49. //        XOSCCR = 0xc0;           //启动外部晶振
    50. //        while (!(XOSCCR & 1));   //等待时钟稳定
    51. //        CLKDIV = 0x00;           //时钟不分频
    52. //        CKSEL = 0x01;            //选择外部晶振
    53.         P0M0 = 0x00;        P0M1 = 0x00;
    54. //        P1M0 = 0x00;        P1M1 = 0x00;
    55.         P3M0 = 0x00; P3M1 = 0x00;
    56.         P5M0 = 0x10; P5M1 = 0x00;        
    57.     AUXR = 0x40;                                //使用定时器1作为串口波特率发生器
    58.     TMOD = 0x00;
    59.     TL1 = BAUD;
    60.     TH1 = BAUD >> 8;
    61.     TR1 = 1;
    62.     SCON = 0x50;
    63.     ES = 1;
    64.        
    65.         P1n_pure_input(0xff);        //Touch Key设置为高阻
    66. //        TSCHEN = 0xffff;        //TK0~TK15
    67.         TSCHEN1 = 0xff;                //TK0~TK7
    68. //        TSCHEN2 = 0xff;                //TK8~TK15
    69.         TSCFG1  = (7<<4) + 6;        //开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
    70.         TSCFG2  = 1;                //配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
    71. //        TSCTRL = (1<<7) + (1<<6) +3;        //开始扫描, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
    72. //        TSRT = 0x00;                //没有LED分时扫描
    73.         IE2 |= 0x80;                //允许触摸按键中断
    74.         EA = 1;
    75.         delay_ms(50);
    76. //        B_TK_Lowpass = 0;        //禁止低通滤波
    77.         B_TK_Lowpass = 1;        //允许低通滤波
    78.         for(read_cnt=0; read_cnt<40; read_cnt++)                //读40次键, 将此值作为未触摸时的0点, 要求上电时不要触摸按键
    79.         {
    80.         //        TSCTRL = (1<<7) + (1<<6) +3;        //开始扫描, 4次平均, 读数大约为无平均的一半
    81.                 TSCTRL = (1<<7) + (1<<6) +1;        //开始扫描, 2次平均, 读数大约为无平均的一半
    82.         //        TSCTRL = (1<<7) + (1<<6);                //开始扫描, 只转换1次, 无平均
    83.                 B_ReadKeyOk = 0;
    84.                 for(i=0; i<100; i++)
    85.                 {
    86.                         if(B_ReadKeyOk)        break;
    87.                         delay_ms(1);
    88.                 }
    89.         }
    90.         for(i=0; i<16; i++)                TK_zero[i] = TK_cnt[i];        //保存0点
    91.        
    92.         B_TK_Lowpass = 1;        //允许低通
    93.         KeyState = 0;
    94.         read_cnt = 0;
    95.        
    96.         B_ReadKeyOk = 0;
    97.         KeyValue = 10;
    98.         KeyCode = 0;
    99.         delay_ms(2000);
    100.         printf("开始测试----\r\n");
    101.         while (1)
    102.         {
    103.                 delay_ms(1);
    104.                 if(AUXR_ISR_YN){printf("AUXR_ISR_YN=%d\r\n",AUXR_ISR_YN);AUXR_ISR_YN=0;}
    105.                 if(++TrigLimit >= 100)        //触发转换
    106.                 {
    107.                         TrigLimit = 0;
    108.                 //        TSCTRL = (1<<7) + (1<<6) +3;        //开始扫描, 4次平均, 读数大约为无平均的一半
    109.                         TSCTRL = (1<<7) + (1<<6) +1;        //开始扫描, 2次平均, 读数大约为无平均的一半
    110.                 //        TSCTRL = (1<<7) + (1<<6);                //开始扫描, 只转换1次, 无平均
    111.                 }
    112.                
    113.                 if(B_ReadKeyOk)                        // 16个键都转换完毕
    114.                 {
    115.                         B_ReadKeyOk = 0;
    116.                         TrigLimit = 100;
    117.                         //printf("B_ReadKeyOk!\r\n");
    118.                         j = KeyState;                //读入上一次键状态
    119.                         for(i=0; i<8; i++)
    120.                         {
    121.                                 if(TK_zero[i] > TK_cnt[i])        //计算与0点的差值
    122.                                 {
    123.                                         TK_zero[i]--;        //缓慢0点跟随
    124.                                         if((TK_zero[i] - TK_cnt[i]) >= T_KeyPress[i]/2)       
    125.                                                 KeyState |=  T_KeyState[i];        // 大于按键读数变量的1/2就是按下
    126.                                         else if((TK_zero[i] - TK_cnt[i]) <= T_KeyPress[i]/3)       
    127.                                                 KeyState &= ~T_KeyState[i];        // 小于按键读数变量的1/3就是释放
    128.                                 }
    129.                                 else
    130.                                 {
    131.                                         KeyState &= ~T_KeyState[i];
    132.                                         if((TK_cnt[i] - TK_zero[i]) > 100)       
    133.                                                 TK_zero[i] += 50;        //差别很大, 则快速回0点
    134.                                         else                        TK_zero[i] += 10;        //差别不大, 则慢速回0点
    135.                                 }
    136.                         }
    137.                         j = (j ^ KeyState) & KeyState;        //检测键是否按下
    138.                         if(j != 0)
    139.                         {
    140.                                 KeyCode = CheckKey(j);        //计算键码 1~8                               
    141.                                 printf("KeyCode:%d\r\n",(u16)KeyCode);
    142.                                 if(KeyCode == 4)
    143.                                 {
    144.                                         LED=!LED;
    145.                                 }
    146.                         }
    147.                 }
    148.         }
    149. }
    150. /**********************************************/
    151.   
    152. void  delay_ms(u8 ms)
    153. {
    154.         u16 i;
    155.         do
    156.         {
    157.                 i = MAIN_Fosc / 10000;
    158.                 while(--i)        ;
    159.         }while(--ms);
    160. }
    161. /****************** 检测 计算键码 **************************************/
    162. u8        CheckKey(u16 j)
    163. {
    164.         u8 i;
    165.         if(j == 0)        return 0;        //无键按下
    166.         for(i=0; i<8; i++)
    167.         {
    168.                 if(j & 0x0001)        break;
    169.                 j >>= 1;
    170.         }
    171.         return (i+1);        //键码1~8
    172. }
    173. u8        isr_index;
    174. void        AUXR_ISR(void) interrupt 13
    175. {
    176.         u8        j;
    177.        
    178.         switch(isr_index)
    179.         {
    180.                 case 32:                //0103H 波形发生器5 中断入口
    181.                                                 //用户中断处理代码
    182.                 break;
    183.                 case 33:                //010BH        波形发生器异常2 中断入口
    184.                                                 //用户中断处理代码
    185.                 break;
    186.                 case 34:                //0113H        波形发生器异常4 中断入口
    187.                                                 //用户中断处理代码
    188.                 break;
    189.                 case 35:                //011BH        触摸按键 中断入口
    190.                                                 //用户中断处理代码
    191.                         j = TSSTA2;
    192.                         if(j & 0x40)        //数据溢出, 错误处理(略)
    193.                         {
    194.                                 TSSTA2 |= 0x40;        //写1清零                               
    195.                         }
    196.                         if(j & 0x80)        //扫描完成
    197.                         {
    198.                                
    199.                                 j &= 0x0f;
    200.                                 TSSTA2 |= 0x80;        //写1清零
    201.                                 if(!B_TK_Lowpass)        TK_cnt[j] = TSDAT/4;        //保存某个通道的读数        无低通滤波
    202.                                 else        TK_cnt[j] = ((TK_cnt[j] * 3)>>2) + TSDAT/16;        //保存某个通道的读数        低通滤波
    203.                                 if(j == 7)        {B_ReadKeyOk = 1;        //读完一次循环
    204.                                         }
    205.                         }
    206.                 break;
    207.                 case 36:                //0123H        RTC 中断入口
    208.                                                 //用户中断处理代码
    209.                 break;
    210.                 case 37:                //012BH        P0口中断入口
    211.                                                 //用户中断处理代码
    212.                 break;
    213.                 case 38:                //0133H        P1口中断入口
    214.                                                 //用户中断处理代码
    215.                 break;
    216.                 case 39:                //013BH        P2口中断入口
    217.                                                 //用户中断处理代码
    218.                 break;
    219.                 case 40:                //0143H        P3口中断入口
    220.                                                 //用户中断处理代码
    221.                 break;
    222.                 case 41:                //014BH        P4口中断入口
    223.                                                 //用户中断处理代码
    224.                 break;
    225.                 case 42:                //0153H        P5口中断入口
    226.                                                 //用户中断处理代码
    227.                 break;
    228.                 case 43:                //015BH        P6口中断入口
    229.                                                 //用户中断处理代码
    230.                 break;
    231.                 case 44:                //0163H        P7口中断入口
    232.                                                 //用户中断处理代码
    233.                 break;
    234.                 case 45:                //016BH        P8口中断入口
    235.                                                 //用户中断处理代码
    236.                 break;
    237.                 case 46:                //0173H        P9口中断入口
    238.                                                 //用户中断处理代码
    239.                 break;
    240.                
    241.                 default:
    242.                 break;
    243.         }
    244. }
    245. void uart_isr() interrupt 4
    246. {
    247.     if (TI)
    248.     {
    249.         TI = 0;
    250.         fBusy = 0;
    251.     }
    252.    
    253.     if (RI)
    254.     {
    255.         RI = 0;
    256. //        CheckCustomCmd(SBUF);                   //检测命令序列
    257.     }
    258. }
    259. char putchar(char dat)                          //重定义putchar系统函数
    260. {
    261.     while (fBusy);
    262.     fBusy = 1;
    263.     SBUF = dat;   
    264.     return dat;
    265. }
    复制代码



    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-14 04:36 , Processed in 0.075653 second(s), 55 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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