久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

PIC單片機(jī)驅(qū)動(dòng)LCD問題,按住PIC單片機(jī)的復(fù)位鍵(MCLR 復(fù)位)ST7789V才有顯示

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

單片機(jī)型號:PIC16F1508
LCD驅(qū)動(dòng)芯片:ST7789V
問題點(diǎn):用PIC單片機(jī)SPI控制LCD(ST7789V),用示波器測量SPI波形是符合ST7789V的時(shí)序要求的,但是PIC和LCD連接后,LCD沒有任何顯示。按住PIC單片機(jī)的復(fù)位鍵(MCLR 復(fù)位),LCD有顯示。
想咨詢下各位高手,哪里出問題了?
示波器波形:
1號探頭:SCK時(shí)鐘
2號探頭:SDO,示波器測試時(shí)數(shù)據(jù)是0x33
3號探頭:CS片選
4號探頭:不用在意,隨便接了一個(gè)

源代碼如下:

/******************************************************************************
  PIC側(cè)                      LCD側(cè)

  PIC                       LCD
  RC7(SDO)                  SDI(P13)
  RB6(SCK)                  SCK(P10)
  RC0                       RESET(P15)
  RC1                       WR(P11)
  RC2                       CS(P9)
******************************************************************************/
#include <xc.h>

//-------------------------------CONFIG1設(shè)置--------------------------------//
#pragma config FOSC = INTOSC    // 內(nèi)部振蕩器
#pragma config WDTE = OFF       // 看門狗器關(guān)
#pragma config PWRTE = OFF      // 上電延時(shí)關(guān)
#pragma config MCLRE = ON       // MCLR使能,弱上拉
#pragma config CP = OFF         // 代碼保護(hù)關(guān)
#pragma config BOREN = OFF      // 欠壓復(fù)位關(guān)
#pragma config CLKOUTEN = OFF   // 時(shí)鐘輸出關(guān)
#pragma config IESO = OFF       // 內(nèi)/外部切換關(guān)
#pragma config FCMEN = ON       // 故障保護(hù)開

//-------------------------------CONFIG2設(shè)置--------------------------------//
#pragma config WRT = OFF        // 閃存保護(hù)關(guān)
#pragma config STVREN = ON      // 堆棧溢出復(fù)位
#pragma config BORV = LO        // 欠壓復(fù)位電壓選擇低跳變點(diǎn)
#pragma config LPBOR = OFF      // 低功耗欠壓復(fù)位關(guān)
#pragma config LVP = OFF        // 高電壓編程

//-------------------------------振蕩器設(shè)置---------------------------------//
//#pragma osccon = 0x6A           //4MHz內(nèi)部振蕩器,指令周期1us
//#define _XTAL_FREQ 4000000      //振蕩器頻率4MHz
#pragma osccon = 0x3A           //500KHz內(nèi)部振蕩器
#define _XTAL_FREQ 500000      //振蕩器頻率500KHz
//#pragma osccon = 0x7A           //16MHz內(nèi)部振蕩器
//#define _XTAL_FREQ 16000000      //振蕩器頻率16MHz
//-------------------------------引腳定義---------------------------------//
unsigned char LCD_SDI;
#define LCD_SDI RC7
unsigned char LCD_SCK;
#define LCD_SCK RB6
unsigned char LCD_RESET;
#define LCD_RESET RC0
unsigned char LCD_WR;
#define LCD_WR RC1
unsigned char LCD_CS;
#define LCD_CS RC2

//-------------------------------顏色定義---------------------------------//
#define     RED          0XF800          //紅色
#define     GREEN        0X07E0          //綠色
#define     BLUE         0X001F          //藍(lán)色
#define     WHITE        0XFFFF          //白色

