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,让它怎么显示? |
这文不对题的无解 |