欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 寫得很好的LCD12864菜單程序,圖文顯示(單片機(jī)信號(hào)發(fā)生器項(xiàng)目) [打印本頁]

作者: elevenoclock    時(shí)間: 2018-1-10 10:50
標(biāo)題: 寫得很好的LCD12864菜單程序,圖文顯示(單片機(jī)信號(hào)發(fā)生器項(xiàng)目)
給大家分享一個(gè)寫得很好的lcd12864液晶屏的源程序,有菜單功能,圖文顯示,是一個(gè)單片機(jī)信號(hào)發(fā)生器項(xiàng)目
實(shí)物圖:


Altium Designer畫的原理圖如下:(51hei附件中可下載工程文件)



單片機(jī)源程序如下:
  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;//按鍵確認(rèn)
  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;//讀取時(shí)間標(biāo)志
  29. bit ReadVolFlag;//讀取電壓標(biāo)志
  30. bit ReadTempFlag;//讀取溫度標(biāo)志
  31. bit keyflag;//按鍵調(diào)整掃描標(biāo)志
  32. bit FrequencyKeyFlag;//按鍵調(diào)整頻率標(biāo)志
  33. bit FrequencyFlag;//進(jìn)入頻率函數(shù)標(biāo)志

  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[]={"    信號(hào)發(fā)生"};





  40. unsigned char code *SignalMenu[]=
  41. {
  42. {"  正\xFD弦信號(hào)"},
  43. {"  三\xFD角信號(hào)"},
  44. {"  方波信號(hào)"},
  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.                   函數(shù)發(fā)生功能模塊顯示
  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.                    按鍵調(diào)整時(shí)間
  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用于定義菜單層級(jí),curr用于定義當(dāng)前選中選項(xiàng),menu相當(dāng)于二級(jí)中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)//按后退鍵的時(shí)候參數(shù)初始化下
  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.                    調(diào)整頻率時(shí)所用的按鍵程序
  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鍵用于步進(jìn)值的選擇,增加頻率
  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鍵用于步進(jìn)值的選擇,減小頻率
  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)//退出時(shí)重啟下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];//存儲(chǔ)一個(gè)周期內(nèi)電壓值的坐標(biāo)
  294.         xdata float Volvalue[85];//存儲(chǔ)一個(gè)周期內(nèi)的電壓值
  295.         int NewTemp,Temp,sum,sumold;
  296.         unsigned char i,num,k,w,x,wold,Tempge,Tempshi,sec,secold,color,VolDigit/*電壓整數(shù)位*/,VolDecimal/*電壓小數(shù)位*/,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);//開機(jī)圖片
  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用于記錄菜單的狀態(tài),sum值必須滿足一有按鍵按下值就要變化,這樣才能正確的判斷進(jìn)入哪個(gè)選項(xiàng)
  329.          if(sum!=sumold)//只有按鍵按下也就是sum發(fā)生變化時(shí)才更新菜單
  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;//只按上移下移時(shí)還是停留在主菜單
  336.                  case 30:lcd12864_write_Main();keyflag=0;FrequencyKeyFlag=0;break;//且不啟用調(diào)整時(shí)間和調(diào)整頻率時(shí)的按鍵掃描
  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;//進(jìn)入第一項(xiàng)(電壓測(cè)量)時(shí)進(jìn)行的初始化操作,一般都要清屏在畫出相應(yīng)的菜單,通過賦予select不同值以為后面函數(shù)判斷進(jìn)入不同的處理
  339.                  case 21:Clear_GDRAM();lcd12864_write_com(0x36);DrawPicture(LM317VolXY);keyflag=0;FrequencyKeyFlag=0;select=6;ReadVolFlag=1;break;//進(jìn)入第二項(xiàng)(可調(diào)輸出電壓)時(shí)的初始化操作
  340.                  case 131:lcd12864_write_SignalMenuData();keyflag=0;FrequencyKeyFlag=0;/*select=2;FrequencyFlag=1;FrequencyKeyFlag=1*/;break;//進(jìn)入第三項(xiàng)(函數(shù)輸出)時(shí)的初始操作,此項(xiàng)下面還有個(gè)次級(jí)菜單
  341.      case 231:lcd12864_write_SignalMenuData();keyflag=0;FrequencyKeyFlag=0;/*select=2;FrequencyFlag=1;FrequencyKeyFlag=1*/;break;//進(jìn)入第三項(xiàng)時(shí)開啟用menu記錄選擇狀態(tài)
  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;//進(jìn)入第三項(xiàng)次級(jí)菜單,這時(shí)要開啟頻率按鍵調(diào)節(jié)按鍵掃描
  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;//進(jìn)入第四項(xiàng)(時(shí)間溫度),要開啟調(diào)節(jié)時(shí)間按鍵掃描
  347.                  
  348.                  default:break;
  349.    }
  350.        
  351. }

  352.   switch(select)
  353.          {
  354.                  case 1:  //電壓測(cè)量
  355.          if(ReadVolFlag==1)
  356.                          {
  357.                                  for(i=0;i<5;i++)//讀取5次,以最后一次值為準(zhǔn)
  358.                                  {
  359.                                  num=read_add(0x41);
  360.                
  361.                }
  362.                                  Vol=(float) num*5/256*2;//電壓轉(zhuǎn)換
  363.                                   Volvalue[x]=Vol;
  364.                                   VolDigit=(unsigned char)Vol;//電壓整數(shù)位
  365.                                   VolDecimal=(unsigned char)((Vol-VolDigit)*10);//電壓小數(shù)位
  366.                                   Voldata[x]=3+(12-VolDigit)*5-(VolDecimal/2);//轉(zhuǎn)換為電壓Y坐標(biāo)存儲(chǔ)在數(shù)組里
  367.                                   x++;                                           
  368.                          }

  369.                          
  370.                          if(x==85)//坐標(biāo)內(nèi)只能顯示85個(gè)電壓值,當(dāng)顯示完85個(gè)之后(一個(gè)周期完了之后)就需要大小排序,置清除標(biāo)志位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);//只要第一周期一過就要開始清除上一周期的電壓坐標(biāo)點(diǎn),12864清GDRAM非常慢,用這種方法清坐標(biāo)點(diǎn)速度快且得到的坐標(biāo)線都是連續(xù)的很直觀
  395.                          DrawDots(11+x,Voldata[x-1],1);//,比如說在x=1的位置寫入當(dāng)前電壓值坐標(biāo)就要在x=2的位置清除上一周期的電壓值坐標(biāo),Voldata[x-1]存儲(chǔ)的是當(dāng)前電壓Y坐標(biāo),Voldata[x]上一周期x處的電壓Y坐標(biāo)
  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]);//顯示當(dāng)前電壓
  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://可調(diào)電壓
  412.                         if(ReadVolFlag==1)
  413.                          {
  414.                                  for(i=0;i<5;i++)//和上面讀取電壓一樣讀五次以最后的為準(zhǔn)
  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坐標(biāo)
  423.                                  for(i=0;i<15;i++)
  424.                                  {
  425.                                  DrawDots(12+LM317Volold,60-i,0);//上次測(cè)得的電壓坐標(biāo)清零,
  426.                                  DrawDots(12+LM317Vol,60-i,1);//顯示這次測(cè)得的電壓
  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://函數(shù)輸出
  436.                 if(FrequencyFlag==1)
  437.                 {
  438.                         FrequencyFlag=0;
  439.                         ad9850_reset_serial();
  440.       ad9850_wr_serial(0x00,Frequency);       
  441.                         if((Frequency>=0)&&(Frequency<100))//判斷步進(jìn)值,根據(jù)不同步進(jìn)值來負(fù)責(zé)w用以后面函數(shù)的處理
  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改變時(shí)才畫sin函數(shù),根據(jù)w的不同更改sin的周期,w改變時(shí)還是要清除以前的sin函數(shù)
  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)//顯示步進(jìn)值
  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)//顯示當(dāng)前頻率Frequency>1000 Frequency<=1000000時(shí)顯示為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: //時(shí)間溫度
  525.                             
  526.                             
  527.                                
  528.                                  if(s1num!=0)
  529.                                  {
  530.                                          color=0x01<<s1num;//根據(jù)所按調(diào)節(jié)時(shí)間按鍵的次數(shù)來判斷該調(diào)那個(gè)位置(該調(diào)年還是調(diào)月等等),color用來將需要調(diào)節(jié)的位置反白顯示
  531.                                          switch(s1num)//調(diào)節(jié)時(shí)間函數(shù)
  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)//若讀取時(shí)間到了就更新時(shí)間
  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)//模擬秒走動(dòng)函數(shù),只有過來1s才執(zhí)行
  605.                                         {
  606.                                         secold=sec;
  607.                                         if(sec<=20)//20s之前都在12864第1,2行(也就是y=1,y=2)0-127列(x=0-127)處根據(jù)秒的數(shù)值畫點(diǎn)
  608.                                         {
  609.                                                 if(sec<=10)//小于10秒時(shí)以7格的步進(jìn)長(zhǎng)度畫點(diǎn),若走完一周,就需要開始清除畫的點(diǎn)了,根據(jù)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格畫點(diǎn)
  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時(shí)在x=126,127,y=0-63的范圍內(nèi)根據(jù)秒的值畫點(diǎn),根據(jù)oe的值來決定是畫點(diǎn)還是清點(diǎn),
  635.                                                              //oe每一周60s反轉(zhuǎn)一次,就達(dá)到了第一個(gè)60s沿著12864外圈畫點(diǎn),下一個(gè)60s沿著原軌跡清點(diǎn)的效果
  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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
12864綜合程序.rar (2.26 MB, 下載次數(shù): 572)



作者: 孤獨(dú)求敗    時(shí)間: 2018-1-15 20:36
我愛黑,有你更精彩
作者: yulin3192    時(shí)間: 2018-4-19 12:43
謝謝樓主的分享

作者: xinca    時(shí)間: 2018-4-24 11:08
多謝分享~~
作者: lxj1997    時(shí)間: 2018-6-22 16:38
寫的不錯(cuò),學(xué)習(xí)了
作者: gordonzhang240    時(shí)間: 2018-8-2 07:35
感謝,正在使用12864屏幕,參考意義重大。
作者: dajingjiu    時(shí)間: 2018-9-25 10:15
辛苦了!我是做液晶模塊的,需要的話可以免費(fèi)提供12864液晶屏。QQ:88164434
作者: menwawork    時(shí)間: 2018-10-4 11:34
謝謝樓主的無私奉獻(xiàn)!!!
作者: 來生只想做頭豬    時(shí)間: 2018-10-8 00:03
這個(gè)論壇棒棒的,待我學(xué)有所成定將回報(bào)社會(huì)
作者: Fader    時(shí)間: 2018-10-25 10:08
看著很厲害,拿來試試先
作者: Fader    時(shí)間: 2018-10-25 11:01
為什么程序運(yùn)行以后各種錯(cuò)誤
作者: leessang    時(shí)間: 2018-10-30 13:58
有點(diǎn)復(fù)雜,看懂還需要點(diǎn)時(shí)間
作者: gemxie    時(shí)間: 2018-11-4 22:44

謝謝樓主的無私奉獻(xiàn)!!!
作者: heyining000    時(shí)間: 2018-11-6 16:49


謝謝樓主的無私奉獻(xiàn)!!!
作者: deltacom    時(shí)間: 2019-1-31 17:34



謝謝樓主的無私奉獻(xiàn)!!!
作者: deltacom    時(shí)間: 2019-1-31 17:37
謝謝樓主的無私奉獻(xiàn)!!!
作者: 123215    時(shí)間: 2019-3-5 13:29
請(qǐng)問這個(gè)信號(hào)發(fā)生器的最大頻率是多少啊

作者: centch    時(shí)間: 2019-3-7 22:51
綜合應(yīng)用的例子,樓主很厲害。多謝。
作者: 51單片機(jī)1234    時(shí)間: 2019-3-18 22:39
謝謝樓主的分享
作者: Ufosckj    時(shí)間: 2019-3-21 17:27
真的很全面!感謝樓主分享,要好好消化一下!
作者: Ufosckj    時(shí)間: 2019-3-21 17:41
樓主那個(gè)DDS模塊有資料嗎?圖片也看不清!
作者: linnyshow    時(shí)間: 2019-3-25 10:52
很強(qiáng)大。支持
作者: duhuan502    時(shí)間: 2019-3-27 13:25
寫的不錯(cuò),學(xué)習(xí)了
作者: 51NHYY    時(shí)間: 2019-3-27 16:05
謝謝樓主分享
作者: 剛哥1211    時(shí)間: 2019-4-11 13:17
把液晶用到如此境界,可說是出神入化了
作者: deer_G    時(shí)間: 2019-4-17 16:45
好像超級(jí)厲害的樣子

作者: ghty    時(shí)間: 2019-5-16 15:27
謝謝分享
作者: ghty    時(shí)間: 2019-5-16 15:27
謝謝分享

作者: abc111111    時(shí)間: 2019-6-11 00:16
論怎么寫出這么大的程序,當(dāng)然是從小程序出發(fā)勒,樓主能不能發(fā)點(diǎn)小程序
作者: irisice008    時(shí)間: 2019-6-11 10:22
謝謝樓主的分享
作者: abc111111    時(shí)間: 2019-6-12 00:18
樓主的主程序,按鍵程序怎么這么復(fù)雜?
作者: chenhongran    時(shí)間: 2020-4-16 17:45

謝謝樓主的無私奉獻(xiàn)!!!
作者: 曉華喵    時(shí)間: 2020-6-2 23:08

謝謝樓主的無私奉獻(xiàn)!!!
作者: 沈深    時(shí)間: 2020-7-5 16:18
就是這個(gè),最后因?yàn)槠芟逈]發(fā)的部分,我下載了,沒找到有
作者: 51hei團(tuán)團(tuán)    時(shí)間: 2020-7-5 17:24
沈深 發(fā)表于 2020-7-5 16:18
就是這個(gè),最后因?yàn)槠芟逈]發(fā)的部分,我下載了,沒找到有