/******************************************************************************
      函數(shù)說明:IO初始化函數(shù)
      入口數(shù)據(jù):無
      返回值:  無
******************************************************************************/
void Initial_IO()
{
  INTCON=0x00;                  //禁止所有中斷

  OPTION_REG=0x00;              //使能弱上拉

  TRISA=0x3F;                   //RA0-RA5設(shè)置為輸入
  PORTA=0x3F;                   //RA0-RA5高電平
  ANSELA=0x00;                  //RA0-RA2、RA4設(shè)置為數(shù)字I/O
  WPUA=0x3F;                    //RA0-RA5使能上拉

  TRISB=0xB0;                   //RB4、RB5、RB7設(shè)置為輸入,RB6(SCK)設(shè)置為輸出
  PORTB=0xF0;                   //RB4-RB7高電平
  ANSELB=0x00;                  //RB4-RB5設(shè)置為數(shù)字I/O
  WPUB=0xF0;                    //RB4-RB7使能上拉


  TRISC=0x00;                   //RC0-RC7設(shè)置為輸出
  PORTC=0xFF;                   //RC0-RC7高電平
  ANSELC=0x00;                  //RC0-RC3、RC6-RC7設(shè)置為數(shù)字I/O

}

/******************************************************************************
      函數(shù)說明:SPI初始化函數(shù)
      入口數(shù)據(jù):無
      返回值:  無
******************************************************************************/
void Initial_SPI()
{
    SSP1STAT=0xC0;             //CKE=1 時(shí)鐘狀態(tài)從有效轉(zhuǎn)換到空閑時(shí)發(fā)送
    SSP1CON1=0X30;            //主控方式,F(xiàn)osc/4,CKP=1空閑時(shí)鐘電平為高,SSPEN=1使能同步串行功能

//    SSP1STAT=0x80;             //CKE=0 時(shí)鐘狀態(tài)從空閑轉(zhuǎn)換到有效時(shí)發(fā)送
//    SSP1CON1=0X20;             //主控方式,F(xiàn)osc/4,CKP=0空閑時(shí)鐘電平為低,SSPEN=1使能同步串行功能

//    SSP1STAT=0x80;             //CKE=1 時(shí)鐘狀態(tài)從空閑轉(zhuǎn)換到有效時(shí)發(fā)送
//    SSP1CON1=0X30;            //主控方式,F(xiàn)osc/4,CKP=1空閑時(shí)鐘電平為高,SSPEN=1使能同步串行功能


}

/******************************************************************************
      函數(shù)說明:SPI發(fā)送函數(shù)
      入口數(shù)據(jù):unsigned char data
      返回值:  無
******************************************************************************/
void SPI_RW(unsigned char data)
{
        SSP1BUF = data;
    do
    {
        ;
    }
    while(!SSP1IF);         //等待產(chǎn)生SSP中斷,等待發(fā)送完成
    SSP1IF=0;
}

/******************************************************************************
      函數(shù)說明:LCD寫數(shù)據(jù)函數(shù)(8位)
      入口數(shù)據(jù):unsigned char val
      返回值:  無
******************************************************************************/
void LCD_WRITE_DATA(unsigned char val)
{
    LCD_RESET=1;
    LCD_WR=1;
    __delay_ms(1);
    LCD_CS=0;
        SPI_RW(val);
        LCD_CS=1;
}

/******************************************************************************
      函數(shù)說明:LCD寫數(shù)據(jù)函數(shù)(16位)
      入口數(shù)據(jù):unsigned int val
      返回值:  無
******************************************************************************/
void LCD_WRITE_16BIT_DATA(unsigned int val)
{
    LCD_RESET=1;
    LCD_WR=1;
    __delay_ms(1);
    LCD_CS=0;
        SPI_RW(val>>8);
        SPI_RW(val);
        LCD_CS=1;
}

/******************************************************************************
      函數(shù)說明:LCD寫指令函數(shù)
      入口數(shù)據(jù):unsigned char reg
      返回值:  無
******************************************************************************/
void LCD_WRITE_COMMAND(unsigned char reg)
{
    LCD_RESET=1;
    LCD_WR=0;
    __delay_ms(1);
    LCD_CS=0;
        SPI_RW(reg);
        LCD_CS=1;
}

