登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看3891|回2|收藏
楼主 ID:140489 只看他
2016-10-26 16:58
这个只是读取出时间,其它功能没有写出来,用了四位共阴数码管显示。
小数点闪烁  第3位数码管倒置显示小数点与第二位数码管一起显示“:”,1秒闪烁一次

仿真用了4个一位的数码管和一个四位的数码管,如果用一个四位的数码管,可以修改程序把第三位的

小数点去掉
0.png

附件里面有源代码与仿真文件:
时钟.rar (114.65 KB)
(下载次数: 89, 2016-10-26 16:57 上传)

下载积分: 黑币 -5



代码:



  1. //这个只是读取出时间,其它功能没有写出来,用了四位共阴数码管显示。
  2. // 小数点闪烁  第3位数码管倒置显示小数点
  3. //  与第二位数码管一起显示“:”,1秒闪烁一次

  4. //仿真用了4个一位的数码管和一个四位的数码管
  5. /**********************************
  6. *                DS1302简单时间显示                  *
  7. *                        数码管显示                          *
  8. ***********************************/
  9. #include <reg52.h>
  10. #include<intrins.h>
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define W P2                                                                          //位选
  14. #define D P0                                                                        //段选
  15. sbit dio=P1^1;                                                                          //数据口
  16. sbit sclk=P1^0;                                                                         //控制数据时钟
  17. sbit RST=P1^2;                                                                          //使能端、复位端
  18. /************按键引脚定义***********/
  19. sbit s1=P3^0;                                                                        //按键 加
  20. sbit s2=P3^1;                                                                        //按键 减
  21. sbit s3=P3^2;                                                                        //按键 选择
  22. char knum=0,snum,fnum;

  23. /***********写时分秒地址************/
  24. #define write_shi  0x84
  25. #define write_fen  0x82
  26. #define write_miao 0x80
  27. /***********读时分秒地址************/
  28. #define read_shi  0x85
  29. #define read_fen  0x83
  30. #define read_miao 0x81

  31. char shi,fen,miao;                                                                 //读出数据存储变量
  32. //uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};                //不带小数点
  33. //uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};                //带小数点


  34.                            // 0     1         2          3           4    5    6    7   8     9    10   11        
  35. uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00};                //共阴不带小数点  

  36. uchar code dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//        共阴带小数点

  37. void delay(uint z)                                                          //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
  38. {                                                                                                //delay(500);大约延时500ms.
  39.         uint x,y;
  40.         for(x=z;x>0;x--)
  41.                 for(y=110;y>0;y--);        
  42. }

  43. void write_1302(uchar add,dat)                 //写函数  qx
  44. {
  45.         uchar i,temp;
  46.         temp=add;
  47.         RST=0;
  48.         _nop_();
  49.         sclk=0;
  50.         _nop_();
  51.         RST=1;
  52.         _nop_();
  53.         for(i=0;i<8;i++)
  54.         {
  55.                 sclk=0;
  56.                 _nop_();
  57.                 if((temp&0x01)==0x01)
  58.                         dio=1;
  59.                         else
  60.                         dio=0;
  61.                 temp>>=1;
  62.                 sclk=1;
  63.                 _nop_();
  64.         }
  65.         temp=dat;
  66.         for(i=0;i<8;i++)
  67.         {
  68.                 sclk=0;
  69.                 _nop_();
  70.                 if((temp&0x01)==0x01)
  71.                         dio=1;
  72.                         else
  73.                         dio=0;
  74.                 temp>>=1;
  75.                 sclk=1;
  76.                 _nop_();
  77.         }
  78.         RST=0;
  79.         sclk=0;
  80. }
  81. uchar read_1302(uchar add)                                   //读函数                qx
  82. {
  83.         uchar dat,dat1,i,temp;
  84.         temp=add;
  85.         RST=0;
  86.         _nop_();
  87.         sclk=0;
  88.         _nop_();
  89.         RST=1;
  90.         for(i=0;i<8;i++)
  91.         {
  92.                 sclk=0;
  93.                 _nop_();
  94.                 if((temp&0x01)==0x01)
  95.                         dio=1;
  96.                         else
  97.                         dio=0;
  98.                 temp>>=1;
  99.                 sclk=1;
  100.                 _nop_();
  101.         }
  102.         for(i=0;i<8;i++)
  103.         {
  104.                 sclk=0;
  105.                 _nop_();
  106.                 if(dio)
  107.                     dat|=0x80;
  108.                 if(i<7)
  109.                         dat>>=1;
  110.                 sclk=1;
  111.         }
  112.         dat1=dat/16;
  113.         dat=dat%16;
  114.         dat=dat1*10+dat;  
  115.         RST=0;
  116.         sclk=0;
  117.         return dat;
  118. }                                 




  119. void init_1302()                                                        //初始化函数 设置时间
  120. {
  121.         write_1302(0x8e,0x00);                                        //保护取消,可以进行读写操作
  122.         write_1302(write_miao,0x56);        
  123.         write_1302(write_fen,0x49);
  124.         write_1302(write_shi,0x14);
  125.         write_1302(0x8e,0x80);                                        //保护启动,不能进行读写操作
  126. }

  127. void display(uchar shi,uchar fen,uchar miao)                          //显示函数
  128. {
  129.         if(knum==0)
  130.         {
  131.                 snum=30;
  132.                 fnum=30;
  133.         }
  134.         if(knum==1)
  135.         {
  136.                 fnum++;
  137.                 snum=30;
  138.         }
  139.         if(knum==2)
  140.         {
  141.                 snum++;
  142.                 fnum=30;
  143.         }
  144.         
  145.         if(snum>=30)
  146.         {
  147.                 P2=0x01;                                                                        //位选
  148.                 P0=d[shi/10];                                                        //段选
  149.                 delay(5);
  150.                 P0=0X00;
  151.                                                                                 //位选
  152.                                                                         //消隐
  153.                 if(miao%2==0)                                                        //小数点闪烁
  154.                 {
  155.                         P2=0x02;
  156.                         P0=dd[shi%10];
  157.                         delay(5);
  158.                         P0=0X00;
  159.                                                                                 //消隐
  160.                 }
  161.                 else
  162.                 {
  163.                     P2=0x02;
  164.                         P0=d[shi%10];
  165.                         delay(5);
  166.                         P0=0X00;
  167.                                                                                                 //消?
  168.                 }
  169.             if(snum==60)
  170.                         snum=0;
  171.         }               
  172.         if(fnum>=30)
  173.         {
  174.                
  175.                 if(miao%2==0)                                                        //小数点闪烁  第3位数码管倒置显示小数点
  176.                                                                                                  //与第二位数码管一起显示“:”,1秒闪烁一次
  177.                 {
  178.                 P2=0x04;
  179.                 P0=dd[fen/10];
  180.                 delay(5);
  181.                 P0=0X00;
  182.                 }                                                                //消隐


  183.            else
  184.            {
  185.                    P2=0x04;
  186.                 P0=d[fen/10];
  187.                 delay(5);
  188.                 P0=0X00;
  189.            
  190.            }
  191.                 P2=0x08;
  192.                 P0=d[fen%10];
  193.                 delay(5);
  194.                 P0=0X00;
  195.                                                                                         //消隐
  196.                 if(fnum==60)
  197.                         fnum=0;
  198.         }
  199. }
  200. void read_sf()
  201. {
  202.         shi=read_1302(read_shi);
  203.         fen=read_1302(read_fen);
  204.         miao=read_1302(read_miao);
  205.         display(shi,fen,miao);
  206. }
  207. void keyscan()                                                                   //按键扫描函数
  208. {                                                                                   
  209.         if(s3==0)                                                                   //选择按键按下
  210.         {
  211.                 delay(10);
  212.                 if(s3==0)
  213.                 {
  214.                         while(!s3)
  215.                                 display(shi,fen,miao);        //加上这句,按键按下就不会闪
  216.                         knum++;
  217.                         if(knum==1)                                                  //分闪烁
  218.                         {
  219.                                  write_1302(0x8e,0x00);                //保护取消
  220.                                  write_1302(write_miao,0x80);
  221.                         }
  222.                         if(knum==3)                                                   //时钟启动
  223.                         {
  224.                                 knum=0;
  225.                                 write_1302(write_miao,0x00);
  226.                                 write_1302(0x8e,0x80);                //保护启动
  227.                         }
  228.                 }
  229.         }
  230.         if(knum==1)                                                                //分钟调节
  231.         {
  232.                 if(s1==0)                                                        //加
  233.                 {
  234.                         delay(10);
  235.                         if(s1==0)
  236.                         {        
  237.                                 while(!s1)
  238.                                         display(shi,fen,miao);        //加上这句,按键按下就不会闪
  239.                                 fen++;
  240.                                 fen=fen/10*16+fen%10;                //转为16进制
  241.                                 if(fen==0x60)
  242.                                         fen=0x00;
  243.                                 write_1302(write_fen,fen);        //写入1302
  244.                                 read_sf();                                        //读出时间,然后显示
  245.                         }
  246.                 }
  247.                 if(s2==0)
  248.                 {
  249.                         delay(10);
  250.                         if(s2==0)
  251.                         {        
  252.                                 while(!s2)
  253.                                         display(shi,fen,miao);        //加上这句,按键按下就不会闪
  254.                                 fen--;
  255.                                 fen=fen/10*16+fen%10;                //转为16进制
  256.                                 if(fen==-1)
  257.                                         fen=0x59;
  258.                                 write_1302(write_fen,fen);
  259.                                 read_sf();
  260.                         }
  261.                 }
  262.         }
  263.         if(knum==2)
  264.         {
  265.                 if(s1==0)
  266.                 {
  267.                         delay(10);
  268.                         if(s1==0)
  269.                         {        
  270.                                 while(!s1)
  271.                                         display(shi,fen,miao);        //加上这句,按键按下就不会闪
  272.                                 shi++;
  273.                                 shi=shi/10*16+shi%10;                //转为16进制
  274.                                 if(shi==0x24)
  275.                                         shi=0x00;
  276.                                 write_1302(write_shi,shi);
  277.                                 read_sf();
  278.                         }
  279.                 }
  280.                 if(s2==0)
  281.                 {
  282.                         delay(10);
  283.                         if(s2==0)
  284.                         {        
  285.                                 while(!s2)
  286.                                           display(shi,fen,miao);        //加上这句,按键按下就不会闪
  287.                                 shi--;
  288.                                 shi=shi/10*16+shi%10;                //转为16进制
  289.                                 if(shi==-1)
  290.                                         shi=0x23;
  291.                                 write_1302(write_shi,shi);
  292.                                 read_sf();
  293.                         }
  294.                 }
  295.         }
  296. }
  297. void main()
  298. {
  299.         init_1302();
  300.         while(1)
  301.         {
  302.                 read_sf();
  303.                 keyscan();

  304.                 display(shi,fen,miao);
  305.         }
  306. }


沙发 ID:140489
2016-10-26 16:59
怎么把那个售价5黑币去掉
板凳 ID:60515 只看他
2016-12-28 16:53
为什么在实物图上不能正常显示??

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版