有,我找到了,在這里,圖中的這個(gè)文件就是,還有頭文件都有

0.jpg (60.63 KB, 下載次數(shù): 60)

0.jpg

作者: robter    時(shí)間: 2020-7-5 23:07
很好很好,感謝樓主的好資料
作者: SDHS    時(shí)間: 2020-7-6 12:57
51hei團(tuán)團(tuán) 發(fā)表于 2020-7-5 17:24
有,我找到了,在這里,圖中的這個(gè)文件就是,還有頭文件都有

,但是他#include<stc12c5a60s2.h>、#include <intrins.h>,這兩個(gè)點(diǎn)H文件都沒給我們啊
作者: SDHS    時(shí)間: 2020-7-6 13:12
51hei團(tuán)團(tuán) 發(fā)表于 2020-7-5 17:24
有,我找到了,在這里,圖中的這個(gè)文件就是,還有頭文件都有

該怎樣正確使用這個(gè)代碼呀,求教

作者: tanker_zheng    時(shí)間: 2020-7-15 13:28
綜合應(yīng)用的例子,這個(gè)比較全,多謝分享。
作者: bfzy123    時(shí)間: 2020-7-21 18:39
我想要一個(gè)STC15W408AS控制頻合LC72131,12864或者1602顯示的3-30Mhz頻率的收音機(jī)程序,步進(jìn)0.1Mhz和1KHZ兩種同時(shí)調(diào)臺(tái)(一個(gè)粗調(diào),一個(gè)細(xì)調(diào))的程序。樓主或者哪位大師可以寫 一個(gè)嗎?
謝謝呢
作者: noble64    時(shí)間: 2021-11-13 13:14
這個(gè)真的有點(diǎn)牛,下載來研究研究。
作者: cb474265474265    時(shí)間: 2021-11-13 15:06
謝謝樓主無私奉獻(xiàn)!為你點(diǎn)贊!!!
作者: rqzzx    時(shí)間: 2023-5-21 15:11
正在學(xué)習(xí)菜單程序,謝謝




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1