找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1203|回复: 0
打印 上一主题 下一主题
收起左侧

LCD12864显示变量,显示数字 单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:1069230 发表于 2023-10-20 15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近想用LCD12864显示变量,但是商家并没有提供此函数,在网上找了好久,终于找到了,稍微改进了一下

单片机源程序如下:

  1. lcd12864.c如下

  2. #include "lcd12864.h"

  3. //LCD初始化
  4. void lcd12864_init(void)
  5. {
  6.         LCD12864_PSB = 1; //选择8位或4位并口方式
  7.         lcd12864_write_cmd(0x30);        //显示模式设置,开始要求每次检测忙信号
  8.         lcd12864_write_cmd(0x01);        //显示清屏
  9.         lcd12864_write_cmd(0x06);        //显示光标移动设置
  10.         lcd12864_write_cmd(0x0C);        //显示开及光标设置

  11. }

  12. //写指令
  13. void lcd12864_write_cmd(u8 cmd)
  14. {

  15.         LCD12864_RS = 0;
  16.         LCD12864_WR = 0;
  17.         LCD12864_E = 0;
  18.         LCD12864_DATAPORT = cmd;
  19.         delay_ms(1);
  20.         LCD12864_E = 1;
  21.         delay_ms(1);
  22.         LCD12864_E = 0;
  23. }

  24. //写数据
  25. void lcd12864_write_data(u8 dat)
  26. {

  27.         LCD12864_RS = 1;
  28.         LCD12864_WR = 0;
  29.         LCD12864_E = 0;
  30.         LCD12864_DATAPORT = dat;
  31.         delay_ms(1);
  32.         LCD12864_E = 1;
  33.         delay_ms(1);
  34.         LCD12864_E = 0;
  35. }

  36. //清屏
  37. void lcd12864_clear(void)
  38. {
  39.         lcd12864_write_cmd(0x01);        //显示清屏
  40. }

  41. /*******************************************************************************
  42. * 函 数 名       : lcd12864_show_char
  43. * 函数功能                 : LCD12864显示一个字符
  44. * 输    入       : x,y:显示坐标,x=0~7,y=0~3;
  45.                                    DData:显示的字符
  46. * 输    出             : 无
  47. *******************************************************************************/
  48. void lcd12864_show_char(u8 X, u8 Y, u8 DData)
  49. {
  50.         if(Y<=0)Y=0;
  51.         if(Y>3)Y=3;
  52.         X &= 0x0F;      //限制X不能大于16,Y不能大于1
  53.         switch (Y) {
  54.                 case 0:
  55.                         X |= 0x80;
  56.                         break;
  57.                 case 1:
  58.                         X |= 0x90;
  59.                         break;
  60.                 case 2:
  61.                         X |= 0x88;
  62.                         break;
  63.                 case 3:
  64.                         X |= 0x98;
  65.                         break;
  66.         }

  67.         lcd12864_write_cmd(X);      //这里不检测忙信号,发送地址码
  68.         lcd12864_write_data(DData);
  69. }

  70. /*******************************************************************************
  71. * 函 数 名       : lcd12864_show_string
  72. * 函数功能                 : LCD12864显示字符串
  73. * 输    入       : x,y:显示坐标,x=0~7,y=0~3;
  74.                                    DData:显示字符串数据
  75. * 输    出             : 无
  76. *******************************************************************************/
  77. void lcd12864_show_string(u8 X, u8 Y, u8 *DData)
  78. {
  79.         u8 ListLength, X2;
  80.         ListLength = 0;
  81.         X2 = X;
  82.         if(Y<=0)Y=0;
  83.         if(Y>3)Y=3;
  84.         X &= 0x0F;      //限制X不能大于16,Y在1-4之内
  85.         switch (Y) {
  86.                 case 0:
  87.                         X2 |= 0x80;
  88.                         break;
  89.                 case 1:
  90.                         X2 |= 0x90;
  91.                         break;
  92.                 case 2:
  93.                         X2 |= 0x88;
  94.                         break;
  95.                 case 3:
  96.                         X2 |= 0x98;
  97.                         break;
  98.         }
  99.         lcd12864_write_cmd(X2);     //发送地址码
  100.         while (DData[ListLength] >= 0x20) { //若到达字串尾则退出
  101.                 if (X <= 0x0F) { //X坐标应小于0x0F
  102.                         lcd12864_write_data(DData[ListLength]);
  103.                         ListLength++;
  104.                         X++;
  105.                         delay_ms(5);
  106.                 }
  107.         }
  108. }




  109. /*******************************************************************************
  110. * 函 数 名       : lcd12864_show_num
  111. * 函数功能                 : LCD12864显示数字
  112. * 输    入       : x,y:显示坐标,x=0~7,y=0~3;
  113.                                    number:显示字符串数据
  114.                    Length:要显示数字的长度
  115. * 输    出             : 无
  116. *******************************************************************************/

  117. void lcd12864_show_num(u8 X, u8 Y, u32 number, u8 Length)
  118. {
  119.         u8 array[11];
  120.         u8 i;
  121.         array[Length] = 0;


  122.         for (i = Length; i > 0; i--) {
  123.                 array[i - 1] = number % 10 + '0';
  124.                 number /= 10;
  125.         }

  126.         for (i = 0; i < Length - 1; i++) {
  127.                 if (array == '0') {
  128.                         array = ' ';
  129.                 }
  130.                 else {
  131.                         break;
  132.                 }
  133.         }
  134.         lcd12864_show_string(X, Y, array);
  135. }

  136. /*******************************************************************************
  137. * 函 数 名       : lcd12864_show_image
  138. * 函数功能                 : LCD12864显示图片
  139. * 输    入       : DData:要显示的图片
  140.                     阴码,顺向(高位在前),逐行
  141. * 输    出             : 无
  142. *******************************************************************************/

  143. void lcd12864_show_image(u8 code *DData)
  144. {
  145.     u8 x, y, i;
  146.     u16 tmp = 0;
  147.     for(i = 0; i < 9; i+=8)     //分两屏,上半屏和下半屏
  148.     {
  149.         for(x=0; x<32; x++)
  150.         {
  151.             lcd12864_write_cmd(0x34);
  152.             lcd12864_write_cmd(0x80+x);      //列地址
  153.             lcd12864_write_cmd(0x80+i);      //行地址,下半屏
  154.             for(y=0;y<16;y++)
  155.             {
  156.                 lcd12864_write_data(DData[tmp+y]); //读取数据写入LCD
  157.             }
  158.             tmp +=16;
  159.         }
  160.     }
  161.     lcd12864_write_cmd(0x36);        //扩充功能设定
  162.     lcd12864_write_cmd(0x30);
  163. }


  164. lcd12864.h如下


  165. #ifndef _lcd12864_H
  166. #define _lcd12864_H

  167. #include "public.h"

  168. sbit LCD12864_RS=P2^6;//数据命令选择
  169. sbit LCD12864_WR=P2^5;//读写选择
  170. sbit LCD12864_E=P2^7;//使能信号

  171. #define LCD12864_DATAPORT        P0        //LCD12864数据端口定义
  172. sbit LCD12864_PSB=P3^2;//8位或4并口/串口选择


  173. void lcd12864_init(void);     //LCD初始化
  174. void lcd12864_write_cmd(u8 WCLCD);    //写指令
  175. void lcd12864_write_data(u8 WDLCD);     //写数据
  176. void lcd12864_clear(void);                //清屏
  177. void lcd12864_show_char(u8 X,u8 Y,u8 DData);   //显示一个字符
  178. void lcd12864_show_string(u8 X, u8 Y, u8 *DData);   //显示一串字符
  179. void lcd12864_show_image(u8 code *DData);   //显示图形
  180. void lcd12864_show_num(u8 X, u8 Y, u32 number,u8 Length);    //显示一串数字



  181. #endif


  182. public.c
  183. #include "public.h"

  184. /*******************************************************************************
  185. * 函 数 名       : delay_10us
  186. * 函数功能                 : 延时函数,ten_us=1时,大约延时10us
  187. * 输    入       : ten_us
  188. * 输    出             : 无
  189. *******************************************************************************/
  190. void delay_10us(u16 ten_us)
  191. {
  192.         while(ten_us--);      
  193. }

  194. /*******************************************************************************
  195. * 函 数 名       : delay_ms
  196. * 函数功能                 : ms延时函数,ms=1时,大约延时1ms
  197. * 输    入       : ms:ms延时时间
  198. * 输    出             : 无
  199. *******************************************************************************/
  200. void delay_ms(u16 ms)
  201. {
  202.         u16 i,j;
  203.         for(i=ms;i>0;i--)
  204.                 for(j=110;j>0;j--);
  205. }

  206. public.h
  207. #ifndef _public_H
  208. #define _public_H

  209. #include "reg52.h"

  210. typedef unsigned int u16;        //对系统默认数据类型进行重定义
  211. typedef unsigned char u8;
  212. typedef unsigned long u32;

  213. void delay_10us(u16 ten_us);
  214. void delay_ms(u16 ms);

  215. #endif
复制代码
原理图: 无
仿真: 无
代码: lcd12864.zip (2.54 KB, 下载次数: 19)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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