[PIC®/AVR® MCU]

【CuriosityNano测评报告】+ AVR64DD32SPI驱动LCD19264显示屏

[复制链接]
114|3
手机看帖
扫描二维码
随时随地手机跟帖
hu9jj|  楼主 | 2022-11-22 16:10 | 显示全部楼层 |阅读模式
AN, AVR, CD, IO, LCD
#申请原创#

    最初打算启用硬件SPI来驱动LCD192*64显示屏的,用扩展卡做了一个LCD的接口板,下图为扩展卡的正面:
LCD19264_2.jpg

    但最后测试发现其中的飞线有误,我又不愿意拆除重焊飞线,索性修改原来的扩展板重新去打样,好在JLC仍有免费制版,下图为扩展卡的背面:
LCD19264_3.jpg

    收到PCB板后焊上排针母座,插上LCD显示屏,将驱动程序移植过来测试,屏幕毫无反映,通过逻辑分析仪抓取各引脚的时序查看,各引脚的信号基本完整,只是时钟太高了:
LCD19264_0.jpg

    LCD192*64的时钟频率大约是100K,而逻辑分析仪上清楚地显示为1M,需要降低SPI的速度:
SPI_1.jpg

    打开MCC配置,但速率为灰色的无法调整降低:
SPI_2.jpg

    所以只好放弃硬件SPI的测试,仍然使用软件SPI来驱动。通过调整,软件SPI的速度基本上满足要求:
LCD19264_1.jpg

    这是调试过程中的照片:
LCD19264_4.jpg

    至此,LCD192*64显示屏的驱动顺利完成:
LCD19264_5.jpg

    这是在主程序中调用的代码:
int main(void)
{
    SYSTEM_Initialize();
//    USART0_Enable();
    printf("Hello World\r\n");

    SW0_SetDigitalInput();
    SW0_SetPullUp();
    SW0_EnableInterruptForFallingEdge();         //设置引脚的中断模式
    PF6_SetInterruptHandler(SW0_Handler);        //指定中断处理的函数

    LCD_init();                                  //LCD初始化
    display_main();
   
    TCA0_EnableInterrupt();
    Led0_SetHigh();
   
    while(1)
    {
        printf("wait=%d\r\n",wait);
        Led0_Toggle();
        DELAY_milliseconds(wait);
    }   
}


    这是LCD初始化的代码:
/*********************************************
* 函数名称:LCD_init(void)
* 函数功能:LCD19264初始化(含引脚配置)
* 入口参数:无
* 出口参数:无
* 备注:
*********************************************/
void LCD_init(void)
{
//    uint8_t InitDat[9] = {0xE2, 0xA3, 0xEB, 0x2F, 0xC4, 0x81, 0xB4, 0xAF, 0xA6};
   
    CS_SetDigitalOutput();
    DC_SetDigitalOutput();
    RST_SetDigitalOutput();
    IO_PA4_SetDigitalOutput();    //设置SCK端口模式
    IO_PA6_SetDigitalOutput();    //设置MOSI端口模式
   
    RST_SetLow();
    DELAY_milliseconds(100);      //延时,等待LCD工作正常
    RST_SetHigh();
    DELAY_milliseconds(100);
   
    CS_SetLow();                  //选择LCD
   
    WriteData(0xe2,0);            //显示屏复位指令
    WriteData(0xa3,0);            //设置帧速率[A0: 76fps, A1b: 95fps, A2b: 132fps, A3b: 168fps(fps: frame-per-second)]
    WriteData(0xeb,0);            //设置LCD偏置比(亮度设置)
    WriteData(0x2f,0);            //显示屏功耗设置
    WriteData(0xc4,0);            //设置LCD映射控制c2=正向,c4=反向
    WriteData(0x81,0);            //设置SEG偏置电压(对比度) 双字节指令
    WriteData(0xb4,0);            //设置SEG偏置电压(对比度) 双字节指令0xb4
    WriteData(0xaf,0);            //开启显示指令
        WriteData(0xa6,0);            //开启正常显示

    CS_SetHigh();                 //取消片选
}


    这是软件模拟硬件SPI的驱动代码:
/*********************************************
* 函数名称:WriteData(uint8_t,data,uint8_t C)
* 函数功能:向LCD19264写入命令或显示数据)
* 入口参数:uint8_t date(一字节命令或显示数据)
*           uint8_t C(0=写入显示数据、1=写入命令)
* 出口参数:无
* 备注:
*********************************************/
void WriteData(unsigned char data, unsigned char C)
{
    volatile unsigned char i,dat; //i用于循环写入8位数据,dat用于缓存数据
    SCK_0();                      //拉低时钟
    if(1==C)                      //判断要写入的是指令还是数据
        CD_1();                   //等于1 就是数据
    else
        CD_0();                   //等于0 就是指令

    dat=data;                     //缓存数据
    for(i=0; i<8; i++)            //循环发送8位数据
    {
        if((dat&0x80)==0x80)      //判断最高位是否为1
            SDT_1();              //1 拉高总线写入1
        else
            SDT_0();              //0 拉低总线写入0
        SCK_1();                  //产生一个时钟
        DELAY_microseconds(1);
        SCK_0();                  //时钟结束

        dat<<=1;                  //左移一位 准备写入下一位
    }
}



使用特权

评论回复
guijial511| | 2022-11-22 18:24 | 显示全部楼层
这种单色的12064现在很少用了

使用特权

评论回复
weifeng90| | 2022-11-22 18:43 | 显示全部楼层
熟悉的洞洞板,以前打个板很贵,只有用洞洞板,现在打样很便宜了。

使用特权

评论回复
hu9jj|  楼主 | 2022-11-22 21:26 | 显示全部楼层
板子的边长控制在10cm之内,每月两次的免费优惠券,不用白不用。还得感谢嘉立创造福我们这些爱好者!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则