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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

LCD12864顯示字符或數字程序,顯示數字函數可以顯示大于0的整數,小數,負數

[復制鏈接]
跳轉到指定樓層
樓主
ID:152913 發表于 2017-7-29 12:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
程序里面的void Transmit_Display( u8 x, u8 y, float tiggtal, int N)函數只需把參數傳進去,x,y是控制顯示坐標,最后一個是控制保留小數點后面幾位小數,
自帶數組顯示函數和字符串顯示函數

單片機源程序如下:
  1. #include "lcd12864.h"
  2. #include "delay.h"
  3. #include "GPIO_Int.h"
  4. #include "math.h"
  5. #include "usart.h"

  6. /*********************************************
  7.              數據讀寫端口
  8. *********************************************/

  9. void Lcd_Send_Date(u8 date)
  10. {
  11.         u8 i;

  12.         LCD_RS=1;

  13.         for(i=0;i<8;i++)
  14.         {
  15.                 if((date<<i)&0x80)
  16.                 {
  17.                     LCD_RW=1;
  18.                 }
  19.                 else
  20.                 {
  21.                     LCD_RW=0;
  22.                 }
  23.                 LCD_EN=0;
  24.                 LCD_EN=1;
  25.         }
  26. }
  27. /***********************************************
  28.                 寫入命令
  29. ***********************************************/
  30. void Write_Cmd(u8 com)
  31. {
  32.     Lcd_Send_Date(0xf8);   
  33.     Lcd_Send_Date(0xf0&com);
  34.     Lcd_Send_Date(com<<4);
  35.     delay_ms(1);
  36. }
  37. /***********************************************
  38.                  寫入數據
  39. ***********************************************/
  40. void Write_Data(u8 dat)
  41. {
  42.     Lcd_Send_Date(0xfa);
  43.     Lcd_Send_Date(dat&0xf0);
  44.     Lcd_Send_Date(dat<<4);
  45.     delay_ms(1);
  46. }
  47. /***********************************************
  48.                液晶屏初始化
  49. ***********************************************/
  50. void Init_ST7920()
  51. {  
  52.         delay_ms(40);           //大于40MS的延時程序
  53.         
  54.         Write_Cmd(0x30);       //選擇基本指令集

  55.         Write_Cmd(0x40);      //對CGRAM第一個自定義字符操作,

  56.         delay_us(100);         //延時大于100us
  57.         
  58.         Write_Cmd(0x30);       //選擇8bit數據流
  59.         
  60.         delay_us(40);         //延時大于37us
  61.         
  62.         Write_Cmd(0x0c);       //開顯示(無游標、不反白)
  63.         
  64.         delay_us(100);         //延時大于100us
  65.         
  66.         Write_Cmd(0x01);       //清除顯示,并且設定地址指針為00H
  67.         
  68.         delay_ms(15);           //延時大于10ms
  69.         
  70.         Write_Cmd(0x06);       //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位,光標從右向左加1位移動
  71.         
  72.         delay_us(100);         //延時大于100us
  73.    
  74. }


  75. void Display_Count(u8 x,u8 y,u8 data)
  76. {
  77.     switch(data)
  78.         {
  79.             case 0:LCD_DisplayInit(x,y,"零");
  80.                 break;
  81.             case 1:LCD_DisplayInit(x,y,"一");
  82.                 break;
  83.           case 2:LCD_DisplayInit(x,y,"二");
  84.                 break;
  85.           case 3:LCD_DisplayInit(x,y,"三");
  86.                 break;
  87.             case 4:LCD_DisplayInit(x,y,"四");
  88.                 break;
  89.       default: break;            
  90.         
  91.         }
  92. }


  93. /***********************************************
  94.                   顯示字符串
  95.             x:橫坐標值,范圍0~8
  96.             y:縱坐標值,范圍1~4
  97. ***********************************************/

  98. void LCD_Struct_Display( LCD_DisplayTypedef *Display_Structure )
  99. {
  100.     switch(Display_Structure->ordinate)
  101.     {
  102.         case 1: Write_Cmd(0x80+( (Display_Structure->abscissa) -1) );break;
  103.         case 2: Write_Cmd(0x90+( (Display_Structure->abscissa) -1) );break;
  104.         case 3: Write_Cmd(0x88+( (Display_Structure->abscissa) -1) );break;
  105.         case 4: Write_Cmd(0x98+( (Display_Structure->abscissa) -1) );break;
  106.            default: break;   
  107.     }
  108.     while(*( Display_Structure->character_string ) != '\0')
  109.    {
  110.          if((*( Display_Structure->character_string )) == 'n')
  111.          {
  112.             USART_RX_STA = 0;
  113.              break;
  114.          }
  115.       Write_Data( (*( Display_Structure->character_string )) );
  116.       ( Display_Structure->character_string )++;
  117.       delay_us(50);
  118.    }
  119. }
  120. /********************************************************

  121.              普通在LCD顯示字符

  122. *******************************************************/

  123. void LCD_DisplayInit(u8 x, u8 y,u8 *spr)
  124. {
  125.   LCD_DisplayTypedef LCD_DisplayStructure;
  126.    
  127.     LCD_DisplayStructure.abscissa = x;
  128.     LCD_DisplayStructure.ordinate = y;
  129.     LCD_DisplayStructure.character_string = spr;
  130.    
  131.     LCD_Struct_Display(&LCD_DisplayStructure);
  132. }


  133. /***********************************************
  134.                顯示串口接收的字符串
  135.               向串口發送x,y,"字符串"
  136. ***********************************************/

  137. void USART1_ReceiveInit(u8 *USART1_Buffer)
  138. {
  139.    
  140.   LCD_DisplayTypedef LCD_DisplayStructure;
  141.    
  142.     LCD_DisplayStructure.abscissa = (*USART1_Buffer - 48);
  143.     LCD_DisplayStructure.ordinate = (*(USART1_Buffer+2) - 48);
  144.     LCD_DisplayStructure.character_string =  USART1_Buffer+4;
  145.    
  146.     LCD_Struct_Display(&LCD_DisplayStructure);
  147.    
  148. }
  149. /****************************************************************
  150.      
  151.          ********進行數字轉換輸出到LCD顯*********

  152. ******************************************************************/

  153. /***************************************************************
  154.                    計算并返回小數點的位置
  155. ***************************************************************/
  156. int Radix_point(float value)
  157. {
  158.     int medium_int = 0, count_RP = 0;

  159.     medium_int = (int)value;
  160.    
  161.     if(value == 0)
  162.     {
  163.          return count_RP;
  164.       }
  165.       
  166.         if(value < 0)
  167.         {
  168.             value = (-value);
  169.         }
  170.             
  171.         if(medium_int > 0)
  172.         {
  173.                 while(medium_int)
  174.              {
  175.                     count_RP++;
  176.                     medium_int /= 10;
  177.              }
  178.              return count_RP;
  179.         }
  180.         else
  181.         {
  182.                  while(!medium_int)   
  183.                 {
  184.                     value *= 10;
  185.                         medium_int = (int)(value);
  186.                     count_RP++;   
  187.                 }
  188.                 return     count_RP;
  189.         }   
  190. }


  191. /*********************************************************

  192.                 把FLOAT型書轉換成INT型返回出去

  193. ***********************************************************/
  194. int Transform_val(float val, int N)
  195. {
  196.     int value = 0;  
  197.    
  198.     if(val < 0)
  199.     {
  200.         val = (-val);
  201.       }
  202.    
  203.     if(val >= 1 )
  204.     {
  205.         value = (int)(val)*pow(10,N) + (int)((val - (int)(val))*pow(10,N));
  206.       }
  207.     else
  208.     if(1>val > 0)
  209.     {
  210.         value = (int)((val)*pow(10,N));
  211.       }

  212.     return     value;
  213. }
  214. /******************************************************************
  215.                    數字顯示函數
  216. *******************************************************************/
  217. void Display_number(int channel_first, float channel_scond)
  218. {
  219.     int current=1, val, count = 1, i = 0, j = 0;

  220.     float medium_float;

  221.     j = (Radix_point(channel_scond)) - 1;
  222.                                                                                     
  223.     val = channel_first;     

  224.     if(channel_scond < 0)
  225.     {
  226.           medium_float =     (-channel_scond);
  227.     }
  228.     else
  229.     {
  230.           medium_float =     channel_scond;
  231.     }
  232.                                          
  233.     while( (val>=10) )   
  234.     {
  235.             val /= 10;
  236.             count *= 10;         
  237.     }

  238.     if(channel_scond < 0)
  239.     {
  240.         Write_Data('-');
  241.     }

  242.     if(medium_float >= 1)  
  243.     {
  244.         while(count)
  245.                 {
  246.                     if(Radix_point(medium_float) == i)
  247.                         {
  248.                                 Write_Data('.');
  249.                                 current = 0;
  250.                                 i = 0;
  251.                         }
  252.                         else
  253.                         {
  254.                                 Write_Data('0' + (channel_first/count%10));
  255.                                 count /=10;
  256.                                 if(current)
  257.                                 i++;
  258.                         }

  259.                 }
  260.     }
  261.     else
  262.     if(medium_float > 0)
  263.     {
  264.             Write_Data('0');
  265.             Write_Data('.');
  266.             while(j > 0)
  267.             {
  268.                 Write_Data('0');
  269.                 j--;
  270.             }
  271.             while(count)
  272.             {
  273.                 Write_Data('0' + (channel_first/count%10));
  274.                         count /=10;
  275.             }

  276.     }
  277.     else
  278.     if(medium_float == 0)
  279.     {
  280.           Write_Data('0');   
  281.     }

  282. }

  283. /***************************************************************
  284.                    數字傳送顯示
  285. **************************************************************/

  286. void Transmit_Display( u8 x, u8 y, float tiggtal, int N)
  287. {
  288.    switch(y)
  289.      {
  290.         case 1: Write_Cmd(0x80+ (x -1)) ;break;
  291.         case 2: Write_Cmd(0x90+ (x -1)) ;break;
  292.         case 3: Write_Cmd(0x88+ (x -1)) ;break;
  293.         case 4: Write_Cmd(0x98+ (x -1)) ;break;
  294.            default: break;   
  295.      }
  296.     Display_number(Transform_val(tiggtal,N),tiggtal);
  297.    
  298. }

