找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 742|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

求大神幫忙搞個(gè)LCD12864顯示進(jìn)度條

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:61140 發(fā)表于 2025-3-29 20:48 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
因?yàn)橐獙W(xué)習(xí)LCD12864,想弄個(gè)初始百分比進(jìn)度條顯示,想三天也沒搞明白
在此求教大神了

這里是我的原程序,
直接在本程序后面再弄個(gè)子函數(shù)方便調(diào)用即可,在此謝謝各位大神。!


//******************************************************************************
#include "hong.h"
void   Delay(u8 us);                         //定義微秒程序
void   DelayMs(u16 ms);                      //定義毫秒程序
void   WriteDataLCD(u8 WDLCD);               //給LCD12864寫數(shù)據(jù)
void   WriteCommandLCD(u8 WCLCD);            //給LCD12864寫指令
void   LCDInit(void);                        //LCD12864初始化
void   LCDClear(void);                       //LCD12864清屏
void   CheckBusy(void);                      //忙檢測
void   LCDSendWord(u8 *p);                   //向LCD發(fā)送一個(gè)字符串
void   DisplayImage(u8 code *DData);         //顯示一幅128*64圖片程序
void   LCDTestWord(bit i,u8 word);           //向LCD寫數(shù)據(jù)或指令
//******************************************************************************
sbit    LCD_RS = P4^5;                       //高電平數(shù)據(jù)低電平指令
sbit    LCD_RW = P4^2;                       //高電平讀低電平寫
sbit    LCD_E  = P4^4;                       //LCD12864使能控制端
#define LCD_Data P2                          //LCD12864數(shù)據(jù)端口
#define Busy    0x80                         //用于檢測LCD狀態(tài)字中的Busy標(biāo)識(shí)
//******************************************************************************
//***************************【LCD12864相關(guān)功能】*******************************
//******************************************************************************
//【LCD12864忙檢測函數(shù)】
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);                                 //延時(shí)一點(diǎn)時(shí)間
}

//【向LCD12864寫數(shù)據(jù)】
void WriteDataLCD(u8 WDLCD)
{
  CheckBusy();                               //檢測忙
  LCD_RS = 1;                                //RS為高電平,DB7----DB0為數(shù)據(jù)      
  LCD_RW = 0;                                //RW為低電平,E從高電平到低電平,則是把DB7----DB0的數(shù)據(jù)寫到DR或者IR
  LCD_E = 1;
  LCD_Data = WDLCD;                          //傳送數(shù)據(jù)WDLCD
  Delay(50);                                //延時(shí)一點(diǎn)時(shí)間
  LCD_E = 0;                                 //E低電平
  Delay(50);                                //延時(shí)一點(diǎn)時(shí)間
}

//【向LCD12864寫指令】
void WriteCommandLCD(u8 WCLCD)               //BuysC為0時(shí)忽略忙檢測
{
  CheckBusy();                               //檢測忙
  LCD_RS = 0;                                //RS為低,DB7----DB0為指令
  LCD_RW = 0;                                //RW為低,E從高電平到低電平,則是把DB7----DB0的數(shù)據(jù)寫到DR或者IR
  LCD_E = 1;
  LCD_Data = WCLCD;                          //傳送數(shù)據(jù)
  Delay(50);
  LCD_E = 0;                                 //E低電平
  Delay(50);
}

//【LCD12864初始化】

void LCDInit(void)
{
  WriteCommandLCD(0x30);                     //顯示模式設(shè)置,開始要求每次檢測忙信號(hào)
        Delay(40);                               //延時(shí)一點(diǎn)時(shí)間
  WriteCommandLCD(0x01);                     //顯示清屏
        Delay(40);                               //延時(shí)一點(diǎn)時(shí)間
  WriteCommandLCD(0x06);                     // 顯示光標(biāo)移動(dòng)設(shè)置
        Delay(40);                               //延時(shí)一點(diǎn)時(shí)間
  WriteCommandLCD(0x0C);                     // 顯示開,無游標(biāo),不反白
        Delay(40);                               //延時(shí)一點(diǎn)時(shí)間
}