/******************************************************************************
      函數(shù)說明:LCD初始化函數(shù)
      入口數(shù)據(jù):無
      返回值:  無
******************************************************************************/
void Initial_LCD()
{
    LCD_RESET=0;
        __delay_ms(100);
        LCD_RESET=1;
        __delay_ms(200);

        LCD_WRITE_COMMAND(0x11);        //喚醒
        __delay_ms(120);               

//--------------------------顯示和顏色格式設(shè)置-------------------------------//
        LCD_WRITE_COMMAND(0x36);    //內(nèi)存數(shù)據(jù)訪問控制(P215)
        LCD_WRITE_DATA(0x00);      
        LCD_WRITE_COMMAND(0x3A);    //接口像素格式
        LCD_WRITE_DATA(0x05);      
//-------------------------------幀速率設(shè)置----------------------------------//
        LCD_WRITE_COMMAND(0xB2);        //門廊控制
        LCD_WRITE_DATA(0x0C);
        LCD_WRITE_DATA(0x0C);
        LCD_WRITE_DATA(0x00);
        LCD_WRITE_DATA(0x33);
        LCD_WRITE_DATA(0x33);
        LCD_WRITE_COMMAND(0xB7);        //門控制
        LCD_WRITE_DATA(0x35);
//------------------------------電源設(shè)置-------------------------------------//
        LCD_WRITE_COMMAND(0xBB);        //VCOMS設(shè)置
        LCD_WRITE_DATA(0x28);
        LCD_WRITE_COMMAND(0xC0);        //LCM控制
        LCD_WRITE_DATA(0x2C);
        LCD_WRITE_COMMAND(0xC2);        //VDV和VRH命令使能
        LCD_WRITE_DATA(0x01);
        LCD_WRITE_COMMAND(0xC3);        //VRH設(shè)置
        LCD_WRITE_DATA(0x0B);
        LCD_WRITE_COMMAND(0xC4);        //VDV設(shè)置
        LCD_WRITE_DATA(0x20);
        LCD_WRITE_COMMAND(0xC6);        //正常模式下的幀速率控制
        LCD_WRITE_DATA(0x0F);
        LCD_WRITE_COMMAND(0xD0);        //電源控制1
        LCD_WRITE_DATA(0xA4);
        LCD_WRITE_DATA(0xA1);
//--------------------------------Gamma設(shè)置-----------------------------------//
        LCD_WRITE_COMMAND(0xE0);        //正電壓Gamma控制
        LCD_WRITE_DATA(0xD0);
        LCD_WRITE_DATA(0x01);
        LCD_WRITE_DATA(0x08);
        LCD_WRITE_DATA(0x0F);
        LCD_WRITE_DATA(0x11);
        LCD_WRITE_DATA(0x2A);
        LCD_WRITE_DATA(0x36);
        LCD_WRITE_DATA(0x55);
        LCD_WRITE_DATA(0x44);
        LCD_WRITE_DATA(0x3A);
        LCD_WRITE_DATA(0x0B);
        LCD_WRITE_DATA(0x06);
        LCD_WRITE_DATA(0x11);
        LCD_WRITE_DATA(0x20);
        
    LCD_WRITE_COMMAND(0xE1);        //負(fù)電壓Gamma控制
        LCD_WRITE_DATA(0xD0);
        LCD_WRITE_DATA(0x02);
        LCD_WRITE_DATA(0x07);
        LCD_WRITE_DATA(0x0A);
        LCD_WRITE_DATA(0x0B);
        LCD_WRITE_DATA(0x18);
        LCD_WRITE_DATA(0x34);
        LCD_WRITE_DATA(0x43);
        LCD_WRITE_DATA(0x4A);
        LCD_WRITE_DATA(0x2B);
        LCD_WRITE_DATA(0x1B);
        LCD_WRITE_DATA(0x1C);
        LCD_WRITE_DATA(0x22);
        LCD_WRITE_DATA(0x1F);
        LCD_WRITE_COMMAND(0x29);        //開顯示
        LCD_WRITE_COMMAND(0x2C);        //寫存儲
}

