单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

写得很好的LCD12864菜单程序,图文显示(单片机信号发生器项目)

  [复制链接]
跳转到指定楼层
楼主
给大家分享一个写得很好的lcd12864液晶屏的源程序,有菜单功能,图文显示,是一个单片机信号发生器项目
实物图:


Altium Designer画的原理图如下:(51hei附件中可下载工程文件)



单片机源程序如下:
  1. #include <stc12c5a60s2.h>
  2. #include <intrins.h>
  3. #include <stdio.h>
  4. #include "delay.h"
  5. #include "i2c.h"
  6. #include "1302.h"
  7. #include "18b20.h"
  8. #include "AD9850.h"
  9. #include "12864.h"
  10. #include "ZK.h"
  11. #include <math.h>


  12. //sbit rs=P2^4;
  13. //sbit rw=P2^5;
  14. //sbit en=P2^6;
  15. //sbit psb=P2^1;
  16. //sbit res=P2^3;

  17. //#define dataport P0

  18. sbit keyadd=P3^5;//按键上移
  19. sbit keydec=P3^4;//按键下移
  20. sbit keyenter=P3^3;//按键确认
  21. sbit keybac=P3^2;//按键后退
  22. //sbit sda=P3^6;
  23. //sbit scl=P3^7;
  24. //sbit SCK=P1^4;               
  25. //sbit SDA=P1^5;               
  26. //sbit RST=P1^6;
  27. //sbit DQ=P1^3

  28. bit ReadTimeFlag;//读取时间标志
  29. bit ReadVolFlag;//读取电压标志
  30. bit ReadTempFlag;//读取温度标志
  31. bit keyflag;//按键调整扫描标志
  32. bit FrequencyKeyFlag;//按键调整频率标志
  33. bit FrequencyFlag;//进入频率函数标志

  34. unsigned char curr,currold,level,menu,menuold,select,s1num,time, FrequencyBit;
  35. float idata FreDisplay;
  36. unsigned long  idata Frequency;




  37. unsigned char idata VolTemp[3][5];
  38. unsigned char idata FreTemp[16];





  39. unsigned char code Signalhead[]={"    信号发生"};





  40. unsigned char code *SignalMenu[]=
  41. {
  42. {"  正\xFD弦信号"},
  43. {"  三\xFD角信号"},
  44. {"  方波信号"},
  45. };






  46. /*------------------------------------------------
  47.                    液晶主界面显示
  48. ------------------------------------------------*/
  49. void lcd12864_write_Main()
  50. {
  51. DisplayPicture(0,0,1-curr,menudata[0],32,64);
  52. DisplayPicture(4,0,2-curr,menudata[1],32,64);
  53. DisplayPicture(0,31,3-curr,menudata[2],32,64);
  54. DisplayPicture(4,31,4-curr,menudata[3],32,64);
  55. }






  56. /*------------------------------------------------
  57.                   函数发生功能模块显示
  58. ------------------------------------------------*/
  59. void lcd12864_write_SignalMenuData()
  60. {
  61. unsigned char i;
  62. lcd12864_clr();
  63. lcd12864_write_string(0,0,Signalhead);
  64. for(i=0;i<3;i++)
  65.         {
  66.                 lcd12864_write_string(0,i+2,SignalMenu[i]);
  67.   }
  68.         DisplayCGRAM8(0,menu+1);
  69. }









  70. void init_time0()
  71. {
  72. TMOD=0x11;
  73. TH0=(65535-2000)/256;
  74. TL0=(65535-2000)%256;
  75. TH1=(65535-5123)/256;
  76. TL1=(65535-5123)%256;
  77. EA=1;
  78. ET0=1;
  79. ET1=1;
  80. TR0=1;
  81. TR1=1;
  82.        

  83. }

  84. /*------------------------------------------------
  85.                    按键调整时间
  86. ------------------------------------------------*/
  87. void keycheck()
  88. {

  89.          if(keydec==0)
  90.          {
  91.                  delays(10);
  92.                  if(keydec==0)
  93.                  {       
  94.                  while(!keydec);
  95.                  s1num++;
  96.                  time=1;
  97.                  if(s1num>9)
  98.                          s1num=1;
  99.                
  100.      }
  101.          }
  102.          if(keyadd==0)
  103.          {
  104.                  delays(10);
  105.                  if(keyadd==0)
  106.                  {
  107.                         while(!keyadd);
  108.                         time++;
  109.      }
  110.    }
  111.          if(keyenter==0)
  112.          {
  113.                  delays(10);
  114.                  if(keyenter==0)
  115.                  {
  116.                          while(!keyenter);
  117.                          time--;
  118.      }
  119.                  
  120.    }
  121.          if(!keybac)
  122.          {
  123.                  delays(10);
  124.                  if(!keybac)
  125.                  {
  126.                          while(!keybac);
  127.                            level=0;
  128.                                  curr=1;
  129.                            select=0;
  130.                            s1num=0;
  131.                            menu=0;
  132.                           
  133.      }
  134.    }
  135.          

  136. }
  137. /*----------------------------------------------------------------------------------------------
  138.                    菜单按键:level用于定义菜单层级,curr用于定义当前选中选项,menu相当于二级中curr
  139. -------------------------------------------------------------------------------------------------*/
  140. void keypro()
  141. {
  142.   if(!keyadd)
  143.          {
  144.                  delays(10);
  145.                  if(!keyadd)
  146.                  {
  147.                          while(!keyadd);
  148.                          if(level<1)
  149.                          {
  150.                          if(curr<5)
  151.                                  curr++;
  152.                          if(curr==5)
  153.                                  curr=1;
  154.                    }
  155.                    if((level==1)&&(curr==3))
  156.                          {
  157.                                  if(menu<4)
  158.                                          menu++;
  159.                                  if(menu==4)
  160.                                          menu=1;
  161.        }
  162.      }
  163.    }
  164.          if(!keydec)
  165.          {
  166.                 delays(10);
  167.                  if(!keydec)
  168.                  {
  169.                          while(!keydec);
  170.                          if(level<1)
  171.                          {
  172.                          if(curr>=0)
  173.                          {
  174.                                  curr--;
  175.                                  if(curr==0)
  176.                                          curr=4;
  177.                                  
  178.                          }
  179.                    }
  180.                          if((level==1)&&(curr==3))
  181.                          {
  182.                                  menu--;
  183.                                  if(menu==0)
  184.                                          menu=3;
  185.        }
  186.      }
  187.    }
  188.          if(!keyenter)
  189.          {
  190.                  delays(10);
  191.                  if(!keyenter)
  192.                  {
  193.                          while(!keyenter);
  194.                          level++;
  195.                          if((level==1)&&(curr==3))
  196.                                  menu=1;
  197.                          if((level>=1)&&(curr!=3))
  198.                                  level=1;
  199.                          
  200.      }
  201.    }
  202.                   if(!keybac)//按后退键的时候参数初始化下
  203.          {
  204.                  delays(10);
  205.                  if(!keybac)
  206.                  {
  207.                          while(!keybac);
  208.                            level=0;
  209.                                  curr=1;
  210.                            select=0;
  211.                            s1num=0;
  212.                            menu=0;
  213.                           
  214.      }
  215.    }
  216. }



  217. /*------------------------------------------------
  218.                    调整频率时所用的按键程序
  219. ------------------------------------------------*/

  220. void FrequencyKey()
  221. {

  222. if(!keyadd)
  223. {
  224.          delays(10);
  225.          if(!keyadd)
  226.          {
  227.                  while(!keyadd);
  228.                  FrequencyFlag=1;
  229.                  if(FrequencyBit<=6)
  230.                  FrequencyBit++;
  231.                  else
  232.                  FrequencyBit=0;
  233.    }
  234. }
  235. if(!keydec)//dec键用于步进值的选择,增加频率
  236. {
  237.          delays(10);
  238.          if(!keydec)
  239.          {
  240.                  while(!keydec);
  241.                   FrequencyFlag=1;
  242.                  switch (FrequencyBit)
  243.                  {
  244.                          case 0:if((Frequency++)<10000000)Frequency+=1;break;
  245.                          case 1:if((Frequency+10)<10000000)Frequency+=10;break;
  246.                          case 2:if((Frequency+100)<10000000)Frequency+=100;break;
  247.                          case 3:if((Frequency+1000)<10000000)Frequency+=1000;break;
  248.                          case 4:if((Frequency+10000)<10000000)Frequency+=10000;break;
  249.                          case 5:if((Frequency+100000)<10000000)Frequency+=100000;break;
  250.                          case 6:if((Frequency+1000000)<10000000)Frequency+=1000000;break;
  251.                          default:break;
  252.                          
  253.      }
  254.    }
  255. }
  256. if(!keyenter)//enter键用于步进值的选择,减小频率
  257. {
  258.          delays(10);
  259.          if(!keyenter)
  260.          {
  261.                  while(!keyenter);
  262.                   FrequencyFlag=1;
  263.                  switch (FrequencyBit)
  264.                  {
  265.                          case 0:if((Frequency--)>0)Frequency-=1;break;
  266.                          case 1:if((Frequency-10)>0)Frequency-=10;break;
  267.                          case 2:if((Frequency-100)>0)Frequency-=100;break;
  268.                          case 3:if((Frequency-1000)>0)Frequency-=1000;break;
  269.                          case 4:if((Frequency-10000)>0)Frequency-=10000;break;
  270.                          case 5:if((Frequency-100000)>0)Frequency-=100000;break;
  271.                          case 6:if((Frequency-1000000)>0)Frequency-=1000000;break;
  272.                          default:break;
  273.      }
  274.    }
  275. }
  276.          if(!keybac)//退出时重启下ad9850模块
  277.          {
  278.                  delays(10);
  279.                  if(!keybac)
  280.                  {
  281.                          while(!keybac);
  282.                          if(level>0)
  283.                                  level=1;
  284.                            ad9850_reset_serial();
  285.        
  286.                           
  287.      }
  288.    }
  289. }


  290. void main()
  291. {
  292.         bit oe,Dot;
  293.         xdata char Voldata[85];//存储一个周期内电压值的坐标
  294.         xdata float Volvalue[85];//存储一个周期内的电压值
  295.         int NewTemp,Temp,sum,sumold;
  296.         unsigned char i,num,k,w,x,wold,Tempge,Tempshi,sec,secold,color,VolDigit/*电压整数位*/,VolDecimal/*电压小数位*/,count;
  297.         unsigned char count1[3];
  298.         idata float Vol,Temprature,Voltemp,VolMax,VolMin,LM317Vol,LM317Volold;
  299.         oe=1;
  300.         x=0;
  301.         count=0;
  302.         sum=sumold=0;
  303.         w=wold=0;
  304.         sec=secold=0;
  305.         curr=1;
  306.         Temp=240;
  307.         color=0xff;
  308.         Frequency=FreDisplay=0;
  309.         menu=menuold=0;
  310.         AUXR &= 0xfd;
  311. init_time0();
  312. init_12864();
  313. init_i2c();
  314. Init_DS18B20();
  315. Ds1302_Init();
  316. Ds1302_Read_Time();
  317. ad9850_reset_serial();
  318. Clear_GDRAM();
  319. lcd12864_write_com(0x36);

  320. DrawPicture(user128x64);//开机图片
  321.                
  322. for(i=0;i<5;i++)
  323.                 delays(200);
  324. CGRAM();
  325. CGRAM8();



  326. while(1)
  327. {
  328.          sum=menu*100+curr*10+level;//sum用于记录菜单的状态,sum值必须满足一有按键按下值就要变化,这样才能正确的判断进入哪个选项
  329.          if(sum!=sumold)//只有按键按下也就是sum发生变化时才更新菜单
  330.          {
  331.                  sumold=sum;
  332.          switch(sum)
  333.          {
  334.                  case 10:lcd12864_clr();lcd12864_write_Main();keyflag=0;FrequencyKeyFlag=0;ReadVolFlag=0;break;
  335.                  case 20:lcd12864_write_Main();keyflag=0;FrequencyKeyFlag=0;break;//只按上移下移时还是停留在主菜单
  336.                  case 30:lcd12864_write_Main();keyflag=0;FrequencyKeyFlag=0;break;//且不启用调整时间和调整频率时的按键扫描
  337.                  case 40:lcd12864_write_Main();keyflag=0;FrequencyKeyFlag=0;break;
  338.                  case 11:Clear_GDRAM();lcd12864_write_com(0x36);DrawPicture(VolXY);keyflag=0;FrequencyKeyFlag=0;select=1;ReadVolFlag=1;break;//进入第一项(电压测量)时进行的初始化操作,一般都要清屏在画出相应的菜单,通过赋予select不同值以为后面函数判断进入不同的处理
  339.                  case 21:Clear_GDRAM();lcd12864_write_com(0x36);DrawPicture(LM317VolXY);keyflag=0;FrequencyKeyFlag=0;select=6;ReadVolFlag=1;break;//进入第二项(可调输出电压)时的初始化操作
  340.                  case 131:lcd12864_write_SignalMenuData();keyflag=0;FrequencyKeyFlag=0;/*select=2;FrequencyFlag=1;FrequencyKeyFlag=1*/;break;//进入第三项(函数输出)时的初始操作,此项下面还有个次级菜单
  341.      case 231:lcd12864_write_SignalMenuData();keyflag=0;FrequencyKeyFlag=0;/*select=2;FrequencyFlag=1;FrequencyKeyFlag=1*/;break;//进入第三项时开启用menu记录选择状态
  342.                  case 331:lcd12864_write_SignalMenuData();keyflag=0;FrequencyKeyFlag=0;/*select=2;FrequencyFlag=1;FrequencyKeyFlag=1*/;break;
  343.                  case 132:select=2;FrequencyFlag=1;FrequencyKeyFlag=1;keyflag=0;lcd12864_clr();Clear_GDRAM();lcd12864_write_com(0x36);DrawPicture(Coordinate);break;//进入第三项次级菜单,这时要开启频率按键调节按键扫描
  344.                  case 232:select=3;FrequencyFlag=1;FrequencyKeyFlag=1;keyflag=0;break;
  345.                  case 332:select=4;FrequencyFlag=1;FrequencyKeyFlag=1;keyflag=0;break;
  346.                  case 41:/*lcd12864_write_TimeMenuData()*/;select=5;keyflag=1;FrequencyKeyFlag=0;lcd12864_clr();Clear_GDRAM();time=0;break;//进入第四项(时间温度),要开启调节时间按键扫描
  347.                  
  348.                  default:break;
  349.    }
  350.        
  351. }

  352.   switch(select)
  353.          {
  354.                  case 1:  //电压测量
  355.          if(ReadVolFlag==1)
  356.                          {
  357.                                  for(i=0;i<5;i++)//读取5次,以最后一次值为准
  358.                                  {
  359.                                  num=read_add(0x41);
  360.                
  361.                }
  362.                                  Vol=(float) num*5/256*2;//电压转换
  363.                                   Volvalue[x]=Vol;
  364.                                   VolDigit=(unsigned char)Vol;//电压整数位
  365.                                   VolDecimal=(unsigned char)((Vol-VolDigit)*10);//电压小数位
  366.                                   Voldata[x]=3+(12-VolDigit)*5-(VolDecimal/2);//转换为电压Y坐标存储在数组里
  367.                                   x++;                                           
  368.                          }

  369.                          
  370.                          if(x==85)//坐标内只能显示85个电压值,当显示完85个之后(一个周期完了之后)就需要大小排序,置清除标志位Dot为1
  371.                           {
  372.                                  x=0;
  373.                                  Dot=1;
  374.                                  count++;
  375.                                  if(count==99)
  376.                                          count=0;
  377.                                  for(i=0;i<85-1;i++)//冒泡法排序
  378.                                   {
  379.                                          for(k=0;k<85-i-1;k++)
  380.                                          {
  381.                                                  if(Volvalue[k]>Volvalue[k+1])
  382.                                                  {
  383.                                                          Voltemp=Volvalue[k];
  384.                                                          Volvalue[k]=Volvalue[k+1];
  385.                                                          Volvalue[k+1]=Voltemp;
  386.                                                          
  387.              }
  388.            }
  389.          }
  390.                                  VolMax=Volvalue[84];
  391.                                  VolMin=Volvalue[0];
  392.                           }
  393.                                 if(Dot)
  394.                          DrawDots(11+x+1,Voldata[x],0);//只要第一周期一过就要开始清除上一周期的电压坐标点,12864清GDRAM非常慢,用这种方法清坐标点速度快且得到的坐标线都是连续的很直观
  395.                          DrawDots(11+x,Voldata[x-1],1);//,比如说在x=1的位置写入当前电压值坐标就要在x=2的位置清除上一周期的电压值坐标,Voldata[x-1]存储的是当前电压Y坐标,Voldata[x]上一周期x处的电压Y坐标
  396.                                 sprintf(count1,"T=%02d",(int)count);
  397.                          lcd12864_write_string(6,4,count1);//显示周期
  398.                          sprintf(VolTemp[0],"%3.2f",Vol);
  399.                    lcd12864_write_string(6,1,VolTemp[0]);//显示当前电压
  400.                                
  401.        if(Dot)
  402.                          {
  403.                          sprintf(VolTemp[1],"%3.2f",VolMax);
  404.                          lcd12864_write_string(6,2,VolTemp[1]);//显示最大值
  405.                          
  406.                          sprintf(VolTemp[2],"%3.2f",VolMin);
  407.                          lcd12864_write_string(6,3,VolTemp[2]);//显示最小值
  408.              }
  409.                   
  410.                         break;
  411.                 case 6://可调电压
  412.                         if(ReadVolFlag==1)
  413.                          {
  414.                                  for(i=0;i<5;i++)//和上面读取电压一样读五次以最后的为准
  415.                                  {
  416.                                  num=read_add(0x40);
  417.                
  418.                }
  419.                                  Vol=(float) num*5/256*2;
  420.                                  VolDigit=(unsigned char)Vol;
  421.                                  VolDecimal=(unsigned char)((Vol-VolDigit)*10);
  422.                            LM317Vol=VolDigit*10+VolDecimal;//输出的电压值X坐标
  423.                                  for(i=0;i<15;i++)
  424.                                  {
  425.                                  DrawDots(12+LM317Volold,60-i,0);//上次测得的电压坐标清零,
  426.                                  DrawDots(12+LM317Vol,60-i,1);//显示这次测得的电压
  427.                                  }
  428.                                  LM317Volold=LM317Vol;
  429.                                  sprintf(VolTemp[1],"%3.2fV",Vol);
  430.                          lcd12864_write_string(0,1,"输出电压V=");
  431.                    lcd12864_write_string(5,1,VolTemp[1]);
  432.                          }
  433.                                  break;
  434.                        
  435.                 case 2://函数输出
  436.                 if(FrequencyFlag==1)
  437.                 {
  438.                         FrequencyFlag=0;
  439.                         ad9850_reset_serial();
  440.       ad9850_wr_serial(0x00,Frequency);       
  441.                         if((Frequency>=0)&&(Frequency<100))//判断步进值,根据不同步进值来负责w用以后面函数的处理
  442.                                 w=6;
  443.                         if((Frequency>=100)&&(Frequency<1000))
  444.                                 w=5;
  445.                         if((Frequency>=1000)&&(Frequency,10000))
  446.                                 w=4;
  447.                         if((Frequency>=10000)&&(Frequency<100000))
  448.                                 w=3;
  449.                         if((Frequency>=100000)&&(Frequency<1000000))
  450.                                 w=2;
  451.                         if((Frequency>=1000000)&&(Frequency<10000000))
  452.                                 w=1;
  453.                         if(w!=wold)//只有w改变时才画sin函数,根据w的不同更改sin的周期,w改变时还是要清除以前的sin函数
  454.                         {
  455.                                 for(i=6;i-6<128;i++)
  456.                                 {
  457.                                         k=6*sin((i-6)*(3.14/(wold*10)))+110;
  458.                                   DrawDots(i,k,0);
  459.                 
  460.         }
  461.                                 wold=w;
  462.                                
  463.                         for(i=6;i-6<128;i++)
  464.                                 {
  465.                                         k=6*sin((i-6)*(3.14/(w*10)))+110;
  466.                                   DrawDots(i,k,1);
  467.                 
  468.         }
  469.                                
  470.                
  471.                   }
  472.                         switch(FrequencyBit)//显示步进值
  473.                         {
  474.                                
  475.                                 case 0:lcd12864_write_string(0,2,"                ");
  476.                                              lcd12864_write_string(0,2,"Fre+/-1Hz");break;
  477.                                 case 1:lcd12864_write_string(0,2,"                ");
  478.                                              lcd12864_write_string(0,2,"Fre+/-10Hz");break;
  479.                                 case 2:lcd12864_write_string(0,2,"                ");
  480.                                              lcd12864_write_string(0,2,"Fre+/-100Hz");break;
  481.                                 case 3:lcd12864_write_string(0,2,"                ");
  482.                                              lcd12864_write_string(0,2,"Fre+/-1KHz");break;
  483.                                 case 4:lcd12864_write_string(0,2,"                ");
  484.                                              lcd12864_write_string(0,2,"Fre+/-10KHz");break;
  485.                                 case 5:lcd12864_write_string(0,2,"                ");
  486.                                              lcd12864_write_string(0,2,"Fre+/-100KHz");break;
  487.                                 case 6:lcd12864_write_string(0,2,"                ");
  488.                                              lcd12864_write_string(0,2,"Fre+/-1MHz");break;
  489.                                 default:break;
  490.       }
  491.      
  492.                         if(Frequency<=1000)//显示当前频率Frequency>1000 Frequency<=1000000时显示为KHz
  493.                         {
  494.                                
  495.                                 FreDisplay=Frequency;
  496.                                 sprintf(FreTemp,"Fre=%3.1f Hz",FreDisplay);
  497.                                 lcd12864_write_string(0,0,"                ");
  498.                                 lcd12864_write_string(0,1,FreTemp);
  499.        
  500.         
  501.                                
  502.       }
  503.                         if((Frequency>1000)&&(Frequency<=1000000))
  504.                         {
  505.                                 FreDisplay=Frequency*0.001;
  506.                                 sprintf(FreTemp,"Fre=%3.3f KHz",FreDisplay);
  507.                                 lcd12864_write_string(0,0,"                ");
  508.                                 lcd12864_write_string(0,1,FreTemp);
  509.        
  510.                                
  511.       }
  512.                         if((Frequency>1000000)&&(Frequency<10000000))
  513.                         {
  514.                                 FreDisplay=Frequency*0.000001;
  515.                                 sprintf(FreTemp,"Fre=%3.3f MHz",FreDisplay);
  516.                                 lcd12864_write_string(0,0,"                ");
  517.                                 lcd12864_write_string(0,1,FreTemp);

  518.                                
  519.       }
  520.     }
  521.                
  522.                  break;
  523.                        
  524.                 case 5: //时间温度
  525.                             
  526.                             
  527.                                
  528.                                  if(s1num!=0)
  529.                                  {
  530.                                          color=0x01<<s1num;//根据所按调节时间按键的次数来判断该调那个位置(该调年还是调月等等),color用来将需要调节的位置反白显示
  531.                                          switch(s1num)//调节时间函数
  532.                                          {
  533.                                                  case 1:
  534.                                                                                  time_buf1[1]=14;
  535.                                                                                  Ds1302_Write_Time();
  536.                                                         break;
  537.                                                  case 2:
  538.                                                               if(time>=12)
  539.                                                                  time=0;
  540.                                                          if(time<=0)
  541.                                                                                          time=12;
  542.                                                                                  time_buf1[2]=time;
  543.                                                                                  Ds1302_Write_Time();
  544.                                                                                  break;
  545.                                                  case 3:
  546.                                                                if(time>=31)
  547.                                                                  time=0;
  548.                                                          if(time<=0)
  549.                                                                                          time=31;
  550.                                                                                  time_buf1[3]=time;
  551.                                                                                  Ds1302_Write_Time();
  552.                                                         break;
  553.                                                  case 4:if(time>=8)
  554.                                                                  time=0;
  555.                                                          if(time<=0)
  556.                                                                                          time=7;
  557.                                                                                  time_buf1[7]=time;
  558.                                                                                  Ds1302_Write_Time();
  559.                                                         break;
  560.                                                  case 5:if(time>=24)
  561.                                                                  time=0;
  562.                                                          if(time<=0)
  563.                                                                                          time=24;
  564.                                                                                  time_buf1[4]=time;
  565.                                                                                  Ds1302_Write_Time();
  566.                                                         break;
  567.                                                  case 6:if(time>=60)
  568.                                                                  time=0;
  569.                                                          if(time<=0)
  570.                                                                                          time=60;
  571.                                                                                  time_buf1[5]=time;
  572.                                                                                  Ds1302_Write_Time();
  573.                                                         break;
  574.                                                        
  575.                                                 case 7:
  576.                                                               s1num=0;
  577.                                                         break;
  578.                                                   default:break;
  579.                                                  
  580.            }
  581.          }
  582.                                  
  583.                                  
  584.                                         if(ReadTimeFlag==1)//若读取时间到了就更新时间
  585.                                         {
  586.                                  Ds1302_Read_Time();
  587.                                  ReadTimeFlag=0;
  588.                                         sec=time_buf1[6];
  589.                                         DisplayPicture(1,30,(color>>5)-1,num110[time_buf1[4]/10],32,16);//
  590.           DisplayPicture(2,30,(color>>5)-1,num110[time_buf1[4]%10],32,16);               
  591.           DisplayPicture(3,30,1,num110[10],32,16);
  592.           DisplayPicture(4,30,(color>>6)-1,num110[time_buf1[5]/10],32,16);               
  593.           DisplayPicture(5,30,(color>>6)-1,num110[time_buf1[5]%10],32,16);               
  594.                                                                                        
  595.                                        
  596.                                
  597.                                         DisplayPicture(1,2,(color>>1)-1,num123[time_buf1[1]],16,16);
  598.                                         DisplayPicture(2,2,1,year[0],16,16);
  599.                                         DisplayPicture(3,2,(color>>2)-1,num123[time_buf1[2]],16,16);
  600.                                         DisplayPicture(4,2,1,year[1],16,16);
  601.                                         DisplayPicture(5,2,(color>>3)-1,num123[time_buf1[3]],16,16);
  602.           DisplayPicture(6,2,1,year[2],16,16);       

  603.           DisplayPicture(1,18,(color>>4)-1,week[time_buf[7]-1],12,48);               
  604.                                         if(sec!=secold)//模拟秒走动函数,只有过来1s才执行
  605.                                         {
  606.                                         secold=sec;
  607.                                         if(sec<=20)//20s之前都在12864第1,2行(也就是y=1,y=2)0-127列(x=0-127)处根据秒的数值画点
  608.                                         {
  609.                                                 if(sec<=10)//小于10秒时以7格的步进长度画点,若走完一周,就需要开始清除画的点了,根据oe的值判断
  610.                                                 {
  611.                                                         for(i=(sec-1)*7;i<=sec*7;i++)
  612.                                                         {
  613.                                                         DrawDots(i,0,oe);
  614.                                                         DrawDots(i,1,oe);
  615.                                                         }
  616.                                                 }
  617.                                                 if((sec>10)&&(sec<=19))//后9s用6格画点
  618.                                                 {
  619.                                                         for(i=(sec-1)*6+9;i<=sec*6+9;i++)
  620.                                                         {
  621.                                                         DrawDots(i,0,oe);
  622.                                                         DrawDots(i,1,oe);
  623.                                                         }
  624.             }
  625.                                                 if(sec==20)//最后一秒画4格刚好画满
  626.                                                 {
  627.                                                         for(i=124;i<128;i++)
  628.                                                   {
  629.                                                                 DrawDots(i,0,oe);
  630.                                                                 DrawDots(i,1,oe);       
  631.               }
  632.           }
  633.                                 }
  634.                                 if((sec>20)&&(sec<=30))//20-30s时在x=126,127,y=0-63的范围内根据秒的值画点,根据oe的值来决定是画点还是清点,
  635.                                                              //oe每一周60s反转一次,就达到了第一个60s沿着12864外圈画点,下一个60s沿着原轨迹清点的效果
  636.                                 {
  637.                                         if((sec>20)&&(sec<=25))
  638.                                                 {
  639.                                                         for(i=(sec-1-20)*7;i<=(sec-20)*7;i++)
  640.                                                         {
  641.                                                         DrawDots(126,i,oe);
  642.                                                         DrawDots(127,i,oe);
  643.                                                         }
  644.                                                 }
  645.                                                 if((sec>25)&&(sec<=29))
  646.                                                 {
  647.                                                         for(i=(sec-1-20)*6+6;i<=(sec-20)*6+6;i++)
  648.                                                         {
  649.                                                         DrawDots(126,i,oe);
  650.                                                         DrawDots(127,i,oe);
  651.                                                         }
  652.             }
  653.                                                 if(sec==30)
  654.                                                 {
  655.                                                         for(i=60;i<64;i++)
  656.                                                   {
  657.                                                                 DrawDots(126,i,oe);
  658.                                                                 DrawDots(127,i,oe);         
  659.               }
  660.           }
  661.         }
  662.                                 if((sec>30)&&(sec<=50))
  663.                                 {
  664.                                         if((sec>30)&&(sec<=40))
  665.                                         {
  666.                                                 for(i=(sec-30-1)*7;i<=(sec-30)*7;i++)
  667.                                                 {
  668.                                                         DrawDots(127-i,62,oe);
  669.                                                         DrawDots(127-i,63,oe);
  670.             }
  671.                                         }
  672.                                                 if((sec>40)&&(sec<=49))
  673.                                                 {
  674.                                                         DrawDots(60,62,oe);
  675.                                                 for(i=(sec-30-1)*6+9;i<=(sec-30)*6+9;i++)
  676.                                                 {
  677.                                                        
  678.                                                         DrawDots(127-i,62,oe);
  679.                                                         DrawDots(127-i,63,oe);
  680.             }
  681.                                         }
  682.                                          if(sec==50)
  683.                                          {
  684.                                                  for(i=0;i<4;i++)
  685.                                                  {
  686.                                                          DrawDots(i,62,oe);
  687.                                                          DrawDots(i,63,oe);
  688.              }
  689.            }
  690.          
  691.         }
  692.                                 if((sec>50)&&(sec<=59))
  693.                                 {
  694.          for(i=(sec-50-1)*7;i<(sec-50)*7;i++)
  695.           {
  696.                                                 DrawDots(0,63-i,oe);
  697.                                                 DrawDots(1,63-i,oe);
  698.           }                                       
  699. ……………………

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

所有资料51hei提供下载:
12864综合程序.rar (2.26 MB, 下载次数: 253)


评分

参与人数 3黑币 +58 收起 理由
7358655 + 5 液晶牛人
Eleven_1ing + 3 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
孤独求败 发表于 2018-1-15 20:36 | 只看该作者
我爱黑,有你更精彩
回复

使用道具 举报

板凳
yulin3192 发表于 2018-4-19 12:43 | 只看该作者
谢谢楼主的分享
回复

使用道具 举报

地板
xinca 发表于 2018-4-24 11:08 | 只看该作者
多谢分享~~
回复

使用道具 举报

5#
lxj1997 发表于 2018-6-22 16:38 | 只看该作者
写的不错,学习了
回复

使用道具 举报

6#
gordonzhang240 发表于 2018-8-2 07:35 | 只看该作者
感谢,正在使用12864屏幕,参考意义重大。
回复

使用道具 举报

7#
无效楼层,该帖已经被删除
8#
dajingjiu 发表于 2018-9-25 10:15 | 只看该作者
辛苦了!我是做液晶模块的,需要的话可以免费提供12864液晶屏。QQ:88164434
回复

使用道具 举报

9#
menwawork 发表于 2018-10-4 11:34 | 只看该作者
谢谢楼主的无私奉献!!!
回复

使用道具 举报

10#
来生只想做头猪 发表于 2018-10-8 00:03 来自手机 | 只看该作者
这个论坛棒棒的,待我学有所成定将回报社会
回复

使用道具 举报

11#
Fader 发表于 2018-10-25 10:08 | 只看该作者
看着很厉害,拿来试试先
回复

使用道具 举报

12#
Fader 发表于 2018-10-25 11:01 | 只看该作者
为什么程序运行以后各种错误
回复

使用道具 举报

13#
leessang 发表于 2018-10-30 13:58 | 只看该作者
有点复杂,看懂还需要点时间
回复

使用道具 举报

14#
gemxie 发表于 2018-11-4 22:44 | 只看该作者

谢谢楼主的无私奉献!!!
回复

使用道具 举报

15#
heyining000 发表于 2018-11-6 16:49 | 只看该作者


谢谢楼主的无私奉献!!!
回复

使用道具 举报

16#
deltacom 发表于 2019-1-31 17:34 | 只看该作者



谢谢楼主的无私奉献!!!
回复

使用道具 举报

17#
deltacom 发表于 2019-1-31 17:37 | 只看该作者
谢谢楼主的无私奉献!!!
回复

使用道具 举报

18#
123215 发表于 2019-3-5 13:29 | 只看该作者
请问这个信号发生器的最大频率是多少啊
回复

使用道具 举报

19#
centch 发表于 2019-3-7 22:51 | 只看该作者
综合应用的例子,楼主很厉害。多谢。
回复

使用道具 举报

20#
51单片机1234 发表于 2019-3-18 22:39 | 只看该作者
谢谢楼主的分享
回复

使用道具 举报

21#
Ufosckj 发表于 2019-3-21 17:27 | 只看该作者
真的很全面!感谢楼主分享,要好好消化一下!
回复

使用道具 举报

22#
Ufosckj 发表于 2019-3-21 17:41 | 只看该作者
楼主那个DDS模块有资料吗?图片也看不清!
回复

使用道具 举报

23#
linnyshow 发表于 2019-3-25 10:52 | 只看该作者
很强大。支持
回复

使用道具 举报

24#
duhuan502 发表于 2019-3-27 13:25 来自手机 | 只看该作者
写的不错,学习了
回复

使用道具 举报

25#
51NHYY 发表于 2019-3-27 16:05 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

26#
刚哥1211 发表于 2019-4-11 13:17 | 只看该作者
把液晶用到如此境界,可说是出神入化了
回复

使用道具 举报

27#
deer_G 发表于 2019-4-17 16:45 | 只看该作者
好像超级厉害的样子
回复

使用道具 举报

28#
ghty 发表于 2019-5-16 15:27 | 只看该作者
谢谢分享
回复

使用道具 举报

29#
ghty 发表于 2019-5-16 15:27 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛5群 联系QQ:125739409;技术交流QQ群174280738

Powered by 单片机教程网

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