从1月10收到某宝买的12864后,下班回家测试,先拿上手的STC80C52开发板,测试,上电下载,除了屏幕亮,不显示字.担心买到某宝的假货,反复检查程序,没有错误,哎,嵌入式不难,难的是程序有问题,硬件有问题,查资料,看手册,实在不行了. 期间都准备给某宝退货了突然想起来自己不是焊了2块板子么,换另一块试试. 结果令人欣慰,可以显示,看来液晶没坏,是原来的板子有问题. 确定12864是好的了,下面继续学习摩尔吧之SPI驱动教程,看了几天并写程序,修改,下载,依然不能显示字符等.查百度,看视频,全是10X的,不过原理总是一样吧,配置GPIO口时钟,SPI时钟,各种例程看了好多个,模拟的也看.只要跟12864挂边的都看,手册,时序图. 昨天看视频里的仿真很好很直观,尝试调试12864驱动,结果出现错误,又是百度一箩筐.怎么改也不行,把DUG界面改个面目全非,恢复不了,干脆卸了重装吧,装完器件发现dcomutil_libfnp.dll 这个动态链接库老是被360当毒杀掉,于是恢复掉,并用模拟示波器在DUG单步运行观察串口时钟和数据的发送.,结果波形没看到,看到液晶屏显示,给人莫名其妙的感觉.期间因为用了PB3,看到SWO有用,又调到了PB4. 正常显示后,又换回PB3,也正常,看来不是引脚冲突. 总之,我感觉这次调试就是因为360杀毒给把红色的文件删了,才引起的液晶不显示. 杀毒软件也误杀. /*Includes --------------------------------------------------------------------*/ #include "lcd.h" #include "includes.h" unsigned char disps[]={"I love STM32!"}; unsigned char dispx[]={"我爱社区!"}; void LCD_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure ; RCC_AHBPeriphClockCmd(LCD_PORT_CLK ,ENABLE); GPIO_InitStructure.GPIO_Pin = LCD_CLK_PIN|LCD_SID_PIN ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_PRORT, &GPIO_InitStructure); } void send_command(unsigned char command_data) { unsigned char i; unsigned char i_data; i_data=0xf8; LCD_CLK_0; for(i=0; i<8; i++) { if(i_data & 0x80) { LCD_SID_1; } else { LCD_SID_0; } LCD_CLK_0; LCD_CLK_1; i_data=i_data<<1; } i_data=command_data; i_data=i_data&0xf0; for(i=0; i<8; i++) { if(i_data & 0x80) { LCD_SID_1; } else { LCD_SID_0; } LCD_CLK_0; LCD_CLK_1; i_data=i_data<<1; } i_data=command_data; i_data=i_data<<4; for(i=0; i<8; i++) { if(i_data & 0x80) { LCD_SID_1; } else { LCD_SID_0; } LCD_CLK_0; LCD_CLK_1; i_data=i_data<<1; } Delay_Ms(10); } void send_data(unsigned char command_data) { unsigned char i; unsigned char i_data; i_data=0xfa; //LCD_CLK_0; for(i=0; i<8; i++) { if(i_data & 0x80) { LCD_SID_1; } else { LCD_SID_0; } LCD_CLK_0; LCD_CLK_1; i_data=i_data<<1; } i_data=command_data; i_data=i_data&0xf0; for(i=0; i<8; i++) { if(i_data & 0x80) { LCD_SID_1; } else { LCD_SID_0; } LCD_CLK_0; LCD_CLK_1; i_data=i_data<<1; } i_data=command_data; i_data=i_data<<4; for(i=0; i<8; i++) { if(i_data & 0x80) { LCD_SID_1; } else { LCD_SID_0; } LCD_CLK_0; LCD_CLK_1; i_data=i_data<<1; } Delay_Ms(10); } void lcd_init(void) { Delay_Ms(100); send_command(0x30); send_command(0x02); send_command(0x06); send_command(0x0c); send_command(0x01); send_command(0x80); } void display_s(void) { unsigned char a; send_command(0x80); for(a=0;a<13;a++) { send_data(disps[a]); } } void display_x(void) { unsigned char a; send_command(0x92); for(a=0;a<11;a++) { send_data(dispx[a]); } } void Delay(unsigned int nCount) { while (nCount != 0) { nCount--; } } void Delay_Us(unsigned int nCount) { while (nCount != 0) { nCount--; Delay(150); } } void Delay_Ms(unsigned int nCount) { while (nCount != 0) { nCount--; Delay(15000); } } |
|