![]() |
發布時間: 2019-4-17 23:57
正文摘要:sbit LCD_RS = P2^5; //片選信號輸入 sbit LCD_RW = P2^6; //串行數據輸入 sbit LCD_E = P2^7; //串行時鐘輸入 sbit D0=P0^0; void delay_nms(uint t) { ... |
wulin 發表于 2019-4-18 05:25 那換啦LCD12864,要怎么改才能顯示數據? sbit LCD_CS = P0^0; //片選信號輸入 sbit LCD_STD = P0^1; //串行數據輸入 sbit LCD_SCLK = P0^2; //串行時鐘輸入 void delay_nms(uint t) { uint i; uchar j; for(i=0;i<t;i++) for(j=0;j<110;j++); } /*函數功能:向lcd12864串行輸入一個字節*/ void send_byte(uchar Dbyte) { uchar i; for(i=0;i<8;i++) { LCD_SCLK = 0; Dbyte = Dbyte<<1; LCD_STD = CY; LCD_SCLK = 1; _nop_(); LCD_SCLK = 0; } } /*函數功能:接收lcd12864輸出的一個有效字節*/ uchar recive_byte() { uchar temp1,temp2,i; bit flag; temp1 = 0; temp2 = 0; for(i=0;i<8;i++)//接收有效字節的高四位 { temp1 = temp1<<1; LCD_SCLK = 0; LCD_SCLK = 1; _nop_(); LCD_SCLK = 0; flag = LCD_STD; if(flag==1) temp1 = temp1&0x01; } for(i=0;i<8;i++)//接收有效字節的低四位 { temp2 = temp2<<1; LCD_SCLK = 0; LCD_SCLK = 1; _nop_(); LCD_SCLK = 0; flag = LCD_STD; if(flag==1) temp2 = temp2&0x01; } return ((temp1&0xf0)|(temp2&0x0f));//返回接收到的有效字節 } /*函數功能:檢測忙標志位*/ void lcd12864_checkbusy() { do { send_byte(0xfc);//1111 1【1 RW】【0 RS】0 }while(recive_byte()&0x80==0x80); //BF(.7)=1 Busy } /*函數功能:向12864寫命令函數*/ void lcd12864_write_com(uchar com) { LCD_CS = 1; lcd12864_checkbusy();//檢測忙信號 send_byte(0xf8);//1111 1[0 rw][0 rs]0 寫命令起始指令 send_byte(com&0xf0); send_byte((com<<4)&0xf0); LCD_CS = 0; } /*函數功能:向12864寫數據函數*/ void lcd12864_write_dat(uchar dat) { LCD_CS = 1; lcd12864_checkbusy();//檢測忙信號 send_byte(0xfa);//1111 1[0 rw][1 rs]0 寫數據起始指令 send_byte(dat&0xf0); send_byte((dat<<4)&0xf0); LCD_CS = 0; } void lcd12864_set_cursor(uchar x,uchar y) { uchar addr; switch(x)//確定行 { case 0x00:addr = 0x80;break;//第一行 case 0x01:addr = 0x90;break;//第二行 case 0x02:addr = 0x88;break;//第三行 case 0x03:addr = 0x98;break;//第四行 default:break; } addr += y; //確定列 lcd12864_write_com(addr); //設置光標 } /*函數功能:lcd12864清顯示(顯示漢字、字符模式下的清屏)*/ void lcd12864_clear0(void) { lcd12864_write_com(0x01); delay_nms(10); } /*函數功能:lcd12864清顯示(繪圖模式下的清屏)*/ void lcd12864_clear1(void) { uchar i, j, k ; lcd12864_write_com(0x34);//功能設置:擴充指令集動作 lcd12864_write_com(0x36);//開繪圖顯示 for( i = 0 ; i < 2 ; i++ )//分上下兩屏寫 { for( j = 0 ; j < 32 ; j++ ) { lcd12864_write_com( 0x80 + j ) ;//寫Y坐標(行坐標) if( i == 0 ) //寫X坐標(列坐標) lcd12864_write_com( 0x80 ) ; else lcd12864_write_com( 0x88 ) ; for( k = 0 ; k < 16 ; k++ ) //寫一整行數據 lcd12864_write_dat(0x00) ; } } lcd12864_write_com( 0x30 ) ;//功能設置:恢復為基本指令集 // 關繪圖顯示 } /*函數功能:初始化函數*/ void lcd12864_init() { delay_nms(50); //功能設定 lcd12864_write_com(0x30); //設置為8位并行口,基本指令集 delay_nms(1); lcd12864_write_com(0x30); //再次設置為8位并行口,基本指令集 delay_nms(1); lcd12864_write_com(0x0c); //顯示狀態設置:整體顯示ON 游標OFF delay_nms(10); lcd12864_write_com(0x01); //清除顯示,并且設定地址指針為00H delay_nms(10); lcd12864_write_com(0x06); //設置為游標右移,DDRAM位地址加1,畫面不移動 } /*函數功能:在指定位置 顯示一個字符*/ void lcd12864_write_char(uchar x,uchar y,uchar chr) { lcd12864_set_cursor(x,y); lcd12864_write_dat(chr); } /*函數功能:在指定位置 顯示一個字符*/ void lcd12864_write_str(uchar x,uchar y,uchar *string) { uchar *str; uchar i=x; uchar j=y; str = string; lcd12864_set_cursor(x,y); while(*str!='\0') { lcd12864_write_dat(*str); j++; if(j>0x0f) { i++; j=0; if(i>4) i=0; lcd12864_set_cursor(i,j); } str++; } } //畫滿屏圖片 //參數:dat為填充的數據 void draw_full_picture (uchar *dat) { uchar i; uchar j; uchar k; uchar bGDRAMAddrX = 0x80; //GDRAM水平地址 uchar bGDRAMAddrY = 0x80; //GDRAM垂直地址 for(i = 0; i < 2; i++) { for(j = 0; j < 32; j++) { for(k = 0; k < 8; k++) { lcd12864_write_com(0x34); //設置為8位MPU接口,擴充指令集 lcd12864_write_com(bGDRAMAddrY+j); //垂直地址Y lcd12864_write_com(bGDRAMAddrX+k); //水平地址X lcd12864_write_dat(*dat++); lcd12864_write_dat(*dat++); } } bGDRAMAddrX = 0x88; //寫下半屏幕 } lcd12864_write_com(0x36); //打開繪圖模式 lcd12864_write_com(0x30); //恢復基本指令集,關閉繪圖模式 } |
你的程序用的是12864,仿真用的是1602,讓它怎么顯示? |
這文不對題的無解 |