找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2893|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机的16*64点阵仿真加源程序 生日字模

[复制链接]
跳转到指定楼层
楼主
16*64点阵仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


16*64点阵单片机源程序如下:
  1. #include<reg51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define light 3                        //定义亮度
  5. uchar code hanzi[];                                            //汉字字模
  6. uchar code shengri[];                                        //生日字模
  7. uchar code timer[13][16];                                //0~9数字
  8. uchar code sw[];                            //138驱动数据

  9. void Show_word();                      //待机显示按三秒间隔分别显示年、月日、星期、时分秒。
  10. void Show_pass();                                   //不显示一个字
  11. void Send_data(unsigned char *d);      /*串口发送一行*/



  12. /******************************************/
  13. sbit resget=P0^2;                        //时钟复位
  14. sbit key_moda=P0^3;                        //模式转换
  15. sbit key_up=P0^4;                        //时钟加
  16. sbit key_Down=P0^5;                        //时钟减

  17. sbit T_CLK=P2^1;                    //DS1302引脚连接
  18. sbit T_IO =P2^2;
  19. sbit T_RST=P2^3;

  20. sbit ACC0=ACC^0;           //1bit数据存储位
  21. sbit ACC7=ACC^7;

  22. sbit STR=P1^7;              //锁存         
  23. sbit CLK=P3^1;                    //时钟         
  24. sbit Data= P3^0;            //数据
  25. sbit Data1= P1^6;         
  26. sbit E=P1^4;

  27. sbit UU=P1^7;


  28. sbit DQ= P2 ^ 0;//ds1820data(单总线)         


  29. uchar starts_time[7]={0x00,0x10,0x22,0x21,0x10,0x03,0x09};         //初始化后设置
  30. uchar Move,Speed,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week;  //时间温度变量
  31. uchar a,b,f,h,msec,id,x;           //标志计数器 a为自动转换显示时间,b为手动与自动标志
  32. uint zimuo,tvalue;                                   //字模计数器
  33. uchar BUFF[10];                                   //缓存

  34. void   RTInputByte(uchar);         //* 输入 1Byte */
  35. uchar  RTOutputByte(void);         //* 输出 1Byte */
  36. void   W1302(uchar, uchar);        // 向DS1302写入一个字节
  37. uchar  R1302(uchar);               // 从DS1302读出一个字节
  38. void   Set1302(uchar *);           // 写DS1302时间
  39. void   du1302();                   // 读时间  
  40. void   DelayMs(void);              // 延时
  41. void   Set(uchar,uchar );          // 变量调整
  42. void   in_data();                                   // 调整移动数据
  43. void   rxd_data();                                   // 串口发送移动数据
  44. read_temp();                   //*读取温度值并转换*/


  45. /*主函数*/
  46. void main()
  47. {  
  48.    Data1=1;
  49.    Move=0;
  50.    zimuo=0;
  51.    TMOD=0x01;        //16位定时
  52.    TH0=0xC5;    //15ms晶振为12M
  53.    TL0=0x68;
  54.    EA=1;
  55.    TR0=1;
  56.    ET0=1;
  57.    SCON=0;             //初始化串口为工作方式0(同步通信方式,TxD输出同步脉冲)

  58.    while(zimuo<512)
  59.     {
  60.          while(Move<16)                                             //数据移位。
  61.        {
  62.              for(Speed=0;Speed<4;Speed++)       //移动速度
  63.               {        
  64.                     for(line=0;line<16;line++)
  65.                           {
  66.                          in_data();                                     //调整移动数据
  67.                      rxd_data();
  68.                       P1=sw[line];      
  69.                                                                        
  70.                 STR=1;//锁存
  71.                 STR=0;
  72.                 UU=1;
  73.             DelayMs();         //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。*/
  74.                                     

  75.                         
  76.                   }
  77.                  }
  78.        Move++;                                                 //移动一步
  79.              }
  80.      Move=0;
  81.          zimuo=zimuo+32;
  82.     }        
  83.    zimuo=0;
  84.    while(1)             //重复(无限)循环显示
  85.     {
  86.           if(resget==0)
  87.              {  DelayMs();
  88.             if(resget==0)
  89.                     Set1302(starts_time);    //初始化
  90.                 W1302(0x8e,0x00);            //控制命令,WP=0,写操作               
  91.                 W1302(0x90,0xa5);            //打开充电二级管  一个二级管串联一个2K电阻
  92.             }  
  93.           du1302();          //读取 秒 分 时 日 月 星期 年
  94.           read_temp();//读取温度
  95.           zimuo=0;                                             
  96.            if (key_moda==0)                         //设置和选择项目键
  97.          {  DelayMs();
  98.                 if(key_moda==0)
  99.                    {
  100.                       if(id++==10) {id=0;}
  101.                                   h=0;msec=0;            //清闪烁标志
  102.                           while(key_moda==0){ Show_word();}   
  103.                }                                                   
  104.              }

  105.          
  106.       if(id!=0)
  107.           {
  108.       if (key_up==0)                  //增加
  109.          {
  110.             DelayMs();
  111.             if(key_up==0)
  112.                    {
  113.                              while(key_up==0)
  114.                                                 {Show_word();}         //调用显示
  115.                           h=0;msec=0;            //清闪烁标志
  116.                                  
  117.                           Set(id,0);                 //调用时间调调整
  118.                        }  
  119.          }
  120.    
  121.       if (key_Down==0)  //减少
  122.          {
  123.             DelayMs();
  124.             if(key_Down==0)
  125.                     {
  126.                       while(key_Down==0)
  127.                               {Show_word();}   //调用显示
  128.                           h=0;msec=0;          //清闪烁标志
  129.                           Set(id,1);                   //调用时间调调整
  130.                         }         
  131.          }
  132.           }
  133.           else
  134.            {
  135.             if (key_up==0)                  //增加
  136.           {
  137.             DelayMs();
  138.             if(key_up==0)
  139.                    {
  140.                              while(key_up==0)
  141.                                                 {Show_word();}         //调用显示
  142.                           h=0;msec=0;            //清闪烁标志  
  143.                       if(b!=0)                                 //手动调整显示的内容
  144.                            {
  145.                                      if(f++==5)                         //f为显示转换标志
  146.                                      f=0;
  147.                            }
  148.               }
  149.                     }
  150.            }

  151.    Show_word();          //待机显示按三秒间隔分别显示年、月日、星期、时分秒。

  152.    }           
  153. }
  154. /************************************************/
  155. void Show_word()                                 //串行输出显示
  156. {  uchar h;                  
  157.    for(h=0;h<16;h++)
  158.     {
  159.                  if((id==0)&(f==0)|(id==1))                        //f为三秒转换显示
  160.                            {
  161.                          Send_data(&timer[0][0]);            //不显示
  162.                                  if((Flicker==1)&(id==1))       //闪烁标志为1时不亮,为零时亮
  163.                                     { Show_pass();                            //不显示一个字
  164.                                           Show_pass();
  165.                                         }
  166.                                  else
  167.                                    {
  168.                                         Send_data(&timer[2][h]);        //20年   
  169.                               Send_data(&timer[0][h]);
  170.                           Send_data(&timer[Year/16][h]);  //年值   
  171.                               Send_data(&timer[Year%16][h]);
  172.                                    }
  173.                                  Send_data(&hanzi[h*2+641]);          //年字符  
  174.                          Send_data(&hanzi[h*2+640]);
  175.                                  Send_data(&timer[0]);                      //不显示
  176.                            }

  177.                      if((id==0)&(f==1)|(id==2)|(id==3))                              
  178.                           {
  179.                              if((Flicker==1)&(id==2))                //闪烁标志为1时不亮,为零时亮
  180.                                     { Show_pass();                            //不显示一个字
  181.                                           
  182.                                         }
  183.                                  else
  184.                                     {
  185.                                           if(Month/16<1)
  186.                                                    Send_data(&timer[0]);                     //月十位为零时不显示
  187.                                           else
  188.                                         Send_data(&timer[Month/16][h]);      //月值   
  189.                               Send_data(&timer[Month%16][h]);
  190.                                         }
  191.                                  Send_data(&hanzi[h*2+673]);                     //月字符
  192.                          Send_data(&hanzi[h*2+672]);        
  193.                                  if((Flicker==1)&(id==3))                             //闪烁标志为1时不亮,为零时亮
  194.                                     { Show_pass();                                         //不显示一个字
  195.                                           
  196.                                         }
  197.                                  else
  198.                                     {                                      
  199.                                         Send_data(&timer[Day/16][h]);          //日值   
  200.                               Send_data(&timer[Day%16][h]);
  201.                                         }
  202.                      Send_data(&hanzi[h*2+961]);                 //日字符  
  203.                          Send_data(&hanzi[h*2+960]);
  204.                           }

  205.                      if((id==0)&(f==2)|(id==4))                                     //f为三秒转换显示
  206.                           {
  207.                              Send_data(&timer[0]);                             //不显示
  208.                                  Send_data(&hanzi[h*2+705]);                     //星字符
  209.                          Send_data(&hanzi[h*2+704]);
  210.                                  Send_data(&hanzi[h*2+737]);                     //期字符
  211.                          Send_data(&hanzi[h*2+736]);
  212.                                  if((Flicker==1)&(id==4))                             //闪烁标志为1时不亮,为零时亮
  213.                                     { Show_pass();                                         //不显示一个字
  214.                                         }
  215.                                  else
  216.                                     {                                             
  217.                                        Send_data(&hanzi[Week%16*32+h*2+737]);       //星期值
  218.                                      Send_data(&hanzi[Week%16*32+h*2+736]);
  219.                                         }     
  220.                          Send_data(&timer[0][0]);                         //不显示
  221.                           }

  222.                         if((id==0)&(f==3)|(id>4))                                     //f为三秒转换显示
  223.                           {
  224.                              if((Flicker==1)&(id==5))                             //闪烁标志为1时不亮,为零时亮
  225.                                     {
  226.                                           Show_pass();                                         //不显示一个字
  227.                                         }
  228.                                  else
  229.                                     {
  230.                                           if(Hour/16<1)
  231.                                             Send_data(&timer[0][0]);                   //时十位小于1时不显示  
  232.                                   else
  233.                                             Send_data(&timer[Hour/16][h]);         //时值
  234.                               Send_data(&timer[Hour%16][h]);
  235.                                         }
  236.                                  Send_data(&timer[10][h]);                           //两个点
  237.                                  
  238.                                  if((Flicker==1)&(id==6))                               //闪烁标志为1时不亮,为零时亮
  239.                                     {
  240.                                           Show_pass();                                           //不显示一个字
  241.                                         }
  242.                                  else
  243.                                     {
  244.                                           Send_data(&timer[Cent/16][h]);   
  245.                                         Send_data(&timer[Cent%16][h]);           //分值
  246.                     }
  247.                                  Send_data(&timer[10][h]);                     //两个点
  248.                                  if((Flicker==1)&(id==7))                               //闪烁标志为1时不亮,为零时亮
  249.                                     {                                            
  250.                                           Show_pass();                                                           //不显示一个字
  251.                                         }
  252.                                  else
  253.                                     {
  254.                               Send_data(&timer[Sec/16][h]);            //秒
  255.                                  Send_data(&timer[Sec%16][h]);  
  256.                                       }
  257.                       }



  258.                           if((id==0)&(f==4))                                     //f为三秒转换显示
  259.                           {                  
  260.                              
  261.                                  
  262.                                  Send_data(&hanzi[h*2+1185]);                     //温字符
  263.                          Send_data(&hanzi[h*2+1184]);
  264.                                  Send_data(&hanzi[h*2+1217]);                     //度字符
  265.                          Send_data(&hanzi[h*2+1216]);
  266.                                  Send_data(&timer[10][h]);                                         //两个点               
  267.                                                 
  268.                         
  269.                      if  (tvalue/10==0x00)
  270.                      Send_data(&timer[0][0]);                  
  271.                               else
  272.                                             Send_data(&timer[tvalue/10][h]);         //温度值的十位值
  273.                               Send_data(&timer[tvalue%10][h]);                         //温度值的个位
  274.                                        
  275.                                            Send_data(&timer[11][h]);                         //温度值的符号
  276.                         }


  277.                         if((id==0)&(f==5))

  278.         {
  279.         if(Month == 0x04 && Day == 0x19)
  280.         {  
  281.         while(zimuo<64)
  282.     {
  283.          while(Move<16)                                             //数据移位。
  284.        {
  285.              for(Speed=0;Speed<4;Speed++)       //移动速度
  286.               {        
  287.                     for(line=0;line<16;line++)
  288.                           {
  289.                          char s;
  290.         for(s=4;s>=0;s--)                                            //i为向后先择字节计数器,zimuoo为向后先字计数器
  291.         {
  292.          BUFF[2*s+1]=shengri[zimuo+32*s+2*line];            //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
  293.          BUFF[2*s]=shengri[zimuo+1+32*s+2*line];}                //把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中                                     //调整移动数据
  294.                      rxd_data();
  295.                                  
  296.                       P1=sw[line];      
  297.                                                                        
  298.                 STR=1;//锁存
  299.                 STR=0;
  300.                 UU=1;
  301.             DelayMs();         //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。*/
  302.                                     

  303.                         
  304.                   }
  305.                  }
  306.        Move++;                                                 //移动一步
  307.              }
  308.      Move=0;
  309.          zimuo=zimuo+32;
  310.     }        
  311.         
  312.         }                  
  313.    else        if(Month == 0x10 && Day == 0x26)
  314.                                    
  315.                            {  
  316.                              Send_data(&timer[0][0]);
  317.                              Send_data(&hanzi[h*2+1249]);                     //重阳节字符
  318.                          Send_data(&hanzi[h*2+1248]);
  319.                                  Send_data(&hanzi[h*2+1281]);                     
  320.                          Send_data(&hanzi[h*2+1280]);
  321.                                    Send_data(&hanzi[h*2+1313]);                     
  322.                          Send_data(&hanzi[h*2+1312]);
  323.                                  Send_data(&timer[0][0]);
  324.                                  }
  325.                           
  326.                           
  327.                            else if(Month == 0x11 && Day == 0x26)
  328.                           
  329.                            {
  330.                            Send_data(&timer[0][0]);
  331.                              Send_data(&hanzi[h*2+1345]);                     //感恩节字符
  332.                          Send_data(&hanzi[h*2+1344]);
  333.                                  Send_data(&hanzi[h*2+1377]);                     
  334.                          Send_data(&hanzi[h*2+1376]);
  335.                                    Send_data(&hanzi[h*2+1313]);                     
  336.                          Send_data(&hanzi[h*2+1312]);
  337.                                  Send_data(&timer[0][0]);
  338.                                  }
  339.                           
  340.                           

  341.                          else if(Month == 0x12 && Day == 0x22)
  342.                           
  343.                              {
  344.                                  Send_data(&timer[0][0]);
  345.                              Send_data(&hanzi[h*2+1409]);                     //冬至节字符
  346.                          Send_data(&hanzi[h*2+1408]);
  347.                                  Send_data(&hanzi[h*2+1441]);                     
  348.                          Send_data(&hanzi[h*2+1440]);
  349.                                    Send_data(&hanzi[h*2+1313]);                     
  350.                          Send_data(&hanzi[h*2+1312]);
  351.                                  Send_data(&timer[0][0]);
  352.                                  }
  353.                           
  354.                          else if(Month == 0x12 && Day == 0x25)
  355.                           
  356.                             {
  357.                                  Send_data(&timer[0][0]);
  358.                              Send_data(&hanzi[h*2+1473]);                     //圣诞节字符
  359.                          Send_data(&hanzi[h*2+1472]);
  360.                                  Send_data(&hanzi[h*2+1505]);                     
  361.                          Send_data(&hanzi[h*2+1504]);
  362.                                    Send_data(&hanzi[h*2+1313]);                     
  363.                          Send_data(&hanzi[h*2+1312]);
  364.                                  Send_data(&timer[0][0]);
  365.                                  }
  366.                                  
  367.                            else if (Hour>= 0x06 &&Hour<  0x18 )
  368.                            {
  369.                              Send_data(&timer[0][0]);
  370.                              Send_data(&timer[0][0]);
  371.                              Send_data(&hanzi[h*2+1537]);                     //白天字符
  372.                          Send_data(&hanzi[h*2+1536]);
  373.                                  Send_data(&hanzi[h*2+1569]);                     
  374.                          Send_data(&hanzi[h*2+1568]);
  375.                                  Send_data(&timer[0][0]);
  376.                                  Send_data(&timer[0][0]);
  377.                            }
  378.                            
  379.                          else
  380.                            {
  381.                              Send_data(&timer[0][0]);
  382.                              Send_data(&timer[0][0]);
  383.                              Send_data(&hanzi[h*2+1601]);                     //晚上字符
  384.                          Send_data(&hanzi[h*2+1600]);
  385.                                  Send_data(&hanzi[h*2+1633]);                     
  386.                          Send_data(&hanzi[h*2+1632]);
  387.                                  Send_data(&timer[0][0]);
  388.                                  Send_data(&timer[0][0]);
  389.                            }
  390.                                  }

  391.                         if(id>7)                                   //id大于7时为对显示转换模式设置
  392.                             {        if((Flicker==1)&(id==8))                     
  393.                                {  Show_pass();
  394.                                           Show_pass();
  395.                                           Show_pass();
  396.                                           Show_pass();
  397.                                         }
  398.                                 else if(b==0)
  399.                                    {
  400.                                       Send_data(&hanzi[h*2+993]);   //显示汉字 “自”
  401.                                       Send_data(&hanzi[h*2+992]);
  402.                                       Send_data(&hanzi[h*2+1057]);   //显示汉字“动”
  403.                                       Send_data(&hanzi[h*2+1056]);     
  404.                                           Send_data(&hanzi[h*2+1089]);   //显示汉字“模”
  405.                                       Send_data(&hanzi[h*2+1088]);
  406.                                       Send_data(&hanzi[h*2+1121]);   //显示汉字“式”
  407.                                       Send_data(&hanzi[h*2+1120]);
  408.                                    }
  409.                                 else
  410.                                    {
  411.                                       Send_data(&hanzi[h*2+1025]);   //显示汉字“手”
  412.                                       Send_data(&hanzi[h*2+1024]);
  413.                                       Send_data(&hanzi[h*2+1057]);   //显示汉字“动”
  414.                                       Send_data(&hanzi[h*2+1056]);     
  415.                                           Send_data(&hanzi[h*2+1089]);   //显示汉字“模”
  416.                                       Send_data(&hanzi[h*2+1088]);
  417.                                       Send_data(&hanzi[h*2+1121]);   //显示汉字“式”
  418.                                       Send_data(&hanzi[h*2+1120]);
  419.                                    }
  420.                                 if(id==9)
  421.                                    {
  422.                                      if(b==1)                           //手动模式
  423.                                        {
  424.                                          id=0;f=0;
  425.                                        }
  426.                                      else
  427.                                            {
  428.                                              Send_data(&hanzi[h*2+993]);    //显示汉字“自”
  429.                                          Send_data(&hanzi[h*2+992]);
  430.                                                  Send_data(&hanzi[h*2+1057]);   //显示汉字“动”
  431.                                          Send_data(&hanzi[h*2+1056]);
  432.                                                  if(Flicker==1)
  433.                                                    {
  434.                                                      Show_pass();
  435.                                                    }
  436.                                                  else
  437.                                                {
  438.                                                      Send_data(&timer[a/16][h]);    //转换时间
  439.                                         Send_data(&timer[a%16][h]);
  440.                                                          }
  441.                                                  Send_data(&hanzi[h*2+1153]);   //显示汉字“秒”
  442.                                          Send_data(&hanzi[h*2+1152]);
  443.                                            }
  444.                    }
  445.                           }

  446.       
  447.           P1=sw[h];                                      //输出行信号
  448.           STR=1;STR=0;
  449.            UU=1;                         //锁存为高,595锁存信号
  450.           DelayMs();                      //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。*/
  451.      
  452.         }  
  453.         }        

  454. /************************************************/

  455. //temp=255-temp;
  456. //return temp;   
  457. void timer_1(void) interrupt 1         //中断入口,闪烁
  458. {
  459.   TH0=0xC5;              //15ms定时 晶振12M
  460.   TL0=0x68;
  461.   if(msec++==40)             //1000ms
  462.    { msec=0;
  463.          x++;                           
  464.      if(x>=a)
  465.        { x=0;
  466.             if(b==0)                    //自动模式
  467.         {
  468.                 if(f++==5)
  469.               f=0;          //f显示转换计数器 ,d为用户设置的自动转换时间的值。
  470.             }
  471.            }
  472.     if(h++==4)                    //5秒后进入正常走时。
  473.        {id=0;h=0;}
  474.         }        
  475.   if(msec<20)
  476.             Flicker=0;         //闪烁标志反转                 
  477.   else
  478.             Flicker=1;
  479.                                     
  480. }


  481. /***********************输出一个字的不显示数据。*****************/
  482. void Show_pass()
  483. {
  484.   Send_data(&timer[0][0]);                         //不显示
  485.   Send_data(&timer[0][0]);                         //不显示
  486. }

  487. /**********************************************************/
  488. void in_data(void)                                       //调整数据
  489. {
  490. char s;
  491.         for(s=4;s>=0;s--)                                            //i为向后先择字节计数器,zimuoo为向后先字计数器
  492.         {
  493.          BUFF[2*s+1]=hanzi[zimuo+32*s+2*line];            //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
  494.          BUFF[2*s]=hanzi[zimuo+1+32*s+2*line];                //把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中

  495.         }
  496. }

  497. /***********************发送移动的数据****************************/
  498. void rxd_data(void)                            //串行发送数据
  499. {
  500.   uchar s;
  501.   uchar inc,tempyid,temp;
  502.   if(Move<8)
  503.     inc=0;
  504.   else
  505.     inc=1;
  506.   for(s=0+inc;s<8+inc;s++)                   //发送8字节数据
  507.         {
  508.          if(Move<8)
  509.        tempyid=Move;
  510.      else
  511.      tempyid=Move-8;
  512.      temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));        //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的数据。
  513. temp=255-temp;

  514.    
  515.          SBUF=temp;                      //把BUFF中的字节从大到小移位相或后发送输出。
  516.           while(TI==0);       //等待发送完毕
  517.       TI=0;
  518.          
  519.         }
  520. }


  521. /*******************************************************/
  522. void Send_data(unsigned char *d)          /*从串口发送数据*/
  523. {
  524.      SBUF=*d;
  525.           while(TI==0);       //等待发送完毕
  526.       TI=0;
  527. }


  528. //根据选择调整相应项目
  529. void Set(uchar sel,uchar sel_1)
  530. {
  531.   uchar address,time;
  532.   uchar max,min;
  533.   if(sel==9)  {address=0xc2; max=20;min=1;}    //自动转换时间时最大为20秒。
  534.   if(sel==8)  {address=0xc0; max=1;min=0; }     //显示自动转换或手动转换。为零自动,为1手动。
  535.   if(sel==7)  {address=0x80; max=59;min=0;}     //秒
  536.   if(sel==6)  {address=0x82; max=59;min=0;}    //分钟
  537.   if(sel==5)  {address=0x84; max=23;min=0;}    //小时
  538.   if(sel==4)  {address=0x8a; max=7; min=1;}    //星期
  539.   if(sel==3)  {address=0x86; max=31;min=1;}    //日
  540.   if(sel==2)  {address=0x88; max=12;min=1;}    //月
  541.   if(sel==1)  {address=0x8c; max=99;min=0;}    //年
  542.   
  543.   
  544.   time=R1302(address+1)/16*10+R1302(address+1)%16;
  545.   if (sel_1==0) time++;  else time--;
  546.   if(time>max) time=min;   
  547.   if(time<min) time=max;
  548.            
  549.   W1302(0x8e,0x00);
  550.   W1302(address,time/10*16+time%10);
  551.   W1302(0x8e,0x80);  
  552. }

  553. /**************************延时***********************/

  554. void DelayMs(void)
  555. {
  556.   uchar TempCyc;
  557.   for(TempCyc=110;TempCyc>1;TempCyc--)
  558.      {;}
  559. }

  560. //********DS1302读写程序***************//
  561. /********************************************************************
  562. 函 数 名:RTInputByte()
  563. 功    能:实时时钟写入一字节
  564. 说    明:往DS1302写入1Byte数据 (内部函数)
  565. 入口参数:d 写入的数据
  566. 返 回 值:无  
  567. ***********************************************************************/
  568. void RTInputByte(uchar d)
  569. {
  570.     uchar h;
  571.     ACC = d;
  572.     for(h=8; h>0; h--)
  573.     {
  574.         T_IO = ACC0;           /*相当于汇编中的 RRC */
  575.         T_CLK = 1;
  576.         T_CLK = 0;
  577.         ACC = ACC >> 1;
  578.     }
  579. }
  580. /********************************************************************
  581. 函 数 名:RTOutputByte()
  582. 功    能:实时时钟读取一字节
  583. 说    明:从DS1302读取1Byte数据 (内部函数)
  584. 入口参数:无  
  585. 返 回 值:ACC
  586. 设    计:zhaojunjie           日    期:2002-03-19
  587. 修    改:                     日    期:
  588. ***********************************************************************/
  589. uchar RTOutputByte(void)
  590. {
  591.     uchar h;
  592.     for(h=8; h>0; h--)
  593.     {
  594.         ACC = ACC >>1;         /*相当于汇编中的 RRC */
  595.         ACC7 = T_IO;
  596.         T_CLK = 1;
  597.         T_CLK = 0;
  598.     }
  599.     return(ACC);
  600. }
  601. /********************************************************************
  602. 函 数 名:W1302()
  603. 功    能:往DS1302写入数据
  604. 说    明:先写地址,后写命令/数据 (内部函数)
  605. 调    用:RTInputByte() , RTOutputByte()
  606. 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
  607. 返 回 值:无
  608. ***********************************************************************/
  609. void W1302(uchar ucAddr, uchar ucDa)
  610. {
  611.     T_RST = 0;
  612.     T_CLK = 0;
  613.     T_RST = 1;
  614.     RTInputByte(ucAddr);       /* 地址,命令 */
  615.     RTInputByte(ucDa);       /* 写1Byte数据*/
  616.     T_CLK = 1;
  617.     T_RST = 0;
  618. }
  619. /********************************************************************
  620. 函 数 名:R1302()
  621. 功    能:读取DS1302某地址的数据
  622. 说    明:先写地址,后读命令/数据 (内部函数)
  623. 调    用:RTInputByte() , RTOutputByte()
  624. 入口参数:ucAddr: DS1302地址
  625. 返 回 值:ucData :读取的数据
  626. ***********************************************************************/
  627. uchar R1302(uchar ucAddr)
  628. {
  629.     uchar ucData;
  630.     T_RST = 0;
  631.     T_CLK = 0;
  632.     T_RST = 1;
  633.     RTInputByte(ucAddr);             /* 地址,命令 */
  634.     ucData = RTOutputByte();         /* 读1Byte数据 */
  635.     T_CLK = 1;
  636.     T_RST = 0;
  637.     return(ucData);
  638. }

  639. /********************************************************************
  640. 函 数 名:Set1302()
  641. 功    能:设置初始时间
  642. 说    明:先写地址,后读命令/数据(寄存器多字节方式)
  643. 调    用:W1302()
  644. 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
  645.                                7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
  646. 返 回 值:无
  647. ***********************************************************************/
  648. void Set1302(uchar *pClock)
  649. {
  650.     uchar h;
  651.     uchar ucAddr = 0x80;
  652.     W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
  653.     for(h =7; h>0; h--)
  654.     {
  655.         W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */
  656.         pClock++;
  657.         ucAddr +=2;
  658.     }
  659.         W1302(0xc0,0x01);
  660.         W1302(0XC2,0X03);                        //初始自动转换显示时间为3秒。
  661.     W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/

  662. }
  663. /******************读取DS1302中的时间****************/
  664. void du1302()
  665. {
  666.       Sec=R1302(0x81);   //对取 秒 分 时 日 月 星期 年
  667.           Cent=R1302(0x83);
  668.           Hour=R1302(0x85);
  669.           Day=R1302(0x87);
  670.           Month=R1302(0x89);
  671.           Week=R1302(0x8b);
  672.           Year=R1302(0x8d);                                
  673.           b=R1302(0xc1);
  674.       a=R1302(0xc3);
  675.           a=a/16*10+a%16;
  676.          
  677. }



  678. /******************************ds1820程序***************************************/
  679. void delay_18B20(unsigned int i)//延时1微秒
  680. {
  681.    while(i--);
  682. }
  683. void ds1820rst()/*ds1820复位*/
  684. { unsigned char x=0;
  685. DQ = 1;          //DQ复位
  686. delay_18B20(4); //延时
  687. DQ = 0;          //DQ拉低
  688. delay_18B20(100); //精确延时大于480us
  689. DQ = 1;          //拉高
  690. delay_18B20(40);
  691.    }

  692.    uchar ds1820rd()/*读数据*/
  693. { unsigned char i=0;
  694. unsigned char dat = 0;
  695. for (i=8;i>0;i--)
  696. {   DQ = 0; //给脉冲信号
  697.     dat>>=1;
  698.     DQ = 1; //给脉冲信号
  699.     if(DQ)
  700.     dat|=0x80;
  701.     delay_18B20(10);
  702. }
  703.    return(dat);
  704. }
  705. void ds1820wr(uchar wdata)/*写数据*/
  706. {unsigned char i=0;
  707.     for (i=8; i>0; i--)
  708.    { DQ = 0;
  709.      DQ = wdata&0x01;
  710.      delay_18B20(10);
  711.      DQ = 1;
  712.      wdata>>=1;
  713.    }
  714. }
  715. read_temp()/*读取温度值并转换*/
  716. {

  717. uchar a,b;
  718. ds1820rst();   
  719. ds1820wr(0xcc);//*跳过读序列号*/
  720. ds1820wr(0x44);//*启动温度转换*/
  721. ds1820rst();   
  722. ds1820wr(0xcc);//*跳过读序列号*/
  723. ds1820wr(0xbe);//*读取温度*/
  724. a=ds1820rd();
  725. b=ds1820rd();
  726. tvalue=b*16+a/16;

  727.      //tvalue=b;

  728.     //tvalue<<=8;
  729.    //tvalue=tvalue|a;
  730.     //if(tvalue<0x0fff)
  731.     //tflag=0;
  732.     // else
  733.    //{tvalue=~tvalue+1;
  734.     //tflag=1;
  735.    //}
  736. return(tvalue);
  737. }
  738. /*******************************************************************/
  739. uchar code sw[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};/*16行段码*/





  740. const uchar code timer[13][16]={            /*0~9字符*/

  741. /*--  文字:  0  --*/
  742. /*--  Book Antiqua12;  此字体下对应的点阵为:宽x高=8x20   --*/

  743. 0xFF,0xFF,0xE3,0xDD,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xDD,0xE3,0xFF,0xFF,
  744. /*--  文字:  1  --*/
  745. /*--  Book Antiqua12;  此字体下对应的点阵为:宽x高=8x20   --*/
  746. 0xFF,0xFF,0xEF,0xE7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0x83,0xFF,0xFF,


  747. /*--  文字:  2  --*/
  748. /*--  Book Antiqua12;  此字体下对应的点阵为:宽x高=8x20   --*/
  749. 0xFF,0xFF,0xC7,0xBB,0x7D,0x7F,0x7F,0xBF,0xCF,0xF7,0xFB,0xFD,0xFD,0x01,0xFF,0xFF,


  750. ……………………

  751. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
16x64点阵(2).rar (115.76 KB, 下载次数: 90)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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