一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2927|回复: 11
收起左侧

[51单片机] 求助AT89C2051数码管和独立按键程序怎么写

[复制链接]
发表于 2014-5-2 18:30 | 显示全部楼层 |阅读模式
想做个AT89C2051+DS18B20可调温控器程序,没有按键显示正常,加了按键程序后闪烁,求助大侠指导一下,谢了
QQ截图20140502181017.png
发表于 2014-5-2 18:50 | 显示全部楼层
lz怎么也得上个程序吧
不然怎么看呀
发表于 2014-5-2 20:06 | 显示全部楼层
要加电阻…………
发表于 2014-5-2 21:03 | 显示全部楼层
NB……
读写复用不稀奇,关键还是按键和显示复用

点评

表示赞同,挂在位选上才有显示空当,挂在段选上,这怎么判断啊,还会有显示缺笔的错误。  发表于 2014-9-18 14:25
好像在哪儿见过。貌似还真的可以这样用。  发表于 2014-6-27 21:03
发表于 2014-5-4 08:38 | 显示全部楼层
你把按键放到位选的地方,不显示该位的时候检测按键还差不多
貌似这样还是会影响..

发表于 2014-6-3 16:45 | 显示全部楼层
本帖最后由 mfkyygt 于 2014-6-3 16:49 编辑

按键到数码管字段之间加二极管(1N4148)钳位,方向视乎数码管共阳还是共阴而定
实际电路中,2051的IO口为灌电流,故建议数码管位选应用三极管驱动,字段建议加330欧左右的限流电阻驱动

发表于 2014-6-17 22:42 | 显示全部楼层
本帖最后由 LBQ691477940 于 2014-6-17 22:44 编辑