復制代碼

LCD12864.h
  1. #ifndef _LCD12864_H_
  2. #define _LCD12864_H_

  3. #include "sys.h"

  4. /******定義一個結構體******/

  5. typedef struct
  6. {
  7.           u8 USART1_DiaplayEnable;
  8.     u8 abscissa;  //x
  9.           u8 ordinate;  //y
  10.           u8 *character_string;
  11. }LCD_DisplayTypedef;

  12. /**************************/

  13. void Write_Cmd(u8 com);
  14. void Write_Data(u8 dat);

  15. void Init_ST7920(void);

  16. void Display_Count(u8 x,u8 y,u8 data);


  17. /*  結構體顯示 */
  18. void LCD_DisplayInit(u8 x, u8 y,u8 *spr);
  19. void LCD_Struct_Display( LCD_DisplayTypedef *Display_Structure );

  20. /*  串口接收顯示  */
  21. void USART1_ReceiveInit(u8 *USART1_Buffer);

  22. /* 數字傳送顯示 */

  23. void Transmit_Display( u8 x, u8 y, float tiggtal, int N);

  24. #endif
復制代碼


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:222834 發表于 2017-7-30 11:09 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

板凳
ID:223438 發表于 2017-7-30 20:57 | 只看該作者
學習學習  感謝分享
回復

