被一个简单的功能程序搞蒙了

[复制链接]
3169|32
 楼主| LKC134 发表于 2019-5-17 18:53 | 显示全部楼层 |阅读模式
LED, ui, ST, ck, se
原本是数码管动态扫描并用按键调加减数字变化,刚开始是OK的,在写EEPROM保存数据设置,后来更改数码管扫描方式按键没作用了,如把显示取消后,按键就有作用,现用LED作测试,发现系统只能执行一道任务类似,MCU用的是STC15W408AS,按键改成最老方式和状态按键都是这样,硬件也更换MCU了,这几天都搞晕了,请各位大神帮忙看看指点下。谢谢!
请看下面的程序 :
  1. include"STC15W.H"
  2. #include"intrins.h"
  3. #define uchar unsigned char  
  4. #define uint unsigned int
  5. void digplay(uint hig);
  6. void key();
  7. sbit PWM=P1^7;
  8. sbit LED1=P5^5;
  9. sbit up=P1^4;
  10. sbit down=P1^5;
  11. sbit ba=P1^1;
  12. sbit sh=P1^0;
  13. sbit ge=P1^2;
  14. sbit dn=P1^3;
  15. uint hig=250;
  16. uchar code LED[]={0xCF,0x81,0xEA,0xE3,0xA5,0x67,0x6F,0xC1,0xEF,0xE7,0x5e};
  17. /************延时子程序*************/
  18. void delayxms(uint z)
  19. {
  20. uint y,x;
  21. for(y=z;x>0;x--)
  22.     for(y=110;y>0;y--);
  23.     }
  24. void KeyScan(void)//按键扫描
  25. {
  26.    static uchar key1_lock=0;//自锁标志
  27.   static uint count1=0;//计数延时
  28.   static uchar key2_lock=0;//
  29.    static uint count2=0;//
  30. if(up==0)
  31.    {
  32.     if((count1++>=5)&&(key1_lock==0))
  33.       {
  34.       key1_lock=1;
  35.            LED1=~LED1;
  36.          }
  37.           }
  38.    else
  39.        {
  40.             key1_lock=0;
  41.             count1=0;
  42.             }
  43.          if(down==0)
  44.          {
  45.            if((count2++>=5)&&(key2_lock==0))
  46.            {
  47.              key2_lock=1;
  48.                  LED1=~LED1;
  49. }
  50.          }
  51.          else
  52.             {
  53.              key2_lock=0;
  54.                  count2=0;
  55.                  }
  56.            }
  57. void Init2()//定时器2初始化
  58. {
  59. AUXR&=0x04;        //12T
  60.     T2L=0x78;        //定时5MS
  61.     T2H=0xec;        //
  62.    
  63.     IE2|=0x04;
  64.     AUXR|=0x10;        //开始计时
  65.    EA=1;
  66.     }        

  67. void digplay(uint hig)//数码管动态扫描
  68. {
  69.    
  70.          static uchar i=0;
  71.            
  72.            P3=0x00;
  73.           switch(i)
  74.           {
  75.            case 0:
  76.                  P3=LED[hig/100];
  77.                          P1=0x02;
  78.                          P1=0x00;
  79.                          i++;
  80.                          break;
  81.            case 1:
  82.                  P3=LED[hig/10%10];
  83.                          P1=0x01;
  84.                          P1=0x00;
  85.                          i++;
  86.                          break;
  87.            case 2:
  88.                  P3=LED[hig%10];
  89.                          P1=0x04;
  90.                          P1=0x00;
  91.                          i++;
  92.                          break;
  93.                  case 3:
  94.                      P3=0x5e;
  95.                          P1=0x08;
  96.                          P1=0x00;
  97.                          i=0;
  98.                          break;
  99.                          }
  100.                          delayxms(5);
  101.               }
  102. void main()//主程序
  103. {
  104. Init2();
  105. P5M0=0xff;
  106.    P5M1=0x00;
  107.    P3M0=0xff;
  108.    P3M1=0x00;
  109.    P1M0=0xff;
  110.    P1M1=0xf0;
  111. while(1)
  112.    {

  113.      digplay(hig);
  114.     }
  115. }
  116. void t2int() interrupt 12
  117. {
  118.     KeyScan();
  119. }



 楼主| LKC134 发表于 2019-5-17 19:08 | 显示全部楼层
附图是原理图,请各位指点迷津。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
叶春勇 发表于 2019-5-17 19:35 | 显示全部楼层
  static uchar key1_lock=0;//自锁标志
  static uint count1=0;//计数延时
  static uchar key2_lock=0;//
   static uint count2=0;//