/******************************************************************************
      函數(shù)說明:LCD區(qū)域設(shè)置函數(shù)
      入口數(shù)據(jù):unsigned int stx
                unsigned int sty
                unsigned int endx
                unsigned int endy
      返回值:  無
******************************************************************************/
void LCD_SetArea(unsigned int stx,unsigned int sty,unsigned int endx,unsigned int endy)
{
        LCD_WRITE_COMMAND(0x2A);        //列地址設(shè)置
        LCD_WRITE_16BIT_DATA(stx);               
        LCD_WRITE_16BIT_DATA(endx);         

        LCD_WRITE_COMMAND(0x2B);        //行地址設(shè)置
        LCD_WRITE_16BIT_DATA(sty);               
        LCD_WRITE_16BIT_DATA(endy);         
}

/******************************************************************************
      函數(shù)說明:LCD顏色設(shè)置函數(shù)
      入口數(shù)據(jù):unsigned int color
      返回值:  無
******************************************************************************/
void LCD_WRITE_ColorData(unsigned int color)
{
    LCD_WRITE_16BIT_DATA(color);
}

/******************************************************************************
      函數(shù)說明:LCD清屏函數(shù)
      入口數(shù)據(jù):unsigned int color
      返回值:  無
******************************************************************************/
void LCD_Clear(unsigned int color)
{  
        unsigned int i,j;

        LCD_SetArea(0,0,239,319);
    LCD_WRITE_COMMAND(0x2C);        //寫存儲
        for(i=0;i<320;i++)
        {
                for(j=0;j<240;j++)
                {
                        LCD_WRITE_ColorData(color);
                }
        }
}

/******************************************************************************
      函數(shù)說明:主函數(shù)
******************************************************************************/
void main()
{
    Initial_IO();
    Initial_SPI();
        Initial_LCD();
//        LCD_WRITE_COMMAND(0x28);
        while(1)
        {
//                LCD_Clear(WHITE);
//                __delay_ms(10);
                LCD_Clear(RED);
//                __delay_ms(100);
//                LCD_Clear(BLUE);
//                __delay_ms(100);
//                LCD_Clear(GREEN);
//                __delay_ms(100);

        }
}

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

使用道具 舉報(bào)

沙發(fā)
ID:992128 發(fā)表于 2021-12-14 17:20 | 只看該作者
麻煩各位大佬幫忙分析一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:401564 發(fā)表于 2021-12-14 20:28 | 只看該作者
MCLR 是復(fù)位引腳
你按下復(fù)位才顯示,這本身就是問題,正常來說,按復(fù)位應(yīng)該什么都不行的,也不知道你說的顯示是不是按下復(fù)位就行,還是說按下復(fù)位只是亮了而已

1:把電路上傳,看一下復(fù)位對不對,或者是看一下你自己焊得對不對
2:PIC的端口是有優(yōu)先等級的,SPI部分是有最優(yōu)等級,不用設(shè)置
這三個(gè)端口要設(shè)置的
RC0                       RESET(P15)
  RC1                       WR(P11)
  RC2                       CS(P9)
比如RC0,要把CLC2這個(gè)功能關(guān)閉了,才能輪到端口
RC1就要先關(guān)閉NCO1 (2)和PWM4,才作為端口
回復(fù)

使用道具 舉報(bào)

地板
ID:992336 發(fā)表于 2021-12-14 23:31 | 只看該作者
按下復(fù)位單片機(jī)不工作卻顯示,說明之前寫到st7789v里的數(shù)據(jù)有用了。
可能是無限清屏造成的,試試主程序里增加100ms延時(shí)
回復(fù)

使用道具 舉報(bào)

5#
ID:992128 發(fā)表于 2021-12-15 10:28 | 只看該作者
Y_G_G 發(fā)表于 2021-12-14 20:28
MCLR 是復(fù)位引腳
你按下復(fù)位才顯示,這本身就是問題,正常來說,按復(fù)位應(yīng)該什么都不行的,也不知道你說的顯示 ...

按住單片機(jī)復(fù)位鍵,LCD是全屏顯示紅色(調(diào)試的時(shí)候只讓它刷紅色),松開復(fù)位鍵,就只剩背光了,上傳了視頻。
1、上傳了單片機(jī)的電路圖,MCLR復(fù)位在其他項(xiàng)目中使用是正常的。
2、RC0關(guān)閉CLC2,RC1關(guān)閉NCO1和PWM4在調(diào)試時(shí)試過,沒有解決問題。而且程序里不單獨(dú)去關(guān)閉,用示波器測出的波形也是符合設(shè)定要求的,所以在貼出的程序里把這個(gè)刪除了。

