找回密码
 立即注册

QQ登录

只需一步,快速开始

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

数码管显示时钟程序调时间的时候怎么让调节的那一位闪烁啊,用的郭天祥的开发板主,

[复制链接]
ID:122184 发表于 2016-5-28 22:38 来自手机 | 显示全部楼层 |阅读模式
如题,只是单纯的显示数码管让他某一位闪烁显示写出来了,就是不知道怎么放到键盘检测程序里去,放进去就不对了。弄了好久都没弄好,最好有个例程参考下怎么写
回复

使用道具 举报

ID:123772 发表于 2016-5-29 01:41 | 显示全部楼层
#include <reg52.h>

sbit wei_pin = P2^7;
sbit duan_pin = P2^6;

int ms_3 = 0;
int ms_500 = 0;
/*************************************
             段选对应数组
*************************************/
unsigned char code table[]=
{
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71,0x40,0x00
};

/************************************
            位选对应数组
************************************/
unsigned char code wei_table[]=
{
    0xff,
        ~0x01,~0x02,~0x04,~0x08,
        ~0x10,~0x20,~0x40,~0x80
};  

/*
*数码管显示函数
*/
void display()
{
        static unsigned char wei = 1;
        unsigned char tmp;       
       
        if(ms_500>500||wei!=1&&wei!=2)
        {               
                P0 = wei_table[wei];
                wei_pin = 1;
                wei_pin = 0;
        }
        else
        {
                        P0 = wei_table[0];
                        wei_pin = 1;
                        wei_pin = 0;
        }
        if(ms_500>1000)
                        ms_500=0;
        //消隐
        P0 = 0x00;
        duan_pin = 1;
        duan_pin = 0;
       
        //得到要显示的数据         
        switch(wei)
        {
                //显示时
                case  1: tmp = 0;break;
                case  2: tmp = 0;break;
                   //显示分
               
                case  3: tmp = 16;break;
               
                case  4: tmp = 0;break;
                 case  5: tmp = 0;break;
                //显示秒
               
                case  6: tmp = 16;break;
               
                case  7: tmp = 0;break;
                 case  8: tmp = 0;break;
         }
         
         P0 = table[tmp];
         duan_pin = 1;
         duan_pin = 0;
         
         wei++;
         if(wei>8) wei = 1;
         
}

/*
* main函数
*/
void main()
{
        //开启定时器0,1ms进入一次中断
        TMOD = 0x01;
        TH0 = (65536-1000)/256;
        TL0 = (65536-1000)%256;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
   
        while(1)
        {
                if(ms_3>=3)
                {
                        display();
                        ms_3 = 0;        
                }                 
        }
}

/*
* 定时器0中断处理函数
*/
void timer0() interrupt 1
{
        TH0 = (65536-1000)/256;
        TL0 = (65536-1000)%256;       
        ms_3++;
        ms_500++;
}
回复

使用道具 举报

ID:122184 发表于 2016-5-29 12:42 来自手机 | 显示全部楼层
King_Dan 发表于 2016-5-29 01:41
#include

sbit wei_pin = P2^7;

有两个不明白的地方,位选数组里为什么要取反啊,还有 if(ms_500>500||wei!=1&&wei!=2)这句是什么意思呢,非常感谢您的帮助
回复

使用道具 举报

ID:123772 发表于 2016-5-29 22:10 | 显示全部楼层
沫忆失忆 发表于 2016-5-29 12:42
有两个不明白的地方,位选数组里为什么要取反啊,还有 if(ms_500>500||wei!=1&&wei!=2)这句是什么意思呢 ...

取反是为了更好的看是哪一位数码管亮。因为这个程序我只是让第一第二个数码管闪。ms_500>500的意思是大于500s时  第一第二个数码亮   小于时不亮,这样就出现一闪一闪的效果。
回复

使用道具 举报

ID:123772 发表于 2016-5-29 22:12 | 显示全部楼层
沫忆失忆 发表于 2016-5-29 12:42
有两个不明白的地方,位选数组里为什么要取反啊,还有 if(ms_500>500||wei!=1&&wei!=2)这句是什么意思呢 ...

也就是  大于500ms  所有数码管正常显示   小于500ms  到了第一第二位数码管 则不光 其他数码管正常显示。
回复

使用道具 举报

ID:122184 发表于 2016-5-30 00:19 来自手机 | 显示全部楼层
King_Dan 发表于 2016-5-29 22:10
取反是为了更好的看是哪一位数码管亮。因为这个程序我只是让第一第二个数码管闪。ms_500>500的意思是大于 ...

多谢你的帮助,看着这个例子我的时钟已经调好了,也达到了我想要的结果,真的非常感谢你
回复

使用道具 举报

ID:123772 发表于 2016-5-30 14:47 | 显示全部楼层
沫忆失忆 发表于 2016-5-30 00:19
多谢你的帮助,看着这个例子我的时钟已经调好了,也达到了我想要的结果,真的非常感谢你

不用  我也只是初学者 刚刚做了这个而已
回复

使用道具 举报

