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

QQ登錄

只需一步,快速開始

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

stc8h的LCM接口6800與oled12864的6800信號(hào)對(duì)不上

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:526108 發(fā)表于 2023-1-5 12:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式


這里的RS信號(hào)就是DC信號(hào)嗎?

這個(gè)信號(hào)的電平對(duì)不上?

希望能提供一份實(shí)例程序,謝謝
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1034262 發(fā)表于 2023-1-5 16:59 | 只看該作者
6800的RS信號(hào)就是OLED的D/C信號(hào),對(duì)得上啊,RS=L為命令,RS=H為數(shù)據(jù),D/C=L為命令,D/C=H為數(shù)據(jù).

不知道樓主為什么覺得對(duì)不上?
回復(fù)

使用道具 舉報(bào)

板凳
ID:155507 發(fā)表于 2023-1-5 17:42 | 只看該作者
D/C#  就是 指令和數(shù)據(jù)  D 是 DATA 數(shù)據(jù)   C 就是 COMMAND 指令

void oled_wcmd(unsigned char cmd)
{
        rs = 0;
        rw = 0;
        en = 0;

        P0 = cmd;

        en = 1;
        delay(5);
        en = 0;
}

回復(fù)

使用道具 舉報(bào)

地板
ID:1042619 發(fā)表于 2023-1-10 10:47 | 只看該作者
/*************  功能說明    **************

本例程基于STC8H8K64U為主控芯片的實(shí)驗(yàn)箱9.5進(jìn)行編寫測(cè)試,STC8H系列帶DMA模塊的芯片可通用參考.

9.5之前實(shí)驗(yàn)箱版本,12864模塊接口,P4.2與P4.4接口需要進(jìn)行調(diào)換才能使用硬件LCM接口通信.

LCM接口驅(qū)動(dòng)液晶屏程序

8bit M6800模式, P6口接D0~D7

sbit LCD_RS = P4^5;      //數(shù)據(jù)/命令切換
sbit LCD_RW = P4^2;      //讀寫控制
sbit LCD_E = P4^4;       //使能
sbit LCD_RESET = P3^4;   //復(fù)位

LCM指令通過中斷方式等待發(fā)送完成

DMA設(shè)置長(zhǎng)度16字節(jié),通過中斷方式判斷傳輸完成

設(shè)置時(shí)鐘 1.2MHz (128*64屏, ST7920驅(qū)動(dòng), 速度太快顯示會(huì)不正常).

******************************************/

#include "..\..\comm\STC8H.h"
#include "stdio.h"
#include "intrins.h"
#include "LCD_IMG.h"

#define     MAIN_Fosc       12000000L   //定義計(jì)算時(shí)鐘參數(shù)

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;

sbit LCD_RS = P4^5;      //數(shù)據(jù)/命令切換
sbit LCD_RW = P4^2;      //讀寫控制
sbit LCD_E = P4^4;       //使能
//sbit LCD_PSB = P3^5;     //PSB腳為12864的串、并通訊功能切換,我們使用8位并行接口,PSB=1
sbit LCD_RESET = P3^4;   //復(fù)位


//IO連接
#define  LCD_DataPort P6     //8位數(shù)據(jù)口

#define  USR_LCM_IF     1                        //1: use LCM Interface

u16 index;
bit DmaFlag=0;
bit LcmFlag=0;

u8  code uctech[] = {"11111111111  "};
u8  code net[]    = {" 111111111111 "};
u8  code mcu[]    = {"111111111111"};
u8  code qq[]     = {" 111111111111  "};

void delay_ms(u16 ms);
void GPIO_Init(void);
void LCM_Config(void);
void DMA_Config(void);
void LCD_Init(void);
void DisplayImage (u8 *DData);
void DisplayListChar(u8 X, u8 Y, u8 code *DData);
void Write_Cmd(unsigned char WCLCD,unsigned char BuysC);
void Write_Data(unsigned char WDLCD);
void LCDClear(void);

