找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1962|回复: 1
收起左侧

制作了一个数码管电子时钟,请大家帮我在改进一下吧,谢谢!

[复制链接]
ID:404479 发表于 2019-10-12 13:02 来自手机 | 显示全部楼层 |阅读模式
50黑币
首先,P0口控制的是8个数码管的段选(正极),138译码器控制的是数码管的位选(负极),然后我写的这个电子时钟只能看时间,不能改时间,我想用三颗按键来控制时间的修改,第一颗按键为选中按键,按第一下,小时的个位和十位停止,然后通过第二颗按键增加,第三颗按键减少,可以0-59数字的操作,修改完成后,继续按第一颗键保存刚才的修改数据并跳到分钟修改,然后在按一次第一颗按键跳到秒钟修改,在按一次第一颗按键自动退出修改,同理,修改分钟和秒钟也是,按第二颗增加,按第三颗减少,改完后,继续按第一颗直到退出!
我想请大家帮我大致从下面这个程序修改一下,增加三颗按键来实现可修改的功能,按键和管脚大家都可以随便定义,小弟c语言基础浅薄,能不要用指针就尽量不要用指针吧,谢谢大家!以下是程序和原理图:

#include<reg52.h>
#define uint unsigned  int
#define uchar unsigned char
uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};         //数码管位选数据
sbit LSA=P2^2;      //38译码器A0脚
sbit LSB=P2^3;       //38译码器A1脚
sbit LSC=P2^4;       //38译码器A2脚
uint miao=0;                //秒
uint fen=0;                        //分
uint shi=0;                    //时
static uint n=0;                        //计数
uint dizhi[6]={0,0,0,0,0,0};          //定义一个有6个地址的数组,分别存时,分,秒的个位和十位。void delay(uint z)                         //延时函数
{   
  uint x,y;         for(x=z;x>0;x--)
          for(y=50;y>0;y--);
}
void write_date(uint n)                                     //写数据函数,送入段选信号
{         
P0=duan[n];
}                                                                        
        
void display()      //显示函数
{         
        LSA=0;        LSB=0;        LSC=0;                                write_date(dizhi[0]);         
delay(1);   
   P0=0x00;                 
           LSA=1;        LSB=0;        LSC=0;                write_date(dizhi[1]);         
delay(1);         
P0=0x00;                 
LSA=1;        LSB=1;        LSC=0;                           write_date(dizhi[2]);         
delay(1);        
P0=0x00;                                 
LSA=0;        LSB=0;        LSC=1;                         write_date(dizhi[3]);        
  delay(1);
         P0=0x00;                 
          LSA=0;        LSB=1;        LSC=1;                 write_date(dizhi[4]);         
        delay(1);
         P0=0x00;                  
          LSA=1;        LSB=1;        LSC=1;                    write_date(dizhi[5]);         
delay(1);         
P0=0x00;                           
}
void time_init()                                                   //定时器初始化函数
{   
TMOD=0x02;                                                          //选择方式2        TH0=156;                                                          //重装初值为156        TL0=156;                                                          //运行值为156        EA=1;                                                                  //开总中断
        ET0=1;                                                               
TR0=1;                                                                  //开定时器0
}
void main()
{   
time_init();   
while(1)
  {   
   display();   
}
    }  
void timer() interrupt 1                                          //定时器0中断
{   
n++;        
if(n==10000)                                                                 //当n=10000时,表示1s到了
         {                  
    n=0;             miao++;                 
if(miao==60)               
{                     miao=0;                  
   fen++;               
         if(fen==60)               
         {                        
     fen=0;                                
shi++;               
                 if(shi==24)                                
{                        
            shi=0;                                 
}                        
}               
}               
dizhi[0]=miao%10;               
dizhi[1]=miao/10;                 
dizhi[2]=fen%10;        
         dizhi[3]=fen/10;               
dizhi[4]=shi%10;        
         dizhi[5]=shi/10;
                 }
}

IMG_20191012_125050.jpg
Screenshot_2019-10-12-12-52-50-57.png
Screenshot_2019-10-12-12-55-00-78.png
回复

使用道具 举报

ID:213173 发表于 2019-10-13 14:41 | 显示全部楼层
给你一个例程参考
数码管时钟长短按调整点闪烁+闹钟38译码器+仿真.zip (78.64 KB, 下载次数: 24)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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