【CuriosityNano测评报告】+ AVR64DD32SPI驱动LCD19264显示屏
#申请原创#最初打算启用硬件SPI来驱动LCD192*64显示屏的,用扩展卡做了一个LCD的接口板,下图为扩展卡的正面:
但最后测试发现其中的飞线有误,我又不愿意拆除重焊飞线,索性修改原来的扩展板重新去打样,好在JLC仍有免费制版,下图为扩展卡的背面:
收到PCB板后焊上排针母座,插上LCD显示屏,将驱动程序移植过来测试,屏幕毫无反映,通过逻辑分析仪抓取各引脚的时序查看,各引脚的信号基本完整,只是时钟太高了:
LCD192*64的时钟频率大约是100K,而逻辑分析仪上清楚地显示为1M,需要降低SPI的速度:
打开MCC配置,但速率为灰色的无法调整降低:
所以只好放弃硬件SPI的测试,仍然使用软件SPI来驱动。通过调整,软件SPI的速度基本上满足要求:
这是调试过程中的照片:
至此,LCD192*64显示屏的驱动顺利完成:
这是在主程序中调用的代码:
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 = {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); //设置帧速率
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; //左移一位 准备写入下一位
}
}
这种单色的12064现在很少用了 熟悉的洞洞板,以前打个板很贵,只有用洞洞板,现在打样很便宜了。 板子的边长控制在10cm之内,每月两次的免费优惠券,不用白不用。还得感谢嘉立创造福我们这些爱好者! 这个屏幕自带汉字字库的吗? 杜邦线搞起来,方便多了。 为什么不使用oled呢? abotomson 发表于 2022-12-1 21:16
为什么不使用oled呢?
没有为什么,只因为手头上有现成的LCD192*64显示屏。 elsaflower 发表于 2022-12-1 18:46
这个屏幕自带汉字字库的吗?
自带字库的话价格就上去了,普通应用通常也不需要字符全集,根据自己的需要建一个子集就行。 LCD19264的价格挺贵的吧。 eefas 发表于 2022-12-2 21:20
LCD19264的价格挺贵的吧。
不算贵,10元左右,有黑白或蓝白两种颜色。 楼主还自己打了一个pcb外设呢。 olivem55arlowe 发表于 2022-12-3 14:00
楼主还自己打了一个pcb外设呢。
是的,打样了一个扩展坞,方便评测。 AVR64DD32SPI 的速度支持多少? 模拟iic操作起来也简单很多的。 推荐oled,这个好用很多。 可以实现彩色的吗? 硬件spi驱动的lcd? 这个的驱动的速度太慢了,影响刷屏的速度的。 之前驱动其他lcd也不现实,最后是电流的原因
页:
[1]
2