void main(void)
{
        P_SW2 |= 0x80;  //擴(kuò)展寄存器(XFR)訪問使能

        P0M1 = 0;   P0M0 = 0;   //設(shè)置為準(zhǔn)雙向口
        P1M1 = 0;   P1M0 = 0;   //設(shè)置為準(zhǔn)雙向口
        P2M1 = 0;   P2M0 = 0;   //設(shè)置為準(zhǔn)雙向口
        P3M1 = 0;   P3M0 = 0;   //設(shè)置為準(zhǔn)雙向口
        P4M1 = 0;   P4M0 = 0;   //設(shè)置為準(zhǔn)雙向口
        P5M1 = 0;   P5M0 = 0;   //設(shè)置為準(zhǔn)雙向口
        P6M1 = 0;   P6M0 = 0;   //設(shè)置為準(zhǔn)雙向口
        P7M1 = 0;   P7M0 = 0;   //設(shè)置為準(zhǔn)雙向口

        GPIO_Init();
#if USR_LCM_IF == 1        
        LCM_Config();
        DMA_Config();
        EA = 1;
#endif
        
//        delay_ms(100); //啟動(dòng)等待,等LCD進(jìn)入工作狀態(tài)
        LCD_Init(); //LCM初始化

        while(1)
        {
                LCDClear();
                DisplayImage(gImage_gxw);
                delay_ms(200);
                LCDClear();
                DisplayListChar(0,1,uctech);    //顯示字庫中的中文數(shù)字
                DisplayListChar(0,2,net);       //顯示字庫中的中文數(shù)字
                DisplayListChar(0,3,mcu);       //顯示字庫中的中文
                DisplayListChar(0,4,qq);        //顯示字庫中的中文數(shù)字
                delay_ms(200);
        }
}

//按指定位置顯示一串字符
void DisplayListChar(u8 X, u8 Y, u8 code *DData)
{
    u8 ListLength,X2;
    ListLength = 0;
    X2 = X;
    if(Y < 1)   Y=1;
    if(Y > 4)   Y=4;
    X &= 0x0F; //限制X不能大于16,Y在1-4之內(nèi)
    switch(Y)
    {
        case 1: X2 |= 0X80; break;  //根據(jù)行數(shù)來選擇相應(yīng)地址
        case 2: X2 |= 0X90; break;
        case 3: X2 |= 0X88; break;
        case 4: X2 |= 0X98; break;
    }
    Write_Cmd(X2, 1); //發(fā)送地址碼
    while (DData[ListLength] >= 0x20) //若到達(dá)字串尾則退出
    {
        if (X <= 0x0F) //X坐標(biāo)應(yīng)小于0xF
        {
            Write_Data(DData[ListLength]); //
            ListLength++;
            X++;
        }
    }
}

//圖形顯示122*32
void DisplayImage (u8 *DData)
{
#if USR_LCM_IF == 0
    u8 y;
#endif
    u8 x,i;
    unsigned int tmp=0;
        
    for(i=0;i<9;)       //分兩屏,上半屏和下半屏,因?yàn)槠鹗嫉刂凡煌枰珠_
    {
        for(x=0;x<32;x++)   //32行
        {
            Write_Cmd(0x34,1);
            Write_Cmd((u8)(0x80+x),1);    //列地址
            Write_Cmd((u8)(0x80+i),1);    //行地址,下半屏,即第三行地址0X88
            Write_Cmd(0x30,1);
                                       
#if USR_LCM_IF == 1

            DMA_LCM_TXAH = (u8)((u16)&DData[tmp] >> 8);
            DMA_LCM_TXAL = (u8)((u16)&DData[tmp]);
            while(DmaFlag);
            DmaFlag = 1;
            DMA_LCM_CR = 0xa0;        //Write data

#else
        
            for(y=0;y<16;y++)
                Write_Data(DData[tmp+y]);//讀取數(shù)據(jù)寫入LCD
        
#endif
            tmp+=16;
        }
        i+=8;
    }
    Write_Cmd(0x36,1);    //擴(kuò)充功能設(shè)定
    Write_Cmd(0x30,1);
}

//========================================================================
// 函數(shù): void delay_ms(u16 ms)
// 描述: 延時(shí)函數(shù)。
// 參數(shù): ms,要延時(shí)的ms數(shù), 自動(dòng)適應(yīng)主時(shí)鐘.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 備注:
//========================================================================
void delay_ms(u16 ms)
{
         u16 i;
         do{
                        i = MAIN_Fosc / 10000;
                        while(--i);
         }while(--ms);
}

void LCD_delay(void)
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}

//讀狀態(tài)
void ReadStatusLCD(void)
{
//#if USR_LCM_IF == 1
//        
//        LcmFlag = 1;
//        LCMIFCR = 0x86;                //Enable interface, Read command
//        while(LcmFlag);
//        
//#else
        
        LCD_DataPort = 0xFF;
  //P6口設(shè)置成輸入口
        P6M0=0x00;
        P6M1=0xFF;

        LCD_RS = 0;
        LCD_RW = 1;
        LCD_delay();
        LCD_E = 1;
        LCD_delay();
        while (LCD_DataPort & 0x80); //檢測(cè)忙信號(hào)
        LCD_E = 0;

  //P6口設(shè)置成推挽輸出
        P6M0=0xFF;
        P6M1=0x00;
        LCD_DataPort = 0xFF; //拉高P6
        
//#endif
}

