找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 681|回复: 11
收起左侧

求大神帮忙搞个LCD12864显示进度条

[复制链接]
ID:61140 发表于 2025-3-29 20:48 | 显示全部楼层 |阅读模式
因为要学习LCD12864,想弄个初始百分比进度条显示,想三天也没搞明白
在此求教大神了

这里是我的原程序,
直接在本程序后面再弄个子函数方便调用即可,在此谢谢各位大神!!!


//******************************************************************************
#include "hong.h"
void   Delay(u8 us);                         //定义微秒程序
void   DelayMs(u16 ms);                      //定义毫秒程序
void   WriteDataLCD(u8 WDLCD);               //给LCD12864写数据
void   WriteCommandLCD(u8 WCLCD);            //给LCD12864写指令
void   LCDInit(void);                        //LCD12864初始化
void   LCDClear(void);                       //LCD12864清屏
void   CheckBusy(void);                      //忙检测
void   LCDSendWord(u8 *p);                   //向LCD发送一个字符串
void   DisplayImage(u8 code *DData);         //显示一幅128*64图片程序
void   LCDTestWord(bit i,u8 word);           //向LCD写数据或指令
//******************************************************************************
sbit    LCD_RS = P4^5;                       //高电平数据低电平指令
sbit    LCD_RW = P4^2;                       //高电平读低电平写
sbit    LCD_E  = P4^4;                       //LCD12864使能控制端
#define LCD_Data P2                          //LCD12864数据端口
#define Busy    0x80                         //用于检测LCD状态字中的Busy标识
//******************************************************************************
//***************************【LCD12864相关功能】*******************************
//******************************************************************************
//【LCD12864忙检测函数】
void CheckBusy(void)
{
LCD_RS=0;                                   //RS置低电平
LCD_RW=1;                                   //RW置高电平
LCD_E=1;                                    //E置高电平
LCD_Data=0xff;
while((LCD_Data&0x80)==0x80);
LCD_E=0;                                    //E置低电平
Delay(50);                                 //延时一点时间
}

//【向LCD12864写数据】
void WriteDataLCD(u8 WDLCD)
{
  CheckBusy();                               //检测忙
  LCD_RS = 1;                                //RS为高电平,DB7----DB0为数据      
  LCD_RW = 0;                                //RW为低电平,E从高电平到低电平,则是把DB7----DB0的数据写到DR或者IR
  LCD_E = 1;
  LCD_Data = WDLCD;                          //传送数据WDLCD
  Delay(50);                                //延时一点时间
  LCD_E = 0;                                 //E低电平
  Delay(50);                                //延时一点时间
}

//【向LCD12864写指令】
void WriteCommandLCD(u8 WCLCD)               //BuysC为0时忽略忙检测
{
  CheckBusy();                               //检测忙
  LCD_RS = 0;                                //RS为低,DB7----DB0为指令
  LCD_RW = 0;                                //RW为低,E从高电平到低电平,则是把DB7----DB0的数据写到DR或者IR
  LCD_E = 1;
  LCD_Data = WCLCD;                          //传送数据
  Delay(50);
  LCD_E = 0;                                 //E低电平
  Delay(50);
}

//【LCD12864初始化】

void LCDInit(void)
{
  WriteCommandLCD(0x30);                     //显示模式设置,开始要求每次检测忙信号
        Delay(40);                               //延时一点时间
  WriteCommandLCD(0x01);                     //显示清屏
        Delay(40);                               //延时一点时间
  WriteCommandLCD(0x06);                     // 显示光标移动设置
        Delay(40);                               //延时一点时间
  WriteCommandLCD(0x0C);                     // 显示开,无游标,不反白
        Delay(40);                               //延时一点时间
}

//【LCD12864清屏】
void LCDClear(void)
{
  WriteCommandLCD(0x01);                     //显示清屏
        Delay(100);                               //延时一点时间
}

//【向LCD12864发送一个字符串】
void LCDSendWord(u8 *p)                      //向LCD发送一个字符串,
{
while(*p>0)                                 //比如void LCDSendWord('你好');就是让LCD显示"你好"
{
  WriteDataLCD(*p);                          //横向字符自动加   
  p++;
}
}

//【向LCD12864写数据或者指令】
void LCDTestWord(bit i,u8 word)
{
if(i==0)                                    
{
  WriteCommandLCD(word);                     //如果i=0;则写入指令
}
else
{
  WriteDataLCD(word);                        //如果i=1;则写入数据  
}
}

//******************************************************************************
//【名称:128*64图片显示函数 ,图片取模值放到数组gImage_gxw】
//******************************************************************************
void DisplayImage(u8 code *DData)
{
    u8 x,y,i;                                //定义x,y,i三个变量
    u16 tmp=0;                               //定义一个16位变量
    for(i=0;i<9;)                            //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
    {
    for(x=0;x<32;x++)                        //32行
    {
    WriteCommandLCD(0x34);                   //关闭绘图功能
    WriteCommandLCD((u8)(0x80+x));           //列地址
    WriteCommandLCD((u8)(0x80+i));           //行地址,下半屏,即第三行地址0X88
    WriteCommandLCD(0x30);                                                 //正常显示功能
    for(y=0;y<16;y++)   
    WriteDataLCD(DData[tmp+y]);              //读取数据写入LCD
    tmp+=16;        
    }
    i+=8;
    }
    WriteCommandLCD(0x36);                   //扩充功能设定(打开绘图功能)
    WriteCommandLCD(0x30);                   //正常显示功能
    Delay(50);               
}
//******************************************************************************
//【名称:128*64显示百分比进度条】
//******************************************************************************


