找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7210|回复: 17
收起左侧

at89c51单片机按键实现八位一体数码管的递增显示程序

[复制链接]
ID:441506 发表于 2018-12-7 10:58 | 显示全部楼层 |阅读模式
at89c2单片机  一个按键实现八位一体数码管的递增显示 。按第一次 第一位显示一个数,
按第二次,第一位数不消失,显示第二位数,
按第三次,第一位,第二位都不消失,显示第三位数,以此类推
请大神教我编程序。谢谢。我的电路图已经画好了。
八段数码管 - ISIS Professional (仿真中......)_2.jpg
八段数码管 - ISIS Professional (仿真中......)_3.jpg
八段数码管 - ISIS Professional (仿真中......).jpg
回复

使用道具 举报

ID:21069 发表于 2018-12-7 16:04 | 显示全部楼层
按你的意思不用接74HC573,数码管可直接接P2与P3口,代码如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

//段码表   注意:是共阳数码管
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//位码表
uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//延时
void delay_mS(uint x)
{
uchar t;
while(x--) for(t=0;t<120;t++);
}

void main()
{
        uchar i,j;
        while(1)
        {       
                for(j=0;j<8;j++)
                {
                        P2=0x00;
                        P2=duan[j];            //发送段码
                        P3=wei[j];             //发送位码
                        delay_mS(100);         //将动态时间延长就是你要的效果
                }
        }
}

评分

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

查看全部评分

回复

使用道具 举报

ID:222948 发表于 2018-12-7 16:04 | 显示全部楼层
有什么福利
回复

使用道具 举报

ID:441506 发表于 2018-12-8 18:28 | 显示全部楼层
jinsheng7533967 发表于 2018-12-7 16:04
按你的意思不用接74HC573,数码管可直接接P2与P3口,代码如下:
#include
#define uchar unsigned char

大哥 谢谢 你的程序 但是 你编的  没有按键呀
回复

使用道具 举报

ID:441506 发表于 2018-12-8 18:40 | 显示全部楼层
jinsheng7533967 发表于 2018-12-7 16:04
按你的意思不用接74HC573,数码管可直接接P2与P3口,代码如下:
#include
#define uchar unsigned char

大哥 我需要 一个按键控制呀
回复

使用道具 举报

ID:441506 发表于 2018-12-9 08:22 | 显示全部楼层
yingchun 发表于 2018-12-8 20:48
有用的帖子,收藏了以后学习

兄弟 你会编写程序吗
回复

使用道具 举报

ID:213173 发表于 2018-12-9 12:46 | 显示全部楼层
本帖最后由 wulin 于 2018-12-9 16:23 编辑

给你写一个适合做密码锁的显示电路。完全符合你想要的功能。

无标题.jpg

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit dula=P3^0;  //HL-1
sbit wela=P3^1; //HL-1
sbit key =P3^2;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
                    0x6d,0x7d,0x07,0x7f,0x6f};
uchar data dis_buf[9];
uint num=0;

void keyscan()//按键程序        
{
        static uchar count;        //计数消抖变量                        
        static bit key_sign=0;        //按键自锁标志
        uchar a;
        if(key==0)                                //检测输入如果为0
        {
                if((++count>=100)&&(key_sign==0))
                {                        
                        key_sign=1;                //按键自锁标志置1,防止重复响应
                        num++;
                        if(num>=9)
                                num=0;
                        dis_buf[0]=num;
                        for(a=8;a>0;a--)
                                dis_buf[a]=dis_buf[a-1];
                }
        }
        else
        {
                count=0;                                //计数变量清0
                key_sign=0;                                //按键自锁标志清0
        }
}
void display()//显示程序
{
        static uchar i=0,j;        //计数变量
        if(++j>100)//调整数码管刷新频率
        {
                j=0;
                P2=0x00;
                dula=1;
                dula=0;
                switch(i)
                {
                        case 0:
                                P2=0xfe;
                                wela=1;
                                wela=0;
                                if(num>7)
                                P2=table[dis_buf[8]];
                                else P2=0x00;
                                dula=1;
                                dula=0;
                                i++;
                        break;
                        case 1:                                
                                P2=0xfd;
                                wela=1;
                                wela=0;
                                if(num>6)
                                P2=table[dis_buf[7]];
                                else P2=0x00;
                                dula=1;
                                dula=0;
                                i++;
                        break;
                        case 2:                                
                                P2=0xfb;
                                wela=1;
                                wela=0;
                                if(num>5)
                                P2=table[dis_buf[6]];
                                else P2=0x00;
                                dula=1;
                                dula=0;
                                i++;
                        break;
                        case 3:                                       
                                P2=0xf7;
                                wela=1;
                                wela=0;
                                if(num>4)
                                P2=table[dis_buf[5]];
                                else P2=0x00;
                                dula=1;
                                dula=0;
                                i++;
                        break;
                        case 4:        
                                P2=0xef;
                                wela=1;
                                wela=0;
                                if(num>3)
                                P2=table[dis_buf[4]];
                                else P2=0x00;
                                dula=1;
                                dula=0;
                                i++;
                        break;
                        case 5:        
                                P2=0xdf;
                                wela=1;
                                wela=0;
                                if(num>2)
                                P2=table[dis_buf[3]];
                                else P2=0x00;
                                dula=1;
                                dula=0;
                                i++;
                        break;
                        case 6:        
                           P2=0xbf;
                           wela=1;
                           wela=0;
                                if(num>1)
                                P2=table[dis_buf[2]];
                                else P2=0x00;
                                dula=1;
                                dula=0;
                                i++;
                        break;
                        case 7:        
                                P2=0x7f;
                                wela=1;
                                wela=0;
                                if(num>0)
                                P2=table[dis_buf[1]];
                                else P2=0x00;
                                dula=1;
                                dula=0;
                                i=0;
                        break;
                }
        }
}
void main()
{
        while(1)
        {
                keyscan();
                display();
        }
}



