找回密码
 立即注册
查看: 775|回复: 8

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 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, 下载次数: 90

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

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

截图202312281211178783.jpg

截图202312281212101946.jpg

PCB(单个多页).pdf

657.76 KB, 下载次数: 83

PCB(多个单页).pdf

483.15 KB, 下载次数: 76

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 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. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

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

实物图:

实物.jpg
实物2.jpg


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 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. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-04-17 01:59:50
已绑定手机

6

主题

18

回帖

98

积分

注册会员

积分
98
发表于 2025-4-11 18:21:41 | 显示全部楼层
xxkj*** 发表于 2023-12-29 10:38
自己弄好了,main代码如下:

这个可以直接烧录测试吗
STC8H1K17T
大佬
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2025-4-11 19:44:01 | 显示全部楼层
zpzo*** 发表于 2025-4-11 18:21
这个可以直接烧录测试吗
STC8H1K17T
大佬

自己试试吧,反正不行还可以重新下载,又不会损坏MCU
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:19 , Processed in 0.159605 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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