//【LCD12864清屏】
void LCDClear(void)
{
  WriteCommandLCD(0x01);                     //顯示清屏
        Delay(100);                               //延時(shí)一點(diǎn)時(shí)間
}

//【向LCD12864發(fā)送一個(gè)字符串】
void LCDSendWord(u8 *p)                      //向LCD發(fā)送一個(gè)字符串,
{
while(*p>0)                                 //比如void LCDSendWord('你好');就是讓LCD顯示"你好"
{
  WriteDataLCD(*p);                          //橫向字符自動(dòng)加   
  p++;
}
}

//【向LCD12864寫數(shù)據(jù)或者指令】
void LCDTestWord(bit i,u8 word)
{
if(i==0)                                    
{
  WriteCommandLCD(word);                     //如果i=0;則寫入指令
}
else
{
  WriteDataLCD(word);                        //如果i=1;則寫入數(shù)據(jù)  
}
}

//******************************************************************************
//【名稱:128*64圖片顯示函數(shù) ,圖片取模值放到數(shù)組gImage_gxw】
//******************************************************************************
void DisplayImage(u8 code *DData)
{
    u8 x,y,i;                                //定義x,y,i三個(gè)變量
    u16 tmp=0;                               //定義一個(gè)16位變量
    for(i=0;i<9;)                            //分兩屏,上半屏和下半屏,因?yàn)槠鹗嫉刂凡煌,需要分開
    {
    for(x=0;x<32;x++)                        //32行
    {
    WriteCommandLCD(0x34);                   //關(guān)閉繪圖功能
    WriteCommandLCD((u8)(0x80+x));           //列地址
    WriteCommandLCD((u8)(0x80+i));           //行地址,下半屏,即第三行地址0X88
    WriteCommandLCD(0x30);                                                 //正常顯示功能
    for(y=0;y<16;y++)   
    WriteDataLCD(DData[tmp+y]);              //讀取數(shù)據(jù)寫入LCD
    tmp+=16;        
    }
    i+=8;
    }
    WriteCommandLCD(0x36);                   //擴(kuò)充功能設(shè)定(打開繪圖功能)
    WriteCommandLCD(0x30);                   //正常顯示功能
    Delay(50);               
}
//******************************************************************************
//【名稱:128*64顯示百分比進(jìn)度條】
//******************************************************************************


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

使用道具 舉報(bào)

沙發(fā)
ID:69038 發(fā)表于 2025-3-30 09:47 | 只看該作者
給你一段代碼參考一下,這個(gè)是TFT上用的:
  1. //小進(jìn)度條
  2. #define pb_x 10   // 進(jìn)度條x坐標(biāo)
  3. #define pb_y 115  // 進(jìn)度條y坐標(biāo)
  4. #define pb_w 206  // 進(jìn)度條左右尺寸,3+3+200,核心長200
  5. #define pb_h 12   // 進(jìn)度條上下尺寸,3+3+6,  核心高6
  6. #define pb_bc RED // 進(jìn)度條框色
  7. #define pb_fc BLUE// 進(jìn)度條芯色


  8. void  rst_Progress_bar() //重置小進(jìn)度條@固定位置
  9. {
  10.        
  11. save_color();                                              //保存大環(huán)境的前景、背景色
  12.         POINT_COLOR =pb_fc;                               //重設(shè)前景色
  13.         BACK_COLOR=pb_bc;                                 //重設(shè)背景色
  14. LCD_Fill(0,pb_y-1,240,pb_y+pb_h+1,GREEN);  //清除進(jìn)度條所在位置的顏色
  15. LCD_DrawRectangle(pb_x, pb_y, pb_x+pb_w+6, pb_y+pb_h);            //進(jìn)度條外框
  16. LCD_DrawRectangle(pb_x+1, pb_y+1, pb_x+pb_w+5, pb_y+pb_h-1); //進(jìn)度條外框
  17. recall_color();   //回調(diào)大環(huán)境的前景、背景色
  18.        
  19. }
  20. void  set_Progress_bar(u8 value) //設(shè)小進(jìn)度條當(dāng)前值@固定位置
  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);  //畫進(jìn)度條內(nèi)核
  26. recall_color();
  27. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