回复

使用道具 举报

ID:442704 发表于 2018-12-9 16:26 | 显示全部楼层
这个建议你慢慢学,自己编程才有乐趣,没有基础的话,别人的不容易看懂。
回复

使用道具 举报

ID:21069 发表于 2018-12-9 16:28 | 显示全部楼层
1628990936 发表于 2018-12-8 18:28
大哥 谢谢 你的程序 但是 你编的  没有按键呀

给你一个独立按键代码,你可以自己加进去试试,另外你空间里提到的用74HC573按按键保存密码的事不现实,74HC573是锁存器(当使能位低电平时,锁存你刚从P/I口送去的数据,P/I口再来的数据据之门外;当使能位高电平时,输出随P/I口变化),不是记忆芯片,不可能保存你说的所谓密码,只能用动态扫描扫出你要的数字。另外网上有很多独立按键的与数码管的视频教程,多看几次,多敲几次就明白了。

void PORT_key(void)
{
        if(key == 0)            //将你的按键位定意为key
        {
                delay(10);          //消抖
                if(key == 0)
                {
                        while(key == 0);//松手
                        i++;  //不知你的变量是不是i
                }
        }
}

再将此代码放入while(1)中.去掉for的8次循环,i 放入数组中
回复

使用道具 举报

ID:441506 发表于 2018-12-9 18:36 | 显示全部楼层
wulin 发表于 2018-12-9 12:46
给你写一个适合做密码锁的显示电路。完全符合你想要的功能。

谢谢 大佬 非常感谢 留个微信吧 我给你发个红包
回复

使用道具 举报

ID:441506 发表于 2018-12-9 18:37 | 显示全部楼层
jinsheng7533967 发表于 2018-12-9 16:28
给你一个独立按键代码,你可以自己加进去试试,另外你空间里提到的用74HC573按按键保存密码的事不现实,7 ...

谢谢 大哥,留个vx  我给你发个红包
回复

使用道具 举报

ID:441506 发表于 2018-12-14 11:24 | 显示全部楼层
wulin 发表于 2018-12-9 12:46
给你写一个适合做密码锁的显示电路。完全符合你想要的功能。

大哥,如果我想把按键显示结束后,再按一下,然后显示helly,同时显示,该怎么修改这个程序呢,请大哥务必帮我,事后必有重谢。
回复

使用道具 举报

ID:213173 发表于 2018-12-14 22:36 | 显示全部楼层
1628990936 发表于 2018-12-14 11:24
大哥,如果我想把按键显示结束后,再按一下,然后显示helly,同时显示,该怎么修改这个程序呢,请大哥务 ...

你是想用数码管显示字符“helly”吗?不太明白你的意思。
回复

使用道具 举报

ID:441506 发表于 2018-12-16 18:06 | 显示全部楼层
wulin 发表于 2018-12-14 22:36
你是想用数码管显示字符“helly”吗?不太明白你的意思。

唔,就是 这个 电路图, 只有一个按键,按一下 显示1,按第二下,显示1,2.......。按第八下,显示12345678,按第九下,八位数码管只显示helly,就可以了,整个过程只有一个按键这个八位的数码管。
回复

使用道具 举报

ID:213173 发表于 2018-12-16 20:24 | 显示全部楼层
1628990936 发表于 2018-12-16 18:06
唔,就是 这个 电路图, 只有一个按键,按一下 显示1,按第二下,显示1,2.......。按第八下,显示1234567 ...