回复

使用道具 举报

ID:69038 发表于 2025-3-30 09:47 | 显示全部楼层
给你一段代码参考一下,这个是TFT上用的:
  1. //小进度条
  2. #define pb_x 10   // 进度条x坐标
  3. #define pb_y 115  // 进度条y坐标
  4. #define pb_w 206  // 进度条左右尺寸,3+3+200,核心长200
  5. #define pb_h 12   // 进度条上下尺寸,3+3+6,  核心高6
  6. #define pb_bc RED // 进度条框色
  7. #define pb_fc BLUE// 进度条芯色


  8. void  rst_Progress_bar() //重置小进度条@固定位置
  9. {
  10.        
  11. save_color();                                              //保存大环境的前景、背景色
  12.         POINT_COLOR =pb_fc;                               //重设前景色
  13.         BACK_COLOR=pb_bc;                                 //重设背景色
  14. LCD_Fill(0,pb_y-1,240,pb_y+pb_h+1,GREEN);  //清除进度条所在位置的颜色
  15. LCD_DrawRectangle(pb_x, pb_y, pb_x+pb_w+6, pb_y+pb_h);            //进度条外框
  16. LCD_DrawRectangle(pb_x+1, pb_y+1, pb_x+pb_w+5, pb_y+pb_h-1); //进度条外框
  17. recall_color();   //回调大环境的前景、背景色
  18.        
  19. }
  20. void  set_Progress_bar(u8 value) //设小进度条当前值@固定位置
  21. {

  22. save_color();
  23.         POINT_COLOR =pb_fc;
  24.         BACK_COLOR=pb_bc;
  25. LCD_DrawLine(pb_x+4+value, pb_y+3, pb_x+4+value, pb_y+pb_h-2);  //画进度条内核
  26. recall_color();
  27. }
复制代码



回复

使用道具 举报

ID:61140 发表于 2025-4-1 09:28 | 显示全部楼层
zhuls 发表于 2025-3-30 09:47
给你一段代码参考一下,这个是TFT上用的:

TFT和这个工作原理不一样,况且我也不会改。
回复

使用道具 举报

ID:69038 发表于 2025-4-1 11:22 | 显示全部楼层
xiaoyuxinke 发表于 2025-4-1 09:28
TFT和这个工作原理不一样,况且我也不会改。

工作原理是不一样,但进度条的原理相差无几。
如果改不了代码,就只能等待,等待有人刚好有相似的项目,并且愿意分享,然后把代码发上来了。
回复

使用道具 举报

ID:584814 发表于 2025-4-1 21:27 | 显示全部楼层
这玩易貌似没啥工作原理,好像就是根据百分比大小画方块长短吧。
回复

使用道具 举报

ID:320097 发表于 2025-4-4 21:21 | 显示全部楼层
这不就是一个简单的绘图么,计算你需要的坐标和内容就可以了,不过带7920那种字库的屏幕好像只能满屏绘图,不能在某一个位置单独绘
回复

使用道具 举报

ID:61140 发表于 2025-4-5 21:07 | 显示全部楼层
欧阳云天 发表于 2025-4-4 21:21
这不就是一个简单的绘图么,计算你需要的坐标和内容就可以了,不过带7920那种字库的屏幕好像只能满屏绘图, ...

正确,确实是这样的,所以一直犯愁
回复

使用道具 举报

ID:69038 发表于 2025-4-5 22:50 | 显示全部楼层
谁说不能指定位置指定大小绘图?
ST7920可以字符模式和绘图模式任意切换,图文混合随心所欲。。
本坛有很多7920的时钟、万年厉的代码,里边都有相关的案例,你可以搜一下。
回复

使用道具 举报

ID:879348 发表于 2025-4-7 09:03 | 显示全部楼层
拿现成是不可能的,思路是单片机开辟一个RAM,然后再刷新屏幕,操作这个RAM比直接操作屏幕方便一点
回复

使用道具 举报

ID:275826 发表于 2025-4-7 14:45 | 显示全部楼层
欧阳云天 发表于 2025-4-4 21:21
这不就是一个简单的绘图么,计算你需要的坐标和内容就可以了,不过带7920那种字库的屏幕好像只能满屏绘图, ...

可以画点,线等任意图形,进度条就是画竖线呀,很简单的
回复

使用道具 举报

ID:743654 发表于 2025-4-8 08:36 | 显示全部楼层
进度条实际就是画线,历程一般都有哈
回复

使用道具 举报

ID:828160 发表于 2025-4-8 12:25 | 显示全部楼层
很简单的,控制字符反色显示
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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