使用道具 舉報

地板
ID:308478 發表于 2018-4-15 12:04 | 只看該作者
xaingxiazai
回復

使用道具 舉報

5#
ID:336021 發表于 2018-5-24 18:05 | 只看該作者
謝謝分享
回復

使用道具 舉報

6#
ID:398190 發表于 2021-6-22 14:08 | 只看該作者
不能用啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av观看| 365夜爽爽欧美性午夜免费视频 | 一级黄色片网站 | 狠狠色综合久久丁香婷婷 | 亚洲国产精品一区二区久久 | 久久久999成人| 久久免费精品视频 | 成人av观看 | 亚洲国产精品成人久久久 | 日韩av在线一区二区 | 性高湖久久久久久久久 | 精品久久久久久久 | 成人免费毛片在线观看 | 国产精品18hdxxxⅹ在线 | 毛片com| 久久中文字幕一区 | 男插女下体视频 | 一级欧美一级日韩片 | 亚洲精品国产a久久久久久 午夜影院网站 | 精品久久久久久久久久久久 | 欧美午夜一区二区三区免费大片 | 日韩在线视频一区二区三区 | 久久久久国产精品一区 | 亚洲成人福利 | 精品日韩一区二区 | 伊人网站| 日韩成人一区二区 | 99精品一区二区 | 欧美色综合网 | 免费三级av | 天天玩天天操天天干 | 玖玖玖av| 三级在线免费观看 | 一级欧美日韩 | 浴室洗澡偷拍一区二区 | 欧美偷偷 | 中文字幕在线观看 | 中文字幕精品一区二区三区在线 | 久久av在线播放 | 精品一二区| 中文字幕一区在线观看视频 |