找回密码
 立即注册
查看: 121|回复: 4

请教大神一个问题。只有一个按键使用P3.2。作为下载和开关机

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:606
  • 最近打卡:2026-03-07 08:02:39

29

主题

140

回帖

662

积分

高级会员

积分
662
发表于 2026-2-20 21:08:58 | 显示全部楼层 |阅读模式
如题:芯片STC32G12K128  使用带开关的EC11编码器,开关使用  使用端口P3.2。
(USB下载时候长按P3.2进入下载模式)。
正常使用的时候作为一个菜单按键。
还要兼职长按  关机。。在长按开机。可以实现吗?

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:719
  • 最近打卡:2026-03-07 07:41:42
已绑定手机

97

主题

7247

回帖

1万

积分

超级版主

积分
13780
发表于 2026-2-21 00:49:10 | 显示全部楼层
省电模式,INT0中断唤醒,GPIO读按键,可行
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-03-06 15:51:42
已绑定手机

2

主题

17

回帖

114

积分

注册会员

积分
114
发表于 2026-2-22 17:13:08 | 显示全部楼层
此测试程序基本符合楼主需求,短按开机,正常工作期间可以用于菜单,长按关机。USB下载时候先按key再上电进入下载模式没有问题。
  1. //一键开/关机(掉电唤醒)
  2. //适合STC15/STC8系列,测试平台 TX-1C 开发板,MCU型号STC8H1K08
  3. //#include <STC15F2K60S2.H>
  4. #include <STC8H.H>
  5. #include "intrins.h"
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. sbit key  = P3^2;//S14
  9. sbit GND  = P3^4;//矩阵键盘模拟接地
  10. uchar Temp;
  11. uchar Key_value; //键值
  12. uint  keyTim;    //按键时长
  13. bit   flag1ms;   //1ms中断标志
  14. bit   on_off;    //开关标志
  15. bit   allow;     //允许关机标志
  16. void Timer0Init(void)//1毫秒@11.0592MHz
  17. {
  18.         AUXR |= 0x80;                //定时器时钟1T模式
  19.         TMOD &= 0xF0;                //设置定时器自动重载模式
  20.         TL0 = 0xCD;                        //设置定时初始值
  21.         TH0 = 0xD4;                        //设置定时初始值
  22.         TF0 = 0;                                //清除TF0标志
  23.         TR0 = 1;                                //定时器0开始计时
  24.         ET0 = 1;                                //允许T0中断
  25. //        EA  = 1;                                //开总中断
  26. }
  27. void Delay20ms()                //@11.0592MHz
  28. {
  29.         unsigned char i, j;
  30.         i = 216;
  31.         j = 37;
  32.         do
  33.         {
  34.                 while (--j);
  35.         } while (--i);
  36. }
  37. void key_scan()    //按键扫描函数
  38. {
  39.         if(flag1ms)  //1ms时间标志
  40.         {
  41.                 flag1ms = 0;//1ms时间标志清0
  42.                 if(!key && !on_off)
  43.                 {
  44.                         if(++keyTim>1000)keyTim=1001;//防止溢出
  45.                         if(keyTim==20) //大于20ms小于1s算短按
  46.                         {
  47.                                 Key_value=0x01;
  48.                         }
  49.                         if(keyTim==1000) //达到1s算长按
  50.                         {
  51.                                 Key_value|=0x10;
  52.                         }
  53.                 }
  54.                 else
  55.                 {
  56.                         keyTim=0;        //按键松手keyTim清0
  57.                 }
  58.         }
  59. }
  60. void key_service()//按键服务函数
  61. {//短按等松手响应,长按达1s不论是否松手即响应
  62.         if((keyTim==0||keyTim==1000) && Key_value!=0x00)
  63.         {
  64.                 if(Key_value==0x01)//短按任务
  65.                 {
  66.                         Temp++;
  67.                         P1=~Temp;//演示,LED低电平亮
  68.                 }
  69.                 if(Key_value==0x11)//长按关机
  70.                 {
  71.                         allow=1;//允许休眠
  72.                 }
  73.                 Key_value=0x00;//任务完成后键值清0
  74.         }
  75. }
  76. void Shutdown()//掉电模式函数
  77. {
  78.         if(allow)
  79.         {
  80.                 P1=0xff;                //关闭LED显示
  81.                 //关闭所有在用硬件,减小能耗
  82.                 while(!key);//等待按键松手
  83.                 Delay20ms();//消抖防止误动作
  84.                 EX0 = 1;                //开外部中断
  85.                 PCON = 0x02;//MCU进入掉电模式
  86. /************************************************/
  87.                 _nop_();    //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
  88.                 _nop_();    //中断服务程序执行完再接着此句继续执行
  89.                 while(!key);//等待按键松手,防止按键扫描程序误读
  90.                 Delay20ms();//消抖防止误动作
  91.                 //打开所有在用硬件,恢复正常运行
  92.                 allow=0;                //清0
  93.                 on_off=0;        //开关标志清0
  94.                 P1=~Temp;        //恢复LED显示
  95.         }
  96. }
  97. void main()
  98. {
  99.         P0M0 = 0x00;//初始化IO
  100.         P0M1 = 0x00;
  101.         P1M0 = 0x00;
  102.         P1M1 = 0x00;
  103.         P2M0 = 0x00;
  104.         P2M1 = 0x00;
  105.         P3M0 = 0x00;
  106.         P3M1 = 0x00;
  107.         P4M0 = 0x00;
  108.         P4M1 = 0x00;
  109.         P5M0 = 0x00;
  110.         P5M1 = 0x00;
  111.         P6M0 = 0x00;
  112.         P6M1 = 0x00;
  113.         P7M0 = 0x00;
  114.         P7M1 = 0x00;
  115.         GND  = 0;
  116.         IT0 = 1;//设置INT0的中断类型为下降沿唤醒
  117. //        EX0 = 1;//使能INT0中断
  118.         EA  = 1;//开总中断                                                        
  119.         Timer0Init();//定时器初始化函数
  120.         while (1)
  121.         {
  122.                 key_scan();                //按键扫描函数
  123.                 key_service(); //按键服务函数
  124.                 Shutdown();                //掉电模式函数
  125.         }
  126. }
  127. //INT0中断服务程序
  128. void exint0() interrupt 0
  129. {
  130.         EX0 = 0;                //关外部中断
  131.         on_off=1;//开关标志置1
  132. }
  133. //T0中断服务程序
  134. void interruptTimer0() interrupt 1
  135. {
  136.         flag1ms = 1;    //1ms标志
  137. }
复制代码

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:606
  • 最近打卡:2026-03-07 08:02:39

29

主题

140

回帖

662

积分

高级会员

积分
662
发表于 2026-2-22 23:17:07 | 显示全部楼层
wul*** 发表于 2026-2-22 17:13
此测试程序基本符合楼主需求,短按开机,正常工作期间可以用于菜单,长按关机。USB下载时候先按key再上电进 ...

非常感谢
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:568
  • 最近打卡:2026-03-05 20:14:34
已绑定手机

24

主题

522

回帖

1195

积分

金牌会员

积分
1195
发表于 2026-2-23 10:18:44 | 显示全部楼层
wul*** 发表于 2026-2-22 17:13
此测试程序基本符合楼主需求,短按开机,正常工作期间可以用于菜单,长按关机。USB下载时候先按key再上电进 ...

收藏了,感谢分享
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 16:59 , Processed in 0.104675 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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