久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18748|回復(fù): 43
打印 上一主題 下一主題
收起左側(cè)

寫得很好的LCD12864菜單程序,圖文顯示(單片機信號發(fā)生器項目)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:194327 發(fā)表于 2018-1-10 10:50 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
給大家分享一個寫得很好的lcd12864液晶屏的源程序,有菜單功能,圖文顯示,是一個單片機信號發(fā)生器項目
實物圖:


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;//按鍵確認(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;//讀取時間標(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;//進入頻率函數(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[]={"    信號發(fā)生"};





  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.                   函數(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)整時間
  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用于定義當(dāng)前選中選項,menu相當(dāng)于二級中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ù)初始化下
  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)整頻率時所用的按鍵程序
  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];//存儲一個周期內(nèi)電壓值的坐標(biāo)
  294.         xdata float Volvalue[85];//存儲一個周期內(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);//開機圖片
  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值必須滿足一有按鍵按下值就要變化,這樣才能正確的判斷進入哪個選項
  329.          if(sum!=sumold)//只有按鍵按下也就是sum發(fā)生變化時才更新菜單
  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;//且不啟用調(diào)整時間和調(diào)整頻率時的按鍵掃描
  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;//進入第一項(電壓測量)時進行的初始化操作,一般都要清屏在畫出相應(yīng)的菜單,通過賦予select不同值以為后面函數(shù)判斷進入不同的處理
  339.                  case 21:Clear_GDRAM();lcd12864_write_com(0x36);DrawPicture(LM317VolXY);keyflag=0;FrequencyKeyFlag=0;select=6;ReadVolFlag=1;break;//進入第二項(可調(diào)輸出電壓)時的初始化操作
  340.                  case 131:lcd12864_write_SignalMenuData();keyflag=0;FrequencyKeyFlag=0;/*select=2;FrequencyFlag=1;FrequencyKeyFlag=1*/;break;//進入第三項(函數(shù)輸出)時的初始操作,此項下面還有個次級菜單
  341.      case 231:lcd12864_write_SignalMenuData();keyflag=0;FrequencyKeyFlag=0;/*select=2;FrequencyFlag=1;FrequencyKeyFlag=1*/;break;//進入第三項時開啟用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;//進入第三項次級菜單,這時要開啟頻率按鍵調(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;//進入第四項(時間溫度),要開啟調(diào)節(jié)時間按鍵掃描
  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次,以最后一次值為準(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)存儲在數(shù)組里
  367.                                   x++;                                           
  368.                          }

  369.                          
  370.                          if(x==85)//坐標(biāo)內(nèi)只能顯示85個電壓值,當(dāng)顯示完85個之后(一個周期完了之后)就需要大小排序,置清除標(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)點,12864清GDRAM非常慢,用這種方法清坐標(biāo)點速度快且得到的坐標(biāo)線都是連續(xù)的很直觀
  395.                          DrawDots(11+x,Voldata[x-1],1);//,比如說在x=1的位置寫入當(dāng)前電壓值坐標(biāo)就要在x=2的位置清除上一周期的電壓值坐標(biāo),Voldata[x-1]存儲的是當(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);//上次測得的電壓坐標(biāo)清零,
  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://函數(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ù)不同步進值來負(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改變時才畫sin函數(shù),根據(jù)w的不同更改sin的周期,w改變時還是要清除以前的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)//顯示步進值
  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時顯示為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;//根據(jù)所按調(diào)節(jié)時間按鍵的次數(shù)來判斷該調(diào)那個位置(該調(diào)年還是調(diào)月等等),color用來將需要調(diào)節(jié)的位置反白顯示
  531.                                          switch(s1num)//調(diào)節(jié)時間函數(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)//若讀取時間到了就更新時間
  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)//模擬秒走動函數(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ù)值畫點
  608.                                         {
  609.                                                 if(sec<=10)//小于10秒時以7格的步進長度畫點,若走完一周,就需要開始清除畫的點了,根據(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格畫點
  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的范圍內(nèi)根據(jù)秒的值畫點,根據(jù)oe的值來決定是畫點還是清點,
  635.                                                              //oe每一周60s反轉(zhuǎn)一次,就達到了第一個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黑下載附件…………
復(fù)制代碼

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


評分

參與人數(shù) 3黑幣 +58 收起 理由
7358655 + 5 液晶牛人
Eleven_1ing + 3 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏35 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:228939 發(fā)表于 2018-1-15 20:36 | 只看該作者
我愛黑,有你更精彩
回復(fù)

使用道具 舉報

板凳
ID:234782 發(fā)表于 2018-4-19 12:43 | 只看該作者
謝謝樓主的分享
回復(fù)

使用道具 舉報

地板
ID:134662 發(fā)表于 2018-4-24 11:08 | 只看該作者
多謝分享~~
回復(fù)

使用道具 舉報

5#
ID:245838 發(fā)表于 2018-6-22 16:38 | 只看該作者
寫的不錯,學(xué)習(xí)了
回復(fù)

使用道具 舉報

6#
ID:330301 發(fā)表于 2018-8-2 07:35 | 只看該作者
感謝,正在使用12864屏幕,參考意義重大。
回復(fù)

使用道具 舉報

7#
ID:98875 發(fā)表于 2018-9-25 10:15 | 只看該作者
辛苦了!我是做液晶模塊的,需要的話可以免費提供12864液晶屏。QQ:88164434
回復(fù)

使用道具 舉報

8#
ID:89420 發(fā)表于 2018-10-4 11:34 | 只看該作者
謝謝樓主的無私奉獻!!!
回復(fù)

使用道具 舉報

9#
ID:406128 發(fā)表于 2018-10-8 00:03 來自手機 | 只看該作者
這個論壇棒棒的,待我學(xué)有所成定將回報社會
回復(fù)

使用道具 舉報

10#
ID:396689 發(fā)表于 2018-10-25 10:08 | 只看該作者
看著很厲害,拿來試試先
回復(fù)

使用道具 舉報

11#
ID:396689 發(fā)表于 2018-10-25 11:01 | 只看該作者
為什么程序運行以后各種錯誤
回復(fù)

使用道具 舉報

12#
ID:411793 發(fā)表于 2018-10-30 13:58 | 只看該作者
有點復(fù)雜,看懂還需要點時間
回復(fù)

使用道具 舉報

13#
ID:92810 發(fā)表于 2018-11-4 22:44 | 只看該作者

謝謝樓主的無私奉獻!!!
回復(fù)

使用道具 舉報

14#
ID:26748 發(fā)表于 2018-11-6 16:49 | 只看該作者


謝謝樓主的無私奉獻!!!
回復(fù)

使用道具 舉報

15#
ID:451413 發(fā)表于 2019-1-31 17:34 | 只看該作者



謝謝樓主的無私奉獻!!!
回復(fù)

使用道具 舉報

16#
ID:451413 發(fā)表于 2019-1-31 17:37 | 只看該作者
謝謝樓主的無私奉獻!!!
回復(fù)

使用道具 舉報

17#
ID:284357 發(fā)表于 2019-3-5 13:29 | 只看該作者
請問這個信號發(fā)生器的最大頻率是多少啊
回復(fù)

使用道具 舉報

18#
ID:290290 發(fā)表于 2019-3-7 22:51 | 只看該作者
綜合應(yīng)用的例子,樓主很厲害。多謝。
回復(fù)

使用道具 舉報

19#
ID:229361 發(fā)表于 2019-3-18 22:39 | 只看該作者
謝謝樓主的分享
回復(fù)

使用道具 舉報

20#
ID:440971 發(fā)表于 2019-3-21 17:27 | 只看該作者
真的很全面!感謝樓主分享,要好好消化一下!
回復(fù)

使用道具 舉報

21#
ID:440971 發(fā)表于 2019-3-21 17:41 | 只看該作者
樓主那個DDS模塊有資料嗎?圖片也看不清!
回復(fù)

使用道具 舉報

22#
ID:110278 發(fā)表于 2019-3-25 10:52 | 只看該作者
很強大。支持
回復(fù)

使用道具 舉報

23#
ID:76201 發(fā)表于 2019-3-27 13:25 來自手機 | 只看該作者
寫的不錯,學(xué)習(xí)了
回復(fù)

使用道具 舉報

24#
ID:499230 發(fā)表于 2019-3-27 16:05 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報

25#
ID:509511 發(fā)表于 2019-4-11 13:17 | 只看該作者
把液晶用到如此境界,可說是出神入化了
回復(fù)

使用道具 舉報

26#
ID:301813 發(fā)表于 2019-4-17 16:45 | 只看該作者
好像超級厲害的樣子
回復(fù)

使用道具 舉報

27#
ID:539881 發(fā)表于 2019-5-16 15:27 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

28#
ID:539881 發(fā)表于 2019-5-16 15:27 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

29#
ID:557774 發(fā)表于 2019-6-11 00:16 | 只看該作者
論怎么寫出這么大的程序,當(dāng)然是從小程序出發(fā)勒,樓主能不能發(fā)點小程序
回復(fù)

使用道具 舉報

30#
ID:346927 發(fā)表于 2019-6-11 10:22 | 只看該作者
謝謝樓主的分享
回復(fù)

使用道具 舉報

31#
ID:557774 發(fā)表于 2019-6-12 00:18 來自手機 | 只看該作者
樓主的主程序,按鍵程序怎么這么復(fù)雜?
回復(fù)

使用道具 舉報

32#
ID:728400 發(fā)表于 2020-4-16 17:45 | 只看該作者

謝謝樓主的無私奉獻!!!
回復(fù)

使用道具 舉報

33#
ID:518941 發(fā)表于 2020-6-2 23:08 | 只看該作者

謝謝樓主的無私奉獻!!!
回復(fù)

使用道具 舉報

34#
ID:797184 發(fā)表于 2020-7-5 16:18 | 只看該作者
就是這個,最后因為篇幅受限沒發(fā)的部分,我下載了,沒找到有
回復(fù)

使用道具 舉報

35#
ID:328014 發(fā)表于 2020-7-5 17:24 | 只看該作者
沈深 發(fā)表于 2020-7-5 16:18
就是這個,最后因為篇幅受限沒發(fā)的部分,我下載了,沒找到有

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

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

0.jpg
回復(fù)

使用道具 舉報

36#
ID:47634 發(fā)表于 2020-7-5 23:07 | 只看該作者
很好很好,感謝樓主的好資料
回復(fù)

使用道具 舉報

37#
ID:797789 發(fā)表于 2020-7-6 12:57 | 只看該作者
51hei團團 發(fā)表于 2020-7-5 17:24
有,我找到了,在這里,圖中的這個文件就是,還有頭文件都有

,但是他#include<stc12c5a60s2.h>、#include <intrins.h>,這兩個點H文件都沒給我們啊
回復(fù)

使用道具 舉報

38#
ID:797789 發(fā)表于 2020-7-6 13:12 | 只看該作者
51hei團團 發(fā)表于 2020-7-5 17:24
有,我找到了,在這里,圖中的這個文件就是,還有頭文件都有

該怎樣正確使用這個代碼呀,求教
回復(fù)

使用道具 舉報

39#
ID:246133 發(fā)表于 2020-7-15 13:28 | 只看該作者
綜合應(yīng)用的例子,這個比較全,多謝分享。
回復(fù)

使用道具 舉報

40#
ID:795562 發(fā)表于 2020-7-21 18:39 | 只看該作者
我想要一個STC15W408AS控制頻合LC72131,12864或者1602顯示的3-30Mhz頻率的收音機程序,步進0.1Mhz和1KHZ兩種同時調(diào)臺(一個粗調(diào),一個細(xì)調(diào))的程序。樓主或者哪位大師可以寫 一個嗎?
謝謝呢
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产黄色在线观看 | 日本二区在线观看 | 欧美在线视频一区二区 | 爱爱小视频| 国产激情在线看 | 亚洲综合日韩精品欧美综合区 | 999精品视频| 欧美精品一区二区三区在线四季 | 成人欧美一区二区三区在线观看 | 婷婷久久综合 | wwwxxx日本在线观看 | 国产在线观看一区二区三区 | 男女羞羞视频在线 | 99热精品国产 | 日本一区二区三区精品视频 | 91一区二区 | 天天看天天爽 | 久久亚洲高清 | 91在线免费视频 | 欧美日韩亚洲国产 | 久草在线 | 操操日| 黄色成人在线网站 | 久久男人| 亚洲性免费 | av一区二区在线观看 | 看片91 | 高清成人免费视频 | 99久久精品国产一区二区三区 | 日本中文字幕一区 | 久久成| 黄色福利 | 精品一区在线 | 91精品国产91久久久久久密臀 | 一区视频在线 | 亚洲色欧美另类 | 草久视频| 亚洲国产精品区 | 91中文字幕在线 | 99亚洲视频| 一级黄色播放 |