打印

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

[复制链接]
2196|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LKC134|  楼主 | 2019-5-17 18:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
LED, ui, ST, ck, se
原本是数码管动态扫描并用按键调加减数字变化,刚开始是OK的,在写EEPROM保存数据设置,后来更改数码管扫描方式按键没作用了,如把显示取消后,按键就有作用,现用LED作测试,发现系统只能执行一道任务类似,MCU用的是STC15W408AS,按键改成最老方式和状态按键都是这样,硬件也更换MCU了,这几天都搞晕了,请各位大神帮忙看看指点下。谢谢!
请看下面的程序 :
include"STC15W.H"
#include"intrins.h"
#define uchar unsigned char  
#define uint unsigned int
void digplay(uint hig);
void key();
sbit PWM=P1^7;
sbit LED1=P5^5;
sbit up=P1^4;
sbit down=P1^5;
sbit ba=P1^1;
sbit sh=P1^0;
sbit ge=P1^2;
sbit dn=P1^3;
uint hig=250;
uchar code LED[]={0xCF,0x81,0xEA,0xE3,0xA5,0x67,0x6F,0xC1,0xEF,0xE7,0x5e};
/************延时子程序*************/
void delayxms(uint z)
{
uint y,x;
for(y=z;x>0;x--)
    for(y=110;y>0;y--);
    }
void KeyScan(void)//按键扫描
{
   static uchar key1_lock=0;//自锁标志
  static uint count1=0;//计数延时
  static uchar key2_lock=0;//
   static uint count2=0;//
if(up==0)
   {
    if((count1++>=5)&&(key1_lock==0))
      {
      key1_lock=1;
           LED1=~LED1;
         }
          }
   else
       {
            key1_lock=0;
            count1=0;
            }
         if(down==0)
         {
           if((count2++>=5)&&(key2_lock==0))
           {
             key2_lock=1;
                 LED1=~LED1;
}
         }
         else
            {
             key2_lock=0;
                 count2=0;
                 }
           }
void Init2()//定时器2初始化
{
AUXR&=0x04;        //12T
    T2L=0x78;        //定时5MS
    T2H=0xec;        //
   
    IE2|=0x04;
    AUXR|=0x10;        //开始计时
   EA=1;
    }        

void digplay(uint hig)//数码管动态扫描
{
   
         static uchar i=0;
           
           P3=0x00;
          switch(i)
          {
           case 0:
                 P3=LED[hig/100];
                         P1=0x02;
                         P1=0x00;
                         i++;
                         break;
           case 1:
                 P3=LED[hig/10%10];
                         P1=0x01;
                         P1=0x00;
                         i++;
                         break;
           case 2:
                 P3=LED[hig%10];
                         P1=0x04;
                         P1=0x00;
                         i++;
                         break;
                 case 3:
                     P3=0x5e;
                         P1=0x08;
                         P1=0x00;
                         i=0;
                         break;
                         }
                         delayxms(5);
              }
void main()//主程序
{
Init2();
P5M0=0xff;
   P5M1=0x00;
   P3M0=0xff;
   P3M1=0x00;
   P1M0=0xff;
   P1M1=0xf0;
while(1)
   {

     digplay(hig);
    }
}
void t2int() interrupt 12
{
    KeyScan();
}



使用特权

评论回复

相关帖子

沙发
LKC134|  楼主 | 2019-5-17 19:08 | 只看该作者
附图是原理图,请各位指点迷津。

llee.JPG (153.74 KB )

llee.JPG

使用特权

评论回复
板凳
叶春勇| | 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;/ ...

这几个变量定义局部或全局不会和显示造成冲突吧??

使用特权

评论回复
5
LKC134|  楼主 | 2019-5-17 20:29 | 只看该作者
感谢这位兄台参与回复,但发现很多例程都是这样定义的,照理应该不会出现这种状况才是。真是有点邪门。

使用特权

评论回复
6
LKC134|  楼主 | 2019-5-17 20:32 | 只看该作者
我刚开始写完显示和按键都没问题的,后来增加保存程序发现扫描显示会闪,所以就换另一种扫描方式,然后就出现按键没作用了。

使用特权

评论回复
7
LKC134|  楼主 | 2019-5-17 20:33 | 只看该作者
接着又改回来还是不行,邪门啊。被它搞晕了

使用特权

评论回复
8
dirtwillfly| | 2019-5-17 22:33 | 只看该作者
画个流程图啊。画一画思路就清楚了。
好脑子不如烂笔头

使用特权

评论回复
9
叶春勇| | 2019-5-18 00:54 | 只看该作者
把keyscan()注释掉。定时器中断中弄个数自加,然后数码管的数字会变吗?

使用特权

评论回复
10
LKC134|  楼主 | 2019-5-18 08:01 | 只看该作者
叶春勇 发表于 2019-5-18 00:54
把keyscan()注释掉。定时器中断中弄个数自加,然后数码管的数字会变吗?

把按键注释,中断自加数码管数字是有变化的

使用特权

评论回复
11
叶春勇| | 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()函数,推倒重来,先搞一个按钮试验下。

使用特权

评论回复
12
LKC134|  楼主 | 2019-5-18 09:17 | 只看该作者
多谢,我找到原因了,原来是IO模式设置问题,昨晚我从另一块开发板(STC8A)上试验是OK的,随后检查下IO口模式设置,发现目前在STC15芯处上按键设置的是开漏模式,应改成高阻才对

使用特权

评论回复
13
LKC134|  楼主 | 2019-5-18 09:19 | 只看该作者
改成这样:P1M0=0x0f,
                P1M1=0xfo;

使用特权

评论回复
14
LKC134|  楼主 | 2019-5-18 09:48 | 只看该作者
另外有个问题请教下,在按键处加EEPROM保存后,按 一下按键显示会闪一下的,是不是数码管扫描部分要拆开扫描??(因为在主程序最开头那设置100ms延时,否则无法读出保存)

使用特权

评论回复
15
LKC134|  楼主 | 2019-5-18 09:51 | 只看该作者
void main()
{
  delayxms(100);
  Init();
.......读出EEPROM
while(1)
{
  按键.....
}
}
这样就影响扫描了

使用特权

评论回复
16
叶春勇| | 2019-5-18 10:39 | 只看该作者
简单的分片扫描:
void t2int() interrupt 12
{
      flag++;
}

在main函数中:

switch(flag%4)
{
case0:
case1:
case2:
case3:
}

使用特权

评论回复
17
叶春勇| | 2019-5-18 10:54 | 只看该作者
数码管的扫描总共4位,按照25次/秒扫描,需要100HZ。
数码管扫描,要有停留时间的。每个数码位扫一次,停留一段时间,然后再扫下位,再停留一段时间。这样数码管显示很清晰的。
你的程序扫的太快了。

使用特权

评论回复
18
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
   .......
   .......
}
}

使用特权

评论回复
19
LKC134|  楼主 | 2019-5-18 11:51 | 只看该作者
定时10ms,打错了。

使用特权

评论回复
20
hobbye501| | 2019-5-18 13:29 | 只看该作者
按键用中断服务  数码管用查询

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

339

帖子

6

粉丝