无标题.jpg

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit dula=P3^0;  //HL-1
sbit wela=P3^1; //HL-1
sbit key =P3^2;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
                    0x6d,0x7d,0x07,0x7f,0x6f};
uchar code table1[]={0x00,0x76,0x79,0x38,0x38,0x6e,0x00,0x00};//HELLY
uchar data dis_buf[8];
uint num=0;

void keyscan()//按键程序        
{
        static uchar count;        //计数消抖变量                        
        static bit key_sign=0;        //按键自锁标志
        uchar a;
        if(key==0)                                //检测输入如果为0
        {
                if((++count>=100)&&(key_sign==0))
                {                        
                        key_sign=1;                //按键自锁标志置1,防止重复响应
                        num++;
                        dis_buf[0]=num;
                        for(a=8;a>0;a--)
                                dis_buf[a]=dis_buf[a-1];
                        if(num>9)
                                num=0;
                }
        }
        else
        {
                count=0;                                //计数变量清0
                key_sign=0;                                //按键自锁标志清0
        }
}
void display()//显示程序
{
        static uchar i=0,j;        //计数变量
        if(++j>100)//调整数码管刷新频率
        {
                j=0;
                P2=0x00;
                dula=1;
                dula=0;
                switch(i)
                {
                        case 0:
                        P2=0xfe;
                        wela=1;
                        wela=0;
                        if(num>7)
                        {
                                if(num==9)
                                P2=table1[0];
                                else
                                P2=table[dis_buf[8]];
                        }
                        else P2=0x00;
                        dula=1;
                        dula=0;
                        i++;
                        break;

                        case 1:                                
                        P2=0xfd;
                        wela=1;
                        wela=0;
                        if(num>6)
                        {
                                if(num==9)
                                P2=table1[1];
                                else
                                P2=table[dis_buf[7]];
                        }
                        else P2=0x00;
                        dula=1;
                        dula=0;
                        i++;
                        break;

                        case 2:                                
                        P2=0xfb;
                        wela=1;
                        wela=0;
                        if(num>5)
                        {
                                if(num==9)
                                P2=table1[2];
                                else
                                P2=table[dis_buf[6]];
                        }
                        else P2=0x00;
                        dula=1;
                        dula=0;
                        i++;
                        break;

                        case 3:                                       
                        P2=0xf7;
                        wela=1;
                        wela=0;
                        if(num>4)
                        {
                                if(num==9)
                                P2=table1[3];
                                else
                                P2=table[dis_buf[5]];
                        }
                        else P2=0x00;
                        dula=1;
                        dula=0;
                        i++;
                        break;

                        case 4:        
                        P2=0xef;
                        wela=1;
                        wela=0;
                        if(num>3)
                        {
                                if(num==9)
                                P2=table1[4];
                                else
                                P2=table[dis_buf[4]];
                        }
                        else P2=0x00;
                        dula=1;
                        dula=0;
                        i++;
                        break;

                        case 5:        
                        P2=0xdf;
                        wela=1;
                        wela=0;
                        if(num>2)
                        {
                                if(num==9)
                                P2=table1[5];
                                else
                                P2=table[dis_buf[3]];
                        }
                        else P2=0x00;
                        dula=1;
                        dula=0;
                        i++;
                        break;

                        case 6:        
                        P2=0xbf;
                        wela=1;
                        wela=0;
                        if(num>1)
                        {
                                if(num==9)
                                P2=table1[6];
                                else
                                P2=table[dis_buf[2]];
                        }
                        else P2=0x00;
                        dula=1;
                        dula=0;
                        i++;
                        break;

                        case 7:        
                        P2=0x7f;
                        wela=1;
                        wela=0;
                        if(num>0)
                        {
                                if(num==9)
                                P2=table1[7];
                                else
                                P2=table[dis_buf[1]];
                        }
                        else P2=0x00;
                        dula=1;
                        dula=0;
                        i=0;
                        break;
                }
        }
}
void main()
{
        while(1)
        {
                keyscan();
                display();
        }
}

回复

使用道具 举报

ID:441506 发表于 2018-12-16 22:22 | 显示全部楼层
wulin 发表于 2018-12-16 20:24
#include
#define uchar unsigned char
#define uint  unsigned int

非常完美,谢谢 大哥,想和你交个朋友,做我师傅吧,嘿嘿
回复

使用道具 举报

ID:516586 发表于 2019-8-5 16:38 | 显示全部楼层
jinsheng7533967 发表于 2018-12-7 16:04
按你的意思不用接74HC573,数码管可直接接P2与P3口,代码如下:
#include
#define uchar unsigned char

不需要加段锁存和位锁存么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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