從1月10收到某寶買的12864后,下班回家測試,先拿上手的STC80C52開發(fā)板,測試,上電下載,除了屏幕亮,不顯示字.擔心買到某寶的假貨,反復檢查程序,沒有錯誤,哎,嵌入式不難,難的是程序有問題,硬件有問題,查資料,看手冊,實在不行了. 期間都準備給某寶退貨了突然想起來自己不是焊了2塊板子么,換另一塊試試. 結(jié)果令人欣慰,可以顯示,看來液晶沒壞,是原來的板子有問題. 確定12864是好的了,下面繼續(xù)學習摩爾吧之SPI驅(qū)動教程,看了幾天并寫程序,修改,下載,依然不能顯示字符等.查百度,看視頻,全是10X的,不過原理總是一樣吧,配置GPIO口時鐘,SPI時鐘,各種例程看了好多個,模擬的也看.只要跟12864掛邊的都看,手冊,時序圖. 昨天看視頻里的仿真很好很直觀,嘗試調(diào)試12864驅(qū)動,結(jié)果出現(xiàn)錯誤,又是百度一籮筐.怎么改也不行,把DUG界面改個面目全非,恢復不了,干脆卸了重裝吧,裝完器件發(fā)現(xiàn)dcomutil_libfnp.dll 這個動態(tài)鏈接庫老是被360當毒殺掉,于是恢復掉,并用模擬示波器在DUG單步運行觀察串口時鐘和數(shù)據(jù)的發(fā)送.,結(jié)果波形沒看到,看到液晶屏顯示,給人莫名其妙的感覺.期間因為用了PB3,看到SWO有用,又調(diào)到了PB4. 正常顯示后,又換回PB3,也正常,看來不是引腳沖突. 總之,我感覺這次調(diào)試就是因為360殺毒給把紅色的文件刪了,才引起的液晶不顯示. 殺毒軟件也誤殺. /*Includes --------------------------------------------------------------------*/ #include "lcd.h" #include "includes.h" unsigned char disps[]={"I love STM32!"}; unsigned char dispx[]={"我愛社區(qū)!"}; 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); } } |
|