ID:123203 发表于 2016-5-30 22:19 | 显示全部楼层
给个我以前写的程序,你参考参考,我这个使用1602液晶写的,显示方式需要改改  #include "1602yejing.h"  sbit key1=P3^2;          //选择调整位置按钮 sbit key2=P3^3;          //加一按钮 sbit key3=P3^4;          //减一按钮 sbit key4=P3^5;   //定时按钮  char shi,fen,miao,T_shi,T_fen,T_miao; uchar count,keynum,flag;  uchar code table1[]="   2011-12-26  1"; uchar code table2[]="    10:30:30"; uchar code table3[]="input the timing"; uchar code table4[]="    00:00:00";  void write_sfm(uchar add,uchar date) {         uchar shi,ge;         shi=date/10;         ge=date%10;         write_com(0xc0+add);         write_date(shi+'0');         write_date(ge+'0'); }  void init() {         uchar num;         shi=10;         fen=30;         miao=30;         P1=0xfe;         write_com(0x38);//显示模式         write_com(0x0c);//不显示光标,光标不闪烁         write_com(0x06);//地址指针加一,光标加一         write_com(0x01);//清屏         write_com(0x80);         for(num=0;num<16;num++)         {                 write_date(table1[num]);                 delay(5);         }         write_com(0xc0);         for(num=0;num<12;num++)         {                 write_date(table2[num]);                 delay(5);         }         TMOD=0x01;         TH0=(65536-50000)/256;         TL0=(65536-50000)%256;         EA=1;         ET0=1;         TR0=1; }  void keyscan() {         uchar i;         if(key4==0)         {                 delay(5);                 if(key4==0)                 {                         while(!key4);                         flag=1;                         write_com(0x80);                         for(i=0;i<16;i++)                         {                                 write_date(table3[i]);                                 delay(5);                         }                         write_com(0xc0);                         for(i=0;i<12;i++)                         {                                 write_date(table4[i]);                                 delay(5);                         }                 }                 }          if(key1==0)         {                 delay(5);                 if(key1==0)                 {                         while(!key1);                         keynum++;                         if(keynum==1)                         {                                 if(flag==0) TR0=0;                                 write_com(0xc0+11);                                 write_com(0x0f);                         }                         if(keynum==2)                         {                                 write_com(0xc0+8);                                 write_com(0x0f);                         }                         if(keynum==3)                         {                                 write_com(0xc0+5);                                 write_com(0x0f);                         }                         if(keynum==4)                         {                                 write_com(0x0c);                                 TR0=1;                                 if(flag==0)                                 {                                                 keynum=0;                                 }                                 if(flag==1)                                 {                                         flag=0;                                         write_com(0x80);                                         for(i=0;i<16;i++)                                         {                                                 write_date(table1[i]);                                                 delay(5);                                         }                                         write_sfm(4,shi);                                         write_sfm(7,fen);                                         write_sfm(10,miao);                                         }                         }                 }         }         if(keynum!=0)         {                 if(key2==0)                 {                         delay(5);                         if(key2==0)                         {                         //        while(!key2);                                 if(keynum==1)                                 {                                         if(flag==0)                                         {                                                 miao++;                                                 if(miao==60) miao=0;                                                 write_sfm(10,miao);                                                 write_com(0xc0+10);                                                 delay(300);                                         }                                         if(flag==1)                                         {                                                 T_miao++;                                                 if(T_miao==60) T_miao=0;                                                 write_sfm(10,T_miao);                                                 write_com(0xc0+10);                                                 delay(300);                                         }                                 }                                 if(keynum==2)                                 {                                         if(flag==0)                                         {                                                 fen++;                                                 if(fen==60) fen=0;                                                 write_sfm(7,fen);                                                 write_com(0xc0+7);                                                 delay(300);                                         }                                         if(flag==1)                                         {                                                 T_fen++;                                                 if(T_fen==60) T_fen=0;                                                 write_sfm(7,T_fen);                                                 write_com(0xc0+7);                                                 delay(300);                                                 }                                 }                                 if(keynum==3)                                 {                                         if(flag==0)                                         {                                                 shi++;                                                 if(shi==24) shi=0;                                                 write_sfm(4,shi);                                                 write_com(0xc0+4);                                                 delay(300);                                         }                                         if(flag==1)                                         {                                                 T_shi++;                                                 if(T_shi==24) T_shi=0;                                                 write_sfm(4,T_shi);                                                 write_com(0xc0+4);                                                 delay(300);                                                 }                                 }                         }                         }                 if(key3==0)                 {                         delay(5);                         if(key3==0)                         {                         //        while(!key3);                                 if(keynum==1)                                 {                                         if(flag==0)                                         {                                                 miao--;                                                 if(miao==-1) miao=59;                                                 write_sfm(10,miao);                                                 write_com(0xc0+10);                                                 delay(300);                                         }                                         if(flag==1)                                         {                                                 T_miao--;                                                 if(T_miao==-1) T_miao=59;                                                 write_sfm(10,T_miao);                                                 write_com(0xc0+10);                                                 delay(300);                                         }                                 }                                 if(keynum==2)                                 {                                         if(flag==0)                                         {                                                 fen--;                                                 if(fen==-1) fen=59;                                                 write_sfm(7,fen);                                                 write_com(0xc0+7);                                                 delay(300);                                         }                                         if(flag==1)                                         {                                                 T_fen--;                                                 if(T_fen==-1) T_fen=59;                                                 write_sfm(7,T_fen);                                                 write_com(0xc0+7);                                                 delay(300);                                         }                                 }                                 if(keynum==3)                                 {                                         if(flag==0)                                         {                                                 shi--;                                                 if(shi==-1) shi=23;                                                 write_sfm(4,shi);                                                 write_com(0xc0+4);                                                 delay(300);                                         }                                         if(flag==1)                                         {                                                 T_shi--;                                                 if(T_shi==-1) T_shi=23;                                                 write_sfm(4,T_shi);                                                 write_com(0xc0+4);                                                 delay(300);                                         }                                 }                         }                 }         } }    void main() {         init();         while(1)         {                 keyscan();                 if(miao==T_miao&&fen==T_fen&&shi==T_shi)                 {                         P1=0xff;                 }         } } void timer0() interrupt 1 {         TH0=(65536-50000)/256;         TL0=(65536-50000)%256;         count++;         if(count==16)         {                 count=0;                 P1=0xfe;                 miao++;                 if(miao==60)                 {                         miao=0;                         fen++;                         if(fen==60)                         {                                 fen=0;                                 shi++;                                 if(shi==24)                                 {                                         shi=0;                                 }                                 if(flag==0) write_sfm(4,shi);                         }                         if(flag==0) write_sfm(7,fen);                 }                 if(flag==0) write_sfm(10,miao);                         }         }  头文件 #ifndef _1602yejing_H_ #define _1602yejing_H_   #include<reg52.h> #define uchar unsigned char  #define uint unsigned int  sbit E=P2^7;         sbit RW=P2^6;                         sbit RS=P2^5;  void delay(uint z) {     uint x,y;         for(x=z;x>0;x--)          for(y=148;y>0;y--); }  void write_com(uchar com)//写命令函数 {         P0=com;         RS=0;         RW=0;         E=0;         delay(5);         E=1;         delay(5); } void write_date(uchar date)//写数据函数 {         P0=date;         RS=1;         RW=0;         E=0;         delay(5);         E=1;         delay(5); }  #endif
回复

