找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1560|回复: 3
打印 上一主题 下一主题
收起左侧

关于单片机AD转换中按键控制的问题

[复制链接]
跳转到指定楼层
楼主
这个程序不加按键可以正常显示,加上按键之后按键不起作用,按键功能是按一下采集一个数,想问一下怎么解决?
程序如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code zixingma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code weixuan[]={0x10,0x20,0x40,0x80};

sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit ALE=P3^3;
sbit P07=P0^7;
sbit key=P3^5;
void key_scan(void);
void caiji(void);   
void delay5ms(void)
{
        unsigned char i,j;
        for(i=10;i>0;i--)
                for(j=248;j>0;j--);
}               
uchar flag;                 
void delay(uchar t)
{
        while(t--);
}
void disp(uint num)
{
        uchar i,zheng,dian1,dian2,dian3;
        zheng=num/1000;
        dian1=num%1000/100;
        dian2=num%100/10;
        dian3=num%100%10;
        for(i=0;i<4;i++)
        {
                P1=0xff;
                switch(i)
                {
                        case 0:P2=weixuan[ i];P0=zixingma[zheng];P07=0;break;
                        case 1:P2=weixuan[ i];P0=zixingma[dian1];break;
                        case 2:P2=weixuan[ i];P0=zixingma[dian2];break;
                        case 3:P2=weixuan[ i];P0=zixingma[dian3];break;
                }
                delay(200);
        }
}
uint ADC0809(void)
{
        uint n;
        OE=0;
        ST=0;
        ALE=0;
        ST=1;
        ALE=1;
        ST=0;
        ALE=0;        
        delay(10);
        while(!EOC);
        OE=1;
        n=P1;
        OE=0;
        return n;
}
void main()
{
        while(1)
        {
                key_scan();
                switch(flag)
                {
                        case 0:caiji();        disp(ADC0809()*19.6078);break;
                }
        }
}
void key_scan()
{
        if(key==0)
        {
                delay5ms();
                if(key==0)
                {
                        flag=0;
                        while(key==1)
                                delay5ms();
                        
                }
        }
}
void caiji()
{
        uint ADC0809(void);        
}

X7NV7PFTL(O3DV)U9((IGOU.png (39.93 KB, 下载次数: 63)

X7NV7PFTL(O3DV)U9((IGOU.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:716292 发表于 2020-5-18 14:57 | 只看该作者
写消抖程序
回复

使用道具 举报

板凳
ID:749362 发表于 2020-5-18 15:18 | 只看该作者
根据以上的代码,可以发现,按键理应没有作用。
因为你定义了一个变量flag,没有进行初始化,所以编译器会默认为0,此时按键根据程序会执行caiji();        disp(ADC0809()*19.6078);break;
运行后,按下按键时,flag也会置0,此时仍然会执行caiji();    文中缺少了flag =1 ;的语句!
建议,在按键中,添加Flag置1的语句或者在执行完caiji()后对flag进行置1操作。以实现按键没有按下时,不执行ADC转换函数。

以上希望对你有所帮助。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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