void Write_Cmd(unsigned char WCLCD,unsigned char BuysC)
{
#if USR_LCM_IF == 1
        
        if (BuysC) ReadStatusLCD(); //根據(jù)需要檢測(cè)忙
        LCMIFDATL = WCLCD;
        LcmFlag = 1;
        LCMIFCR = 0x84;                //Enable interface, write command out
        while(LcmFlag);
        
#else
        
        if (BuysC) ReadStatusLCD(); //根據(jù)需要檢測(cè)忙
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_DataPort = WCLCD;
        LCD_delay();
        LCD_E = 1;
        LCD_delay();
        LCD_E = 0;  
        
#endif
}

void Write_Data(unsigned char WDLCD)
{
#if USR_LCM_IF == 1
        
        LCMIFDATL = WDLCD;
        LcmFlag = 1;
        LCMIFCR = 0x85;                //Enable interface, write data out
        while(LcmFlag);
        
#else
        
        ReadStatusLCD(); //檢測(cè)忙
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_DataPort = WDLCD;
        LCD_delay();
        LCD_E = 1;
        LCD_delay();
        LCD_E = 0;
        
#endif
}

/*****************************************************************************
* @name       :void GPIO_Init(void)
* @date       :2018-11-13
* @function   :Set the gpio to push-pull mode
* @parameters :None
* @retvalue   :None
******************************************************************************/        
void GPIO_Init(void)
{
  //P6口設(shè)置成推挽輸出
        P6M0=0xff;
        P6M1=0x00;

        //P3.4口設(shè)置成推挽輸出
        P3M0=0x10;
        P3M1=0x00;

        //P4.2,P4.4,P4.5口設(shè)置成推挽輸出
        P4M0=0x34;
        P4M1=0x00;
}

/*****************************************************************************
* @name       :void LCM_Config(void)
* @date       :2018-11-13
* @function   :Config LCM
* @parameters :None
* @retvalue   :None
******************************************************************************/        
void LCM_Config(void)
{
        LCMIFCFG = 0x85;   //bit7 1:Enable Interrupt, bit1 0:8bit mode; bit0 0:8080,1:6800, Data port P6
        LCMIFCFG2 = 0x1f;  //RS:P45,RD:P44,WR:P42; Setup Time,HOLD Time
        LCMIFSTA = 0x00;
}

/*****************************************************************************
* @name       :void DMA_Config(void)
* @date       :2020-12-09
* @function   :Config DMA
* @parameters :None
* @retvalue   :None
******************************************************************************/        
void DMA_Config(void)
{
        DMA_LCM_AMT = 0x0f;                //設(shè)置傳輸總字節(jié)數(shù):n+1
        DMA_LCM_TXAH = (u8)((u16)&gImage_gxw >> 8);
        DMA_LCM_TXAL = (u8)((u16)&gImage_gxw);
        DMA_LCM_STA = 0x00;
        DMA_LCM_CFG = 0x82;
        DMA_LCM_CR = 0x80;
}

/*****************************************************************************
* @name       :void LCDReset(void)
* @date       :2018-08-09
* @function   :Reset LCD screen
* @parameters :None
* @retvalue   :None
******************************************************************************/        
void LCDReset(void)
{
//        LCD_PSB = 1;    //并口
        delay_ms(10);
        LCD_RESET = 0;
        delay_ms(10);
        LCD_RESET = 1;
        delay_ms(100);
}

/*****************************************************************************
* @name       :void LCD_Init(void)
* @date       :2018-08-09
* @function   :Initialization LCD screen
* @parameters :None
* @retvalue   :None
******************************************************************************/                  
void LCD_Init(void)
{
        LCDReset(); //初始化之前復(fù)位
//*************LCD 初始化**********//        
        Write_Cmd(0x30,1); //顯示模式設(shè)置,開始要求每次檢測(cè)忙信號(hào)
        Write_Cmd(0x01,1); //顯示清屏
        Write_Cmd(0x06,1); // 顯示光標(biāo)移動(dòng)設(shè)置
        Write_Cmd(0x0C,1); // 顯示開及光標(biāo)設(shè)置
}

void LCDClear(void) //清屏
{
        Write_Cmd(0x01,1); //顯示清屏
        Write_Cmd(0x34,1); // 顯示光標(biāo)移動(dòng)設(shè)置
        Write_Cmd(0x30,1); // 顯示開及光標(biāo)設(shè)置
}

/*****************************************************************************
* @name       :void LCM_Interrupt(void)
* @date       :2018-11-13
* @function   :None
* @parameters :None
* @retvalue   :
******************************************************************************/
void LCMIF_DMA_Interrupt(void) interrupt 13
{
        if(LCMIFSTA & 0x01)
        {
                LCMIFSTA = 0x00;
                LcmFlag = 0;
        }
        
        if(DMA_LCM_STA & 0x01)
        {
                DmaFlag = 0;
                DMA_LCM_CR = 0;
                DMA_LCM_STA = 0;
        }
}


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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