TT截图未命名.jpg
/*********************************************************************************************
CLOCK V1.0
89C2051 + 4-digit 7-SEG led + 4-key switch
Simple Digital Clock demostrates scanning LED and key switch.
The clock has 1-bit output port P3.7 for driving AC load through MOC3040+triac.

The source program was modified for Proview32 C51 Compiler.
3 November 2542

                    *    ****       ****    ****
                    *   *    *  *  *    *  *    *
                    *   *    *     *    *  *    *
                    *    ****      *    *  *    *
                    *   *    *     *    *  *    *
                    *   *    *  *  *    *  *    *
                    *    ****       ****    ****
                    P3.0   P3.1  P3.2   P3.3
                     set   set   time   manual
                    HOUR   MIN  ON/OFF  ON/OFF

/**********************************************************************************************/
#include <reg52.h>
#include <stdio.h>      
unsigned  char sec100,sec,sec5,min,hour,flag1,command,temp,opto;
unsigned char i,digit,buffer[4],onHour1,onMin1,offHour1,offMin1;
char cputick,key,delay,count1;
//P1.0 = F / P1.1 = A / P1.2 = B / P1.3 = C / P1.4 = D / P1.5 = E / P1.6 = G / P1.7 = H
//                    0      1    2    3    4    5    6    7    8    9
char convert[10] = {0x3F,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0e,0x7f,0x5f};//共阴极
void pause(int j);    //延时
void scanLED();     //扫描4位数码管和4个按键,如果有按键按下,键值 = 0-3 否则键值 = -1
void manualOnOff();    //手动开关
void savetimeOnOff1();
void setmin();        //校分
void sethour();        //校时
void showOnce();
void savetimeOff1();
//void time();//更新即时时钟
void timeToBuffer();
void blink();        //闪烁
void offmsd();
void keyexe();        //按键处理
void keydelay();    //按键延时
void comparetime();    //比对时间
/**********************************************************************************************/
void timer0int (void)  interrupt 1  using 1
{
    TH0 |= 0xdc;
    cputick++;
    //time();       //更新即时时钟
    sec100++;
    if (sec100 >= 100)       //100 * 10 ms = 1 s
    {
        sec100 = 0;
        flag1 |= 0x05;   //set bit 0, bit 2
        temp = 50;
        sec++;
        if (sec >= 60)
        {
            sec = 0;
            flag1 |= 0x02; //set bit 1
            min++;
            if (min >= 60)
            {
                min = 0;
                hour++;
                if (hour >= 24)
                {
                    hour = 0;
                }
            }
        }
    }
}
/**********************************************************************************************
void time ()//更新即时时钟
{
    sec100++;
    if (sec100 >= 100)       //100 * 10 ms = 1 s
    {
        sec100 = 0;
        flag1 |= 0x05;   //set bit 0, bit 2
        temp = 50;
        sec++;
        if (sec >= 60)
        {
            sec = 0;
            flag1 |= 0x02; //set bit 1
            min++;
            if (min >= 60)
            {
                min = 0;
                hour++;
                if (hour >= 24)
                {
                    hour = 0;
                }
            }
        }
    }
}
/**********************************************************************************************/
void scanLED() //扫描4位数码管和4个按键,如果有按键按下,键值 = 0-3 否则键值 = -1
{
    int i;
    digit = 0x08;
    key = -1;
    for( i = 0; i < 4; i++)      //共4位数码管
    {
        P3 = ~digit & opto;      //送位选
        P1 = ~buffer;          //送段码
        pause(5);                 //延时
        P1 = 0xff;                //off LED
        if((P3 & 0x10) == 0)     //如果按键公共端P3.4变低
        key = i;                   //保存键值
        digit >>= 1;               //下一位
    }
}
/**********************************************************************************************/
void timeToBuffer()
{
    buffer[0] = convert[min % 10];
    buffer[1] = convert[min / 10];
    buffer[2] = convert[hour % 10];
    buffer[3] = convert[hour / 10];
}
/**********************************************************************************************/
void blink()
{
    if((flag1 & 0x04) != 0) //check bit 2 if set decrement temp until zero
    {
        temp--;
        if (temp != 0)
        {
            buffer[1] |= 0x80;
            buffer[2] |= 0x80;
        }
        else( flag1 &= ~0x04);
    }
}
/**********************************************************************************************/
void keyexe()    //按键处理
{
    if (key != -1)
    {
        if ((flag1 & 0x80) == 0)  // within 0.5 sec after 1st pressthe following execution is not allowed
        {
            flag1 |= 0x80;
            delay = 50;
            switch(key)
            {
                case (0): //key position 0
                manualOnOff();    //service key 0
                break;
                case (1): //key position 1
                savetimeOnOff1();  //service key 1
                break;
                case (2): //key position 2
                setmin(); //service key 2
                break;
                case (3): //key position 3
                sethour();
            }
        }
    }
}
/**********************************************************************************************/
void sethour()    //校时
{
    hour++;
    if( hour == 24)
    hour = 0;
}
/**********************************************************************************************/
void setmin()    //校分
{
    min++;
    sec = 0;
    if(min == 60 )
    min = 0;
}
/**********************************************************************************************/
void savetimeOnOff1()    //
{
    count1++;
    if (count1 == 1)
    {
        onHour1 = hour;
        onMin1 = min;
        buffer[0] = 0x00;
        buffer[1] = 0x68;
        buffer[2] = 0x78;
        buffer[3] = 0x71;
        showOnce();
    }
    else
    {
        count1 = 0;
        savetimeOff1();
    }
}
/**********************************************************************************************/
void savetimeOff1()
{
    offHour1 = hour;
    offMin1 = min;
    buffer[0] = 0x63;
    buffer[1] = 0x63;
    buffer[2] = 0x78;
    buffer[3] = 0x71;
    showOnce();
}
/**********************************************************************************************/
void manualOnOff()    //手动开关
{
    opto = ~opto | 0x7f;  //complement bit 7 which in turn activates P3.7
    if ((opto & 0x80) == 0)
    {
        buffer[0] = 0;
        buffer[1] = 0;
        buffer[2] = 0x68;
        buffer[3] = 0x78;
        showOnce();
    }
    else
    {
        buffer[0] = 0;
        buffer[1] = 0x63;
        buffer[2] = 0x63;
        buffer[3] = 0x78;
        showOnce();
    }
}
/**********************************************************************************************/
void showOnce()
{
    int i;
    for(i = 0;i < 2000;i++)
    scanLED();
}
/**********************************************************************************************/
void keydelay()    //按键延时
{
    if ((flag1 & 0x80) != 0)
    {
        delay--;
        if(delay == 0)
        flag1 &= ~0x80;
    }
}
/**********************************************************************************************/
void comparetime()    //比对时间
{
    if((flag1 & 0x01) != 0 )
    {
        flag1 &= ~0x01;
        if(hour == onHour1 && min == onMin1)
        opto = 0x7f; //P3.7 = 0 on
        if(hour == offHour1 && min == offMin1)
        opto = 0xff; //P3.7 = 1 off
    }
}
/**********************************************************************************************/
void offmsd()
{
    if(buffer[3] == 0x3f)    //if msd = '0' then put blank unstead
    buffer[3] = 0x00;
}
/**********************************************************************************************/
void pause(int j)    //延时
{
    int i;
    for (i = 0; i < j; i++);
}
/**********************************************************************************************/
void main()
{
    EA = 1;
    ET0 = 1;  //
    TMOD |= 0x01; //
    TR0 = 1; //
    opto = 0xff;
    cputick = 0;
    hour = 18;
    min = 0;
    sec = 0;
    key = -1;
    flag1 = 0;
    onHour1 = 18;       //18:01 on
    onMin1 = 01;           //18:01 on
    offHour1 = 18;       //18:02 off
    offMin1 = 02;       //18:02 off
    count1 = 0;
    buffer[0] = 0x40;
    buffer[1] = 0x40;
    buffer[2] = 0x40;
    buffer[3] = 0x40;
    while(1)
    {
        while ( cputick < 1)
        scanLED();
        cputick = 0;
        //下列任务每10ms运行一次
        timeToBuffer();
        blink();
        offmsd();
        keyexe();
        keydelay();
        comparetime();
    }
}
/**********************************************************************************************/





发表于 2014-6-27 22:09 | 显示全部楼层
把按键识别整合到显示中去。
显示刷新时不识别按键,刷新完一次后关掉显示检测按键。
你把显示和按键公用然后软件单独处理肯定会互相影响,整合就好了。
 楼主| 发表于 2014-9-18 11:30 | 显示全部楼层
谢谢大侠们的指点
发表于 2016-4-13 00:05 | 显示全部楼层
做过一个,按键接触电流过大,很容易失效,按键一段时间后很快失灵!

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-20 00:23 , Processed in 0.060738 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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