这个几个变量,移动到main()前面去。再加volatile
volatile static uint count2=0;//
 楼主| LKC134 发表于 2019-5-17 20:26 | 显示全部楼层
叶春勇 发表于 2019-5-17 19:35
static uchar key1_lock=0;//自锁标志
  static uint count1=0;//计数延时
  static uchar key2_lock=0;/ ...

这几个变量定义局部或全局不会和显示造成冲突吧??
 楼主| LKC134 发表于 2019-5-17 20:29 | 显示全部楼层
感谢这位兄台参与回复,但发现很多例程都是这样定义的,照理应该不会出现这种状况才是。真是有点邪门。
 楼主| LKC134 发表于 2019-5-17 20:32 | 显示全部楼层
我刚开始写完显示和按键都没问题的,后来增加保存程序发现扫描显示会闪,所以就换另一种扫描方式,然后就出现按键没作用了。
 楼主| LKC134 发表于 2019-5-17 20:33 | 显示全部楼层
接着又改回来还是不行,邪门啊。被它搞晕了
dirtwillfly 发表于 2019-5-17 22:33 | 显示全部楼层
画个流程图啊。画一画思路就清楚了。
好脑子不如烂笔头
叶春勇 发表于 2019-5-18 00:54 | 显示全部楼层
把keyscan()注释掉。定时器中断中弄个数自加,然后数码管的数字会变吗?
 楼主| LKC134 发表于 2019-5-18 08:01 | 显示全部楼层
叶春勇 发表于 2019-5-18 00:54
把keyscan()注释掉。定时器中断中弄个数自加,然后数码管的数字会变吗?

把按键注释,中断自加数码管数字是有变化的
叶春勇 发表于 2019-5-18 08:59 | 显示全部楼层
void t2int() interrupt 12
{
      key_scan_flag=1;
}


在main函数中加入
if(key_scan_flag)
{
keyscan();
key_scan_flag=0;
}

key_scan()函数,推倒重来,先搞一个按钮试验下。
 楼主| LKC134 发表于 2019-5-18 09:17 | 显示全部楼层
多谢,我找到原因了,原来是IO模式设置问题,昨晚我从另一块开发板(STC8A)上试验是OK的,随后检查下IO口模式设置,发现目前在STC15芯处上按键设置的是开漏模式,应改成高阻才对
 楼主| LKC134 发表于 2019-5-18 09:19 | 显示全部楼层
改成这样:P1M0=0x0f,
                P1M1=0xfo;
 楼主| LKC134 发表于 2019-5-18 09:48 | 显示全部楼层
另外有个问题请教下,在按键处加EEPROM保存后,按 一下按键显示会闪一下的,是不是数码管扫描部分要拆开扫描??(因为在主程序最开头那设置100ms延时,否则无法读出保存)
 楼主| LKC134 发表于 2019-5-18 09:51 | 显示全部楼层
void main()
{
  delayxms(100);
  Init();
.......读出EEPROM
while(1)
{
  按键.....
}
}
这样就影响扫描了
叶春勇 发表于 2019-5-18 10:39 | 显示全部楼层
简单的分片扫描:
void t2int() interrupt 12
{
      flag++;
}

在main函数中:

switch(flag%4)
{
case0:
case1:
case2:
case3:
}
叶春勇 发表于 2019-5-18 10:54 | 显示全部楼层
数码管的扫描总共4位,按照25次/秒扫描,需要100HZ。
数码管扫描,要有停留时间的。每个数码位扫一次,停留一段时间,然后再扫下位,再停留一段时间。这样数码管显示很清晰的。
你的程序扫的太快了。
 楼主| LKC134 发表于 2019-5-18 11:50 | 显示全部楼层
叶春勇 发表于 2019-5-18 10:54
数码管的扫描总共4位,按照25次/秒扫描,需要100HZ。
数码管扫描,要有停留时间的。每个数码位扫一次,停留 ...

我把它改用定时器扫描,数码管就很亮及清晰,但还是受按键影响,如注释EEPROM设置就不会影响
void t2int()//定时10sm
{
digplay();
}
void digplay(void)
{
static uchar i=0;
  switch(i)
{
   case 1
   case 2
   .......
   .......
}
}
 楼主| LKC134 发表于 2019-5-18 11:51 | 显示全部楼层
定时10ms,打错了。
hobbye501 发表于 2019-5-18 13:29 | 显示全部楼层
按键用中断服务  数码管用查询
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

348

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部