使用道具 举报

ID:111634 发表于 2016-5-30 22:45 | 显示全部楼层
本坛“51单片机”专栏中有2种1302时钟和“模拟电子钟”有校时位闪烁功能,你可参阅。
回复

使用道具 举报

ID:111634 发表于 2016-5-30 22:46 | 显示全部楼层
2016-5-4 本人上传的“具有校正功能的时钟1302”(1602显示)
回复

使用道具 举报

ID:111634 发表于 2016-5-30 22:47 | 显示全部楼层
2016-5-6 本人上传的“具有校正功能的时钟1302(LED数码管显示)”
回复

使用道具 举报

ID:111634 发表于 2016-5-30 22:47 | 显示全部楼层
本帖最后由 zl2168 于 2016-5-30 22:49 编辑

“模拟电子钟(由80C51定时器产生秒时基)”
图7-13.jpg

K0K1K2具有时钟校正功能,其控制过程为:按下K0(带锁),进入时钟修正;首先,时数据(包括时十位、时个位)快速闪烁(亮暗各131ms);按一次K1(不带锁),被修正数据(快速闪烁)按时、分、秒(同时包括十位、个位)次序右移(循环往复);按一次K2(不带锁),被修正数据整体加1(最大值不超过时钟规定值,超过复0);时钟修正期间,计时继续运行;释放K0,退出时钟修正。
回复

使用道具 举报

ID:111634 发表于 2016-5-30 22:50 | 显示全部楼层
本帖最后由 zl2168 于 2016-5-30 22:52 编辑

“模拟电子钟(由80C51定时器产生秒时基)”程序设计

disp6.jpg

key.jpg

t0t1.jpg
回复

使用道具 举报

ID:111634 发表于 2016-5-30 22:52 | 显示全部楼层
本帖最后由 zl2168 于 2016-5-31 17:21 编辑

模拟电子钟(由80C51定时器产生秒时基)Proteus仿真

模拟电子钟.jpg


实例94 模拟电子钟(由80C51定时器产生秒时基).rar (43.05 KB, 下载次数: 39)
回复

使用道具 举报

ID:111634 发表于 2016-5-30 22:55 | 显示全部楼层
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版,
回复

使用道具 举报

ID:111634 发表于 2016-5-30 22:55 | 显示全部楼层
欢迎咨询,zzlls@126.com
回复

使用道具 举报

ID:124177 发表于 2016-5-31 10:16 | 显示全部楼层
程序可以的啊
回复

使用道具 举报

ID:111634 发表于 2016-5-31 17:20 | 显示全部楼层
先仿真看看效果,包你满意。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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