板凳
ID:61140 發(fā)表于 2025-4-1 09:28 | 只看該作者
zhuls 發(fā)表于 2025-3-30 09:47
給你一段代碼參考一下,這個(gè)是TFT上用的:

TFT和這個(gè)工作原理不一樣,況且我也不會(huì)改。
回復(fù)

使用道具 舉報(bào)

地板
ID:69038 發(fā)表于 2025-4-1 11:22 | 只看該作者
xiaoyuxinke 發(fā)表于 2025-4-1 09:28
TFT和這個(gè)工作原理不一樣,況且我也不會(huì)改。

工作原理是不一樣,但進(jìn)度條的原理相差無幾。
如果改不了代碼,就只能等待,等待有人剛好有相似的項(xiàng)目,并且愿意分享,然后把代碼發(fā)上來了。
回復(fù)

使用道具 舉報(bào)

5#
ID:584814 發(fā)表于 2025-4-1 21:27 | 只看該作者
這玩易貌似沒啥工作原理,好像就是根據(jù)百分比大小畫方塊長短吧。
回復(fù)

使用道具 舉報(bào)

6#
ID:320097 發(fā)表于 2025-4-4 21:21 | 只看該作者
這不就是一個(gè)簡單的繪圖么,計(jì)算你需要的坐標(biāo)和內(nèi)容就可以了,不過帶7920那種字庫的屏幕好像只能滿屏繪圖,不能在某一個(gè)位置單獨(dú)繪
回復(fù)

使用道具 舉報(bào)

7#
ID:61140 發(fā)表于 2025-4-5 21:07 | 只看該作者
歐陽云天 發(fā)表于 2025-4-4 21:21
這不就是一個(gè)簡單的繪圖么,計(jì)算你需要的坐標(biāo)和內(nèi)容就可以了,不過帶7920那種字庫的屏幕好像只能滿屏繪圖, ...

正確,確實(shí)是這樣的,所以一直犯愁
回復(fù)

使用道具 舉報(bào)

8#
ID:69038 發(fā)表于 2025-4-5 22:50 | 只看該作者
誰說不能指定位置指定大小繪圖?
ST7920可以字符模式和繪圖模式任意切換,圖文混合隨心所欲。。
本壇有很多7920的時(shí)鐘、萬年厲的代碼,里邊都有相關(guān)的案例,你可以搜一下。
回復(fù)

使用道具 舉報(bào)

9#
ID:879348 發(fā)表于 2025-4-7 09:03 | 只看該作者
拿現(xiàn)成是不可能的,思路是單片機(jī)開辟一個(gè)RAM,然后再刷新屏幕,操作這個(gè)RAM比直接操作屏幕方便一點(diǎn)
回復(fù)

使用道具 舉報(bào)

10#
ID:275826 發(fā)表于 2025-4-7 14:45 | 只看該作者
歐陽云天 發(fā)表于 2025-4-4 21:21
這不就是一個(gè)簡單的繪圖么,計(jì)算你需要的坐標(biāo)和內(nèi)容就可以了,不過帶7920那種字庫的屏幕好像只能滿屏繪圖, ...

可以畫點(diǎn),線等任意圖形,進(jìn)度條就是畫豎線呀,很簡單的
回復(fù)

使用道具 舉報(bào)

11#
ID:743654 發(fā)表于 2025-4-8 08:36 | 只看該作者
進(jìn)度條實(shí)際就是畫線,歷程一般都有哈
回復(fù)

使用道具 舉報(bào)

12#
ID:828160 發(fā)表于 2025-4-8 12:25 | 只看該作者
很簡單的,控制字符反色顯示
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表