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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8403|回復: 6
打印 上一主題 下一主題
收起左側

LCD12864顯示程序和模擬時鐘

[復制鏈接]
跳轉到指定樓層
樓主
效果圖如下所示:



注:沒怎么發過帖子,所以不知道怎么跟大家講這些東西,能用代碼的直接粘代碼了。因為自己感覺這些東西很好玩,所以想跟大家分享一下,如果有什么不懂,可以留言
一些資料: code1模擬時鐘.rar (44.46 KB, 下載次數: 190)
  1.       LCD12864是個好東西,之前介紹了用LCD12864顯示一個簡易的動畫,以及用LCD12864做一個俄羅斯方塊游戲,今天再介紹一點其他的好玩的東西-----用LCD12864做一個模擬指針式時鐘。用LCD12864做一個模擬指針式時鐘,其實主要用的是LCD12864(ST7920)的繪圖功能:
  2.       1.利用圓心坐標和半徑畫一個圓作為表盤
  3.       2.利用兩點間畫線功能畫出時分秒指針。
  4.       讓我們一起來做一個LCD12864模擬指針式時鐘,Let\'s GO!!
  5.      LCD12864的底層驅動很簡單,利用時序圖可以輕松解決,這部分就跳過了。所以,我們首先要解決的是如何畫圓。我在查找資料時,發現有好幾種方法,我使用的是這種:

  6.             /****************************************

  7.             對稱法畫圓的8個鏡像點

  8.             *****************************************/

  9.             void CircleDot(unsigned char x,unsigned char y,char xx,char yy,unsigned char Color)//內部函數,對稱法畫圓的8個鏡像點

  10.             {

  11.                     Lcd_PutPixel((x+yy),(y+xx),Color);//第 1 個 8 分圓

  12.                     Lcd_PutPixel((x+xx),(y+yy),Color);//第 2 個 8 分圓

  13.                     Lcd_PutPixel((x-xx),(y+yy),Color);//第 3 個 8 分圓

  14.                     Lcd_PutPixel((x-yy),(y+xx),Color);//第 4 個 8 分圓

  15.                     Lcd_PutPixel((x-yy),(y-xx),Color);//第 5 個 8 分圓

  16.                     Lcd_PutPixel((x-xx),(y-yy),Color);//第 6 個 8 分圓

  17.                     Lcd_PutPixel((x+xx),(y-yy),Color);//第 7 個 8 分圓

  18.                     Lcd_PutPixel((x+yy),(y-xx),Color);//第 8 個 8 分圓

  19.             }


  20.             /******************************************

  21.             向LCD指定圓心坐標畫一個半徑為r的指定顏色的圓

  22.             *******************************************/

  23.             void Lcd_Circle(unsigned char x,unsigned char y,unsigned char r,unsigned char Color)//中點法畫圓

  24.             {//中點法畫圓

  25.                     unsigned char xx,yy;

  26.                     char deltax,deltay,d;

  27.                     xx=0;

  28.                     yy=r;

  29.                     deltax=3;

  30.                     deltay=2-r-r;

  31.                     d=1-r;

  32.                     CircleDot(x,y,xx,yy,Color);//對稱法畫圓的8個鏡像點

  33.                     while (xx

  34.                         {

  35.                                 if (d<0)

  36.                                 {

  37.                                         d+=deltax;

  38.                                         deltax+=2;

  39.                                         xx++;

  40.                                 }

  41.                                 else

  42.                                 {

  43.                                         d+=deltax+deltay;

  44.                                         deltax+=2;

  45.                                         deltay+=2;

  46.                                         xx++;

  47.                                         yy--;

  48.                                 }

  49.                                 CircleDot(x,y,xx,yy,Color);//對稱法畫圓的8個鏡像點

  50.                         }

  51.                 }

  52. 利用畫圓函數可以先畫出時鐘的表盤,下一步,我們得再畫出時分秒的指針。畫時分秒的指針其實用到的是任意兩點間畫一條線這個功能,如何實現呢?答案是:布蘭森漢姆(Bresenham)算法畫線!在畫線、畫圓中經常會用到Bresenham算法,Bresenham算法是什么?如果你感興趣的話,可以先搜一下,網上關于這個的介紹很多很多,我就不介紹了,上代碼:

  53.         /*******************************************

  54.         向LCD指定起始坐標和結束坐標之間畫一條指定顏色的直線

  55.         ********************************************/

  56.         void Lcd_Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char Color)

  57.         {

  58.                 unsigned int x,y;

  59.                 unsigned int d_x,d_y;//d_x=x2-x1;d_y=y2-y1;

  60.                 int err=0;

  61.                 unsigned char temp=0;

  62.                 if(y2

  63.                     {

  64.                             x=x1;

  65.                             y=y1;

  66.                             x1=x2;

  67.                             y1=y2;

  68.                             x2=x;

  69.                             y2=y;

  70.                     }

  71.                     d_y=y2-y1;

  72.                     if (d_y==0)

  73.                     {

  74.                             if (x1>x2)

  75.                             {

  76.                                     x=x1;

  77.                                     x1=x2;

  78.                                     x2=x;

  79.                             }

  80.                             for (x=x1;x<=x2;x++)

  81.                                     Lcd_PutPixel(x,y1,Color);

  82.                     }

  83.                     

  84.                     else

  85.                     {

  86.                             if(x2>=x1)

  87.                             {

  88.                                     temp=1;

  89.                                     d_x=x2-x1;

  90.                             }

  91.                             else

  92.                             d_x=x1-x2;

  93.                             x=x1;

  94.                             y=y1;

  95.                             Lcd_PutPixel(x,y,Color);

  96.                     

  97.                             if(temp&&(d_y<=d_x))

  98.                             while(x!=x2)

  99.                             {

  100.                                     if(err<0)

  101.                                     {

  102.                                             x=x+1;

  103.                                             err=err+(y2-y);

  104.                                     }

  105.                                     else

  106.                                     {

  107.                                             x=x+1;

  108.                                             y=y+1;

  109.                                             err=err+(y2-y)-(x2-x);

  110.                                     }

  111.                                     Lcd_PutPixel(x,y,Color);

  112.                             }

  113.                     

  114.                             else if(temp&&(d_y>d_x))

  115.                             while(y!=y2)

  116.                             {

  117.                                     d_x=x2-x;

  118.                                     d_y=y2-y;

  119.                                     if(err<0)

  120.                                     {

  121.                                             x=x+1;

  122.                                             y=y+1;

  123.                                             err=err+d_y-d_x;

  124.                                     }

  125.                                     else

  126.                                     {

  127.                                             y=y+1;

  128.                                             err=err-d_x;

  129.                                     }

  130.                                     Lcd_PutPixel(x,y,Color);

  131.                                     

  132.                             }

  133.                     

  134.                             else if(!temp&&(d_y<=d_x))

  135.                             while(x!=x2)

  136.                             {

  137.                                     d_x=x-x2;

  138.                                     d_y=y2-y;

  139.                                     if(err<0)

  140.                                     {

  141.                                             x=x-1;

  142.                                             err=err+d_y;

  143.                                     }

  144.                                     else

  145.                                     {

  146.                                             x=x-1;

  147.                                             y=y+1;

  148.                                             err=err+d_y-d_x;

  149.                                     }

  150.                                     Lcd_PutPixel(x,y,Color);

  151.                             }

  152.                     

  153.                             else if(!temp &&(d_y>d_x))

  154.                             {

  155.                                     while(y!=y2)

  156.                                     {

  157.                                             d_x=x-x2;

  158.                                             d_y=y2-y;

  159.                                             if(err<0)

  160.                                             {

  161.                                                     x=x-1;

  162.                                                     y=y+1;

  163.                                                     err=err+d_y-d_x;

  164.                                             }

  165.                                             else

  166.                                             {

  167.                                                     y=y+1;

  168.                                                     err=err-d_x;

  169.                                             }

  170.                                             Lcd_PutPixel(x,y,Color);

  171.                                     }

  172.                             }

  173.                     }

  174.             }

  175. 有了畫線的方法,我們還不能畫出時分秒指針,因為畫線需要起點坐標和末點坐標。指針是從圓心這一點指向這一刻時間的一條線,起點坐標有了,就是圓盤的圓心坐標,但是末點坐標不知道。比如1秒,秒針由圓心坐標指向1秒的位置,這個1秒的位置在哪??我們可以由圓心坐標和半徑,以及時間的角度算出:

  176.         /***************************************************

  177.         函數名稱:LcdTimeX(uint8 Length,uint8 Angle)

  178.         函數功能:計算指針的X坐標

  179.         輸入參數:circle_x:圓心橫坐標

  180.                   Length  :半徑長度

  181.                          Angle   :角度

  182.         輸出參數: x坐標

  183.         ****************************************************/

  184.         unsigned char Lcd_TimeX(unsigned char circle_x,unsigned char Length,unsigned char Angle)

  185.         {

  186.            unsigned char x;

  187.            if((Angle>0) && (Angle<=15))

  188.            {  

  189.              x = circle_x + Length * (sin(PI * Angle / 30));   

  190.            }

  191.            else if(Angle > 15 && Angle <= 30)   

  192.            {  

  193.               x = circle_x + Length * cos((PI * Angle) / 30 - (PI / 2 ));

  194.            }

  195.            else if(Angle > 30 && Angle <= 45)

  196.            {

  197.                x = circle_x - Length * sin((PI * Angle) / 30- PI);

  198.            }

  199.            else

  200.            {

  201.                x = circle_x-Length * cos((PI * Angle) / 30 - ((3 * PI) / 2));

  202.            }  

  203.                 return x;                        

  204.         }


  205.         /***************************************************

  206.         函數名稱:LcdTimeY(uint8 Length,uint8 Angle)

  207.         函數功能:計算指針的Y坐標

  208.         輸入參數:circle_y:圓心縱坐標

  209.                   Length  :半徑長度

  210.                          Angle   :角度

  211.         輸出參數: Y坐標

  212.         ****************************************************/

  213.         unsigned char Lcd_TimeY(unsigned char circle_y,unsigned char Length,unsigned char Angle)

  214.         {

  215.            unsigned char y;

  216.            if((Angle>0) && (Angle<=15))

  217.            {  

  218.               y = circle_y - Length * (cos(PI * Angle / 30));   

  219.            }

  220.            else if(Angle > 15 && Angle <= 30)   

  221.            {  

  222.               y = circle_y + Length * sin((PI * Angle) / 30 - (PI / 2 ));

  223.            }

  224.            else if(Angle > 30 && Angle <= 45)

  225.            {

  226.                y = circle_y + Length * cos((PI * Angle) / 30- PI);

  227.            }

  228.            else

  229.            {

  230.                y = circle_y - Length * sin((PI * Angle) / 30 - ((3 * PI) / 2));

  231.            }

  232.            return y;                        

  233.         }

  234. 好了,所有的東西都準備齊全了,開工!!
  235.    
  236. 先畫表盤:

  237.     void init_Point_Clock() //初始化表盤
  238.     {
  239.           unsigned char i;
  240.           Lcd_Circle(32,32,31,1);//畫圓  圓心坐標(32,32) 半徑31
  241.           for(i=0;i<60;i++)
  242.          {
  243.             if((i%5)==0)      //畫刻度
  244.            {
  245.                Lcd_Line(Lcd_TimeX(32,30,i),Lcd_TimeY(32,30,i),Lcd_TimeX(32,27,i),Lcd_TimeY(32,27,i),1);                                       
  246.            }
  247.         }
  248.     }

  249. 我用的是定時器做的,這一時刻的時間與上一時刻不一樣時,把上一時刻的指針消除掉,顯示這一時刻的指針

  250. //【0】:上一時刻時間
  251. //【1】:這一時刻時間
  252. struct POINT_CLOCK
  253. {
  254.         unsigned char hour;
  255.         unsigned char minute;
  256.         unsigned char second;

  257. }Point_Time[2];


  258. /*========================================================================
  259. *name:Display_Pointer(struct POINT_CLOCK AA,unsigned char color)
  260. *function:顯示時、分、秒指針
  261. *參    數:結構體: 時分秒   
  262. *                   color: 0不顯示  1:顯示
  263. *注:秒針長24
  264.         分針長17
  265.          秒針長12
  266. =========================================================================*/
  267. void Display_Pointer(struct POINT_CLOCK AA,unsigned char color)        //指針顯示
  268. {
  269.         Lcd_Line(Lcd_TimeX(32,24,AA.second),Lcd_TimeY(32,24,AA.second),32,32,color);         
  270.         Lcd_Line(Lcd_TimeX(32,17,AA.minute),Lcd_TimeY(32,17,AA.minute),32,32,color);        
  271.         Lcd_Line(Lcd_TimeX(32,12,AA.minute/10+5*(AA.hour%12)),Lcd_TimeY(32,12,AA.minute/10+5*(AA.hour%12)),32,32,color);                                                         
  272. }



  273. /*========================================================================
  274. *name:Display_PointClock(struct POINT_CLOCK AA,unsigned char color)
  275. *function:顯示時、分、秒指針
  276. *參    數:結構體0:存放上一個時分秒   》》》兩者不同時,刷新顯示
  277.            結構體1:存放這一個時分秒   》》》
  278. *
  279. *                   color:0不顯示  1:顯示
  280. =========================================================================*/
  281. void Display_PointClock()        //指針式時鐘顯示
  282. {
  283.         if(Point_Time[0].second!=Point_Time[1].second)      //秒刷新
  284.         {
  285.                 Lcd_Line(Lcd_TimeX(32,24,Point_Time[0].second),Lcd_TimeY(32,24,Point_Time[0].second),32,32,0);
  286.         }
  287.         if(Point_Time[0].minute!=Point_Time[1].minute)    //分刷新
  288.         {
  289.                  Lcd_Line(Lcd_TimeX(32,17,Point_Time[0].minute),Lcd_TimeY(32,17,Point_Time[0].minute),32,32,0);        
  290.         }
  291.         if((Point_Time[0].minute/10+5*(Point_Time[0].hour%12))!=(Point_Time[1].minute/10+5*(Point_Time[1].hour%12)))   //時刷新顯示
  292.         {
  293.         Lcd_Line(Lcd_TimeX(32,12,Point_Time[0].minute/10+5*(Point_Time[0].hour%12)),Lcd_TimeY(32,12,Point_Time[0].minute/10+5(Point_Time[0].hour%12)),32,32,0);        
  294.         }
  295.         Display_Pointer(Point_Time[1],1);        //現在的指針式時鐘顯示
  296.         Point_Time[0]=Point_Time[1];
  297. }
復制代碼


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

使用道具 舉報

沙發
ID:97948 發表于 2016-5-20 11:12 | 只看該作者
該程序lcd12864與單片機是如何接線的
回復

使用道具 舉報

板凳
ID:188692 發表于 2017-4-12 12:01 來自手機 | 只看該作者
伙計有沒有電路連接圖!
回復

使用道具 舉報

地板
ID:208716 發表于 2017-6-7 11:34 來自手機 | 只看該作者
樓主大大 請問 能在iAR做嗎?主函數怎么寫  不太懂這些
回復

使用道具 舉報

5#
ID:290299 發表于 2018-3-11 20:30 | 只看該作者
感謝感謝
回復

使用道具 舉報

6#
ID:265310 發表于 2020-1-5 15:31 | 只看該作者
請問樓住這個數字的時鐘顯示的驅動在哪個地方
回復

使用道具 舉報

7#
ID:102963 發表于 2020-3-1 15:47 | 只看該作者
這發的文件不對啊!上面寫著ST7920,結果上來的壓縮包里面是CS1,CS2,這樓主糊弄人的吧?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠爱一区二区三区 | 超碰在线97国产 | 2020天天操| 国产观看 | 在线一区视频 | 综合网伊人| 日p视频免费看 | 91玖玖 | 久久久久久久国产精品影院 | 欧美色综合一区二区三区 | 日本五月婷婷 | 婷婷二区 | 99国产精品99久久久久久 | 精品在线一区 | 午夜男人免费视频 | 成人免费视频网站 | 国产美女自拍视频 | 在线国产视频 | wwwww在线观看 | 久久国产视频网 | 久久国产精品一区二区三区 | 亚洲电影一区二区三区 | 亚洲一区免费 | 久久久久国产一区二区 | 欧美激情视频网站 | 在线成人一区 | 日本成人中文字幕在线观看 | 国产一区二区三区四区hd | 久久精品亚洲 | 超碰在线久 | 成人网av| 久久av网| 狠狠久| 天天操天天怕 | 黄色成人免费在线观看 | 成人免费福利视频 | 国产午夜精品一区二区三区在线观看 | 国产清纯白嫩初高生视频在线观看 | 久久国产精品免费 | 黄色男女网站 | 欧美专区在线 |