PIC16F1508最小系統(tǒng)_V1.1.jpg (329.3 KB, 下載次數(shù): 45)

原理圖

原理圖

視頻.rar

2.75 MB, 下載次數(shù): 7

回復(fù)

使用道具 舉報(bào)

6#
ID:992128 發(fā)表于 2021-12-15 10:47 | 只看該作者
0x0A 發(fā)表于 2021-12-14 23:31
按下復(fù)位單片機(jī)不工作卻顯示,說明之前寫到st7789v里的數(shù)據(jù)有用了。
可能是無限清屏造成的,試試主程序里 ...

"按下復(fù)位單片機(jī)不工作卻顯示,說明之前寫到st7789v里的數(shù)據(jù)有用了。"
是的,我覺得數(shù)據(jù)是有傳輸?shù)絪t7789V,只是因?yàn)槟撤N原因無法顯示,當(dāng)復(fù)位時(shí)單片機(jī)停止工作,st7789V就可以正常顯示了。
您說可能是無限清屏造成的,我這邊加延時(shí)調(diào)試了下,也沒效果。
根據(jù)您給的思路,我改了下PIC內(nèi)部振蕩器的頻率,發(fā)現(xiàn)500KHz時(shí),按住復(fù)位鍵,LCD顯示全屏紅色(調(diào)試只讓顯示紅色),4MHz時(shí),按住復(fù)位鍵,LCD上邊顯示紅色,下邊是麻點(diǎn)
回復(fù)

使用道具 舉報(bào)

7#
ID:401564 發(fā)表于 2021-12-15 12:50 | 只看該作者
hanyao 發(fā)表于 2021-12-15 10:28
按住單片機(jī)復(fù)位鍵,LCD是全屏顯示紅色(調(diào)試的時(shí)候只讓它刷紅色),松開復(fù)位鍵,就只剩背光了,上傳了視頻 ...

手上沒有東西,沒法調(diào)試,仿真我不會(huì)
你可以看一下復(fù)位引腳的電壓,和元件貼得對不對,
或者是先把MCLR關(guān)閉,使能為IO端口,這樣就可以排除復(fù)位的問題了
對于端口的設(shè)置是肯定要的,不管有沒有解決問題,PIC端口的優(yōu)先等級都是存在的,有時(shí)不設(shè)定也能用,那就是個(gè)運(yùn)氣好而已
我用的時(shí)候,都是先在IO接一個(gè)1K電阻,然后再寫一個(gè)輸出的代碼,看一下端口能不能輸出自己想要的波形,先把所有端口優(yōu)先等級解決了,再去調(diào)試別的功能
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人a∨高清免费观看 老司机午夜性大片 | 欧美福利视频一区 | 一级做a爰片性色毛片 | 国产精品一区二区精品 | 亚洲永久入口 | 中文字幕亚洲精品 | jdav视频在线观看免费 | 久久精品视频在线观看 | 人人干97 | 男人的天堂久久 | www四虎com | 久久精品在线 | 国产高清在线 | 日韩一区二区免费视频 | 91看片视频 | 天天操操| 午夜精品久久久久久久久久久久久 | 成人一区二区三区 | 亚洲免费大片 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 亚洲视频三区 | 久久久久久国产一区二区三区 | 国产欧美一区二区三区日本久久久 | 日韩看片 | 久久久人成影片一区二区三区 | 久久se精品一区精品二区 | 久久国产精品精品 | 中文字幕在线视频观看 | 91视频在线看 | 国产日韩一区二区 | 97色在线观看免费视频 | 精品国产一区二区三区久久狼黑人 | 亚洲黄色片免费观看 | 国产精品一区二区视频 | 精品一区二区久久 | 日韩在线不卡视频 | 在线免费观看视频你懂的 | 欧美日韩一区二区在线 | 国产一区二区三区 | 91小视频在线 | www.久久.com |