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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2621|回復: 6
收起左側

PIC單片機驅動LCD問題,按住PIC單片機的復位鍵(MCLR 復位)ST7789V才有顯示

[復制鏈接]
ID:992128 發表于 2021-12-14 15:45 | 顯示全部樓層 |閱讀模式
51hei圖片_20211214135751.jpg
單片機型號:PIC16F1508
LCD驅動芯片:ST7789V
問題點:用PIC單片機SPI控制LCD(ST7789V),用示波器測量SPI波形是符合ST7789V的時序要求的,但是PIC和LCD連接后,LCD沒有任何顯示。按住PIC單片機的復位鍵(MCLR 復位),LCD有顯示。
想咨詢下各位高手,哪里出問題了?
示波器波形:
1號探頭:SCK時鐘
2號探頭:SDO,示波器測試時數據是0x33
3號探頭:CS片選
4號探頭:不用在意,隨便接了一個

源代碼如下:

/******************************************************************************
  PIC側                      LCD側

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

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

//-------------------------------CONFIG2設置--------------------------------//
#pragma config WRT = OFF        // 閃存保護關
#pragma config STVREN = ON      // 堆棧溢出復位
#pragma config BORV = LO        // 欠壓復位電壓選擇低跳變點
#pragma config LPBOR = OFF      // 低功耗欠壓復位關
#pragma config LVP = OFF        // 高電壓編程

//-------------------------------振蕩器設置---------------------------------//
//#pragma osccon = 0x6A           //4MHz內部振蕩器,指令周期1us
//#define _XTAL_FREQ 4000000      //振蕩器頻率4MHz
#pragma osccon = 0x3A           //500KHz內部振蕩器
#define _XTAL_FREQ 500000      //振蕩器頻率500KHz
//#pragma osccon = 0x7A           //16MHz內部振蕩器
//#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          //藍色
#define     WHITE        0XFFFF          //白色

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

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

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

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


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

}

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

//    SSP1STAT=0x80;             //CKE=0 時鐘狀態從空閑轉換到有效時發送
//    SSP1CON1=0X20;             //主控方式,Fosc/4,CKP=0空閑時鐘電平為低,SSPEN=1使能同步串行功能

//    SSP1STAT=0x80;             //CKE=1 時鐘狀態從空閑轉換到有效時發送
//    SSP1CON1=0X30;            //主控方式,Fosc/4,CKP=1空閑時鐘電平為高,SSPEN=1使能同步串行功能


}

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

/******************************************************************************
      函數說明:LCD寫數據函數(8位)
      入口數據: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;
}

/******************************************************************************
      函數說明:LCD寫數據函數(16位)
      入口數據: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;
}

/******************************************************************************
      函數說明:LCD寫指令函數
      入口數據: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;
}

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

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

//--------------------------顯示和顏色格式設置-------------------------------//
        LCD_WRITE_COMMAND(0x36);    //內存數據訪問控制(P215)
        LCD_WRITE_DATA(0x00);      
        LCD_WRITE_COMMAND(0x3A);    //接口像素格式
        LCD_WRITE_DATA(0x05);      
//-------------------------------幀速率設置----------------------------------//
        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);
//------------------------------電源設置-------------------------------------//
        LCD_WRITE_COMMAND(0xBB);        //VCOMS設置
        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設置
        LCD_WRITE_DATA(0x0B);
        LCD_WRITE_COMMAND(0xC4);        //VDV設置
        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設置-----------------------------------//
        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);        //負電壓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);        //寫存儲
}

/******************************************************************************
      函數說明:LCD區域設置函數
      入口數據: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);        //列地址設置
        LCD_WRITE_16BIT_DATA(stx);               
        LCD_WRITE_16BIT_DATA(endx);         

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

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

/******************************************************************************
      函數說明:LCD清屏函數
      入口數據: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);
                }
        }
}

/******************************************************************************
      函數說明:主函數
******************************************************************************/
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);

        }
}

回復

使用道具 舉報

ID:992128 發表于 2021-12-14 17:20 | 顯示全部樓層
麻煩各位大佬幫忙分析一下
回復

使用道具 舉報

ID:401564 發表于 2021-12-14 20:28 | 顯示全部樓層
MCLR 是復位引腳
你按下復位才顯示,這本身就是問題,正常來說,按復位應該什么都不行的,也不知道你說的顯示是不是按下復位就行,還是說按下復位只是亮了而已

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

使用道具 舉報

ID:992336 發表于 2021-12-14 23:31 | 顯示全部樓層
按下復位單片機不工作卻顯示,說明之前寫到st7789v里的數據有用了。
可能是無限清屏造成的,試試主程序里增加100ms延時
回復

使用道具 舉報

ID:992128 發表于 2021-12-15 10:28 | 顯示全部樓層
Y_G_G 發表于 2021-12-14 20:28
MCLR 是復位引腳
你按下復位才顯示,這本身就是問題,正常來說,按復位應該什么都不行的,也不知道你說的顯示 ...

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

原理圖

原理圖

視頻.rar

2.75 MB, 下載次數: 7

回復

使用道具 舉報

ID:992128 發表于 2021-12-15 10:47 | 顯示全部樓層
0x0A 發表于 2021-12-14 23:31
按下復位單片機不工作卻顯示,說明之前寫到st7789v里的數據有用了。
可能是無限清屏造成的,試試主程序里 ...

"按下復位單片機不工作卻顯示,說明之前寫到st7789v里的數據有用了。"
是的,我覺得數據是有傳輸到st7789V,只是因為某種原因無法顯示,當復位時單片機停止工作,st7789V就可以正常顯示了。
您說可能是無限清屏造成的,我這邊加延時調試了下,也沒效果。
根據您給的思路,我改了下PIC內部振蕩器的頻率,發現500KHz時,按住復位鍵,LCD顯示全屏紅色(調試只讓顯示紅色),4MHz時,按住復位鍵,LCD上邊顯示紅色,下邊是麻點
回復

使用道具 舉報

ID:401564 發表于 2021-12-15 12:50 | 顯示全部樓層
hanyao 發表于 2021-12-15 10:28
按住單片機復位鍵,LCD是全屏顯示紅色(調試的時候只讓它刷紅色),松開復位鍵,就只剩背光了,上傳了視頻 ...

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久一区二区三区 | 99re99| 91看片在线观看 | 一级黄色影片在线观看 | 97伦理最新伦理 | 中文在线一区二区 | 中文字幕精品一区久久久久 | 夜夜草| 精品在线一区二区 | 亚洲 欧美 激情 另类 校园 | 亚洲美女视频 | 精品自拍视频在线观看 | av毛片 | 精品欧美一区二区精品久久久 | 久久久精品综合 | 久久精品一区二区三区四区 | 欧美国产激情二区三区 | 国产精品视频97 | 黄色综合 | 欧美8一10sex性hd | 国产精品1| 国产精品久久久久久久久久久久久久 | 久久99精品久久 | 国产免费一区二区三区网站免费 | 亚av在线| 亚洲精品一区国语对白 | 91麻豆精品国产91久久久久久 | 国产精品视频久久 | 毛片在线免费 | 罗宾被扒开腿做同人网站 | 色综合久久久 | 一道本在线| 亚洲欧美中文日韩在线v日本 | 日韩一二区 | 中文字幕一区在线 | 欧美成人激情视频 | 国产精品免费在线 | 久久国产欧美日韩精品 | 91精品国产91久久久久久吃药 | 久久久人 | 91久久精品国产91久久性色tv |