找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6688|回复: 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 单片机教程网

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