KS0108显示屏在44B0上的驱动
unsigned char LCD_buf[16*64];
%A
%A void LCD_delay(int ms)
%A {
%A int ii;
%A for(ii=0;ii<ms*80;ii++)
%A {
%A ii=ii;
%A }
%A }
%A //选择屏幕 screen: 0-全屏,1-左屏,2-右屏 3-全不选
%A void SelectScreen(unsigned char screen)
%A { // cs1: 1--右; cs2: 1--左
%A switch(screen)
%A {
%A case 0:
%A rPDATD |= 0x0020; //set CS1 High
%A rPDATD |= 0x0010; //set CS2 High
%A break;
%A case 1: //左屏
%A rPDATD &= 0xFFDF; //set CS1 Low
%A rPDATD |= 0x0010; //set CS2 High
%A break;
%A case 2: //右屏
%A rPDATD |= 0x0020; //set CS1 High
%A rPDATD &= 0xFFEF; //set CS2 Low
%A break;
%A case 3: //
%A rPDATD &= 0xFFDF; //set CS1 Low
%A rPDATD &= 0xFFEF; //set CS2 Low
%A break;
%A }
%A }
%A
%A //状态检查
%A void CheckState(void)
%A {
%A unsigned char dat;
%A do
%A { rPDATD |= 0x0080; //set RS High // select data
%A rPDATD &= 0xFFBF; //set RW Low // select Write
%A
%A rPDATD |= 0x000F;//Write data
%A rPDATC |= 0x00F0;//Write data
%A LCD_delay(1);
%A rPDATC |= 0x0200; //set E High
%A LCD_delay(1);
%A rPDATC &= 0xFDFF; //set E Low
%A
%A rPCONC=0x55550055; //set D4~D7 as input
%A rPCOND=0x5500; //set D0~D3 as input
%A //read status
%A rPDATD &= 0xFF7F; //set RS Low // select command
%A rPDATD |= 0x0040; //set RW High // select Read
%A LCD_delay(1);
%A rPDATC |= 0x0200; //set E High
%A LCD_delay(1);
%A dat=(rPDATC&0xF0)|(rPDATD&0x0F);
%A rPDATC &= 0xFDFF; //set E Low
%A
%A rPCONC=0x55555555; //set D4~D7 as output
%A rPCOND=0x5555; //set D0~D3 as output
%A
%A dat= 0x90 & dat; //仅当第4,7位为0时才可操作
%A }while(dat!=0x00);
%A LCD_delay(1);
%A }
%A //向LCD发送命令
%A void SendCommandToLCD(unsigned char command)
%A {
%A CheckState();
%A
%A rPDATD &= 0xFF7F; //set RS Low //select Command
%A rPDATD &= 0xFFBF; //set RW Low //select Write
%A
%A rPDATC &= 0xFF0F;
%A rPDATC |= ((command&0x0010)<<3);
%A rPDATC |= ((command&0x0020)<<1);
%A rPDATC |= ((command&0x0040)>>1);
%A rPDATC |= ((command&0x0080)>>3);
%A rPDATD &= 0xFFF0;
%A rPDATD |= (command&0x000F);
%A
%A //Uart_Printf("command=%x\n",command);
%A //Uart_Getch();
%A
%A LCD_delay(1);
%A rPDATC |= 0x0200; //set E High
%A LCD_delay(1);
%A rPDATC &= 0xFDFF; //set E Low
%A LCD_delay(1);
%A }
%A
%A //写显示数据
%A void WriteByte(unsigned char dat)
%A {
%A CheckState();
%A
%A rPDATD |= 0x0080; //set RS High // select Data
%A rPDATD &= 0xFFBF; //set RW Low // select Write
%A
%A rPDATC &= 0xFF0F;
%A rPDATC |= ((dat&0x0010)<<3);
%A rPDATC |= ((dat&0x0020)<<1);
%A rPDATC |= ((dat&0x0040)>>1);
%A rPDATC |= ((dat&0x0080)>>3);
%A rPDATD &= 0xFFF0;
%A rPDATD |= (dat&0x000F);
%A
%A //Uart_Printf("dat=%x\n",dat);
%A //Uart_Getch();
%A
%A LCD_delay(1);
%A rPDATC |= 0x0200; //set E High
%A LCD_delay(1);
%A rPDATC &= 0xFDFF; //set E Low
%A LCD_delay(1);
%A }
%A
%A //读数据
%A unsigned char ReadByte(void)
%A {
%A unsigned char dat;
%A
%A CheckState();
%A
%A rPDATD |= 0x0080; //set RS High // select data
%A rPDATD |= 0xFFBF; //set RW High // select Write
%A rPDATD |= 0x000F;//Write data
%A rPDATC |= 0x00F0;//Write data
%A LCD_delay(1);
%A rPDATC |= 0x0200; //set E High
%A LCD_delay(1);
%A rPDATC &= 0xFDFF; //set E Low
%A
%A rPCONC=0x55550055; //set D4~D7 as input
%A rPCOND=0x5500; //set D0~D3 as input
%A //read status
%A rPDATD &= 0xFF7F; //set RS Low // select command
%A rPDATD |= 0x0040; //set RW High // select Read
%A LCD_delay(1);
%A rPDATC |= 0x0200; //set E High
%A LCD_delay(1);
%A dat=(rPDATC&0xF0)|(rPDATD&0x0F);
%A rPDATC &= 0xFDFF; //set E Low
%A
%A rPCONC=0x55555555; //set D4~D7 as output
%A rPCOND=0x5555; //set D0~D3 as output
%A
%A return(dat);
%A }
%A
%A //设定行地址(页)--X 0-7
%A void SetLine(unsigned char line)
%A {
%A line=line & 0x07; // 0<=line<=7
%A line=line | 0xb8; //1011 1xxx
%A SendCommandToLCD(line);
%A }
%A
%A //设定列地址--Y 0-63
%A void SetColumn(unsigned char column)
%A {
%A column=column &0x3f; // 0=<column<=63
%A column=column | 0x40; //01xx xxxx
%A SendCommandToLCD(column);
%A }
%A
%A //设定显示开始行--XX
%A void SetStartLine(unsigned char startline) //0--63
%A {
%A startline=startline & 0x07;
%A startline=startline | 0xc0; //1100 0000
%A SendCommandToLCD(startline);
%A }
%A
%A //清屏screen: 0-全屏,1-左屏,2-右
%A void ClearScreen(unsigned char screen)
%A {
%A unsigned char i,j;
%A SelectScreen(screen);
%A for(i=0;i<8;i++)
%A {
%A SetLine(i);
%A SetColumn(0);
%A for(j=0;j<64;j++)
%A {
%A WriteByte(0x00);
%A LCD_delay(1);
%A }
%A }
%A }
%A
%A void LCD_Output(int xStart,int yStart,int width,int height,char* data,unsigned char mode)
%A {
%A int i,chWidth,toffset;
%A int chOffset,xOffset;
%A unsigned char xbmp,xbmp1;/*Max width <=16*/
%A
%A chOffset=xStart % 8;
%A xOffset=xStart / 8;
%A chWidth=(width+7)/8;
%A
%A for(i=yStart;i<yStart+height;i++)
%A {
%A if(chWidth==1)
%A {
%A if(mode == INVERSE_MODE)
%A xbmp=~data[i-yStart];
%A else
%A xbmp=data[i-yStart];
%A LCD_buf[i*16+xOffset] &=(0xff << (8-chOffset));
%A LCD_buf[i*16+xOffset] |=(xbmp >> chOffset);
%A LCD_buf[i*16+xOffset+1] &=(0xff >>chOffset);
%A LCD_buf[i*16+xOffset+1] |=(xbmp << (8-chOffset));
%A }
%A else if(chWidth==2)
%A {
%A
%A if(mode == INVERSE_MODE)
%A {
%A xbmp = ~data[(i-yStart)*2];
%A xbmp1= ~data[(i-yStart)*2+1];
%A }
%A else
%A {
%A xbmp = data[(i-yStart)*2];
%A xbmp1=data[(i-yStart)*2+1];
%A }
%A LCD_buf[i*16+xOffset] &=(0xff << (8-chOffset));
%A LCD_buf[i*16+xOffset] |=(xbmp >> chOffset);
%A LCD_buf[i*16+xOffset+1] &=(0xff >>(width - (8-xOffset)));
%A LCD_buf[i*16+xOffset+1] |=(xbmp << (8-chOffset)) |(xbmp1>>chOffset);
%A if((width - (8-chOffset))>8)
%A {
%A toffset=(width - (8-chOffset))-8;
%A LCD_buf[i*16+xOffset+2] &=(0xff >>toffset);
%A LCD_buf[i*16+xOffset+2] |=(xbmp1 << (width-8-toffset));
%A }
%A }
%A }
%A
%A }
%A
%A void display_text(int xStart,int pStart,char* txt,unsigned char mode)
%A {
%A int str1, str2;
%A t_font_bitmap* chrBmp;
%A t_font_bitmap* errBmp[2] = {NULL,NULL};
%A unsigned short code;
%A int x = xStart ;
%A unsigned char isuni=0;
%A
%A if (!txt)
%A return;
%A
%A if(txt[0]==0x80)
%A {
%A isuni=1;
%A txt=&txt[2];
%A }
%A
%A code = 0xFFFF;
%A while ((code!=0) && (x<=LCD_SIZE_X+4))
%A {
%A if (isuni)
%A {
%A str1 = *txt;
%A str2 = *(txt+1);
%A code = ((str1<<8)&0xFF00) | (str2&0x00ff);
%A }
%A else
%A {
%A str1 = *txt;
%A str2 = 0x00;
%A code = ((str2<<8)&0xFF00) | (str1&0x00ff);
%A }
%A if (code != 0)
%A {
%A chrBmp = get_bitmap(code);
%A if (chrBmp == NULL)
%A {
%A errBmp[0] = get_bitmap(str1);
%A errBmp[1] = get_bitmap(str2);
%A }
%A }
%A else //end of string reached
%A chrBmp =NULL;
%A
%A if (chrBmp != NULL)
%A {
%A LCD_Output(x,pStart,chrBmp->width,chrBmp->height,(char*)chrBmp->bitmap,mode);
%A x = x + chrBmp->width;
%A }
%A if(isuni )
%A txt += 2;
%A else
%A txt ++;
%A }
%A }
%A
%A
%A void LCD_refresh(void)
%A {
%A int i,j,k;
%A unsigned char tt;
%A
%A SelectScreen(2);
%A for(j=0;j<8;j++)
%A {
%A SetLine(j);
%A SetColumn(0);
%A for(i=0;i<8;i++)
%A {
%A for(k=0;k<8;k++)
%A {
%A tt=0x00;
%A tt |= (((LCD_buf[16*(8*j+0)+i]<<k)&0x80)>>7);
%A tt |= (((LCD_buf[16*(8*j+1)+i]<<k)&0x80)>>6);
%A tt |= (((LCD_buf[16*(8*j+2)+i]<<k)&0x80)>>5);
%A tt |= (((LCD_buf[16*(8*j+3)+i]<<k)&0x80)>>4);
%A tt |= (((LCD_buf[16*(8*j+4)+i]<<k)&0x80)>>3);
%A tt |= (((LCD_buf[16*(8*j+5)+i]<<k)&0x80)>>2);
%A tt |= (((LCD_buf[16*(8*j+6)+i]<<k)&0x80)>>1);
%A tt |= (((LCD_buf[16*(8*j+7)+i]<<k)&0x80)>>0);
%A WriteByte(tt);
%A LCD_delay(1);
%A }
%A }
%A
%A }
%A
%A SelectScreen(1);
%A for(j=0;j<8;j++)
%A {
%A SetLine(j);
%A SetColumn(0);
%A for(i=8;i<16;i++)
%A {
%A for(k=0;k<8;k++)
%A {
%A tt=0x00;
%A tt |= (((LCD_buf[16*(8*j+0)+i]<<k)&0x80)>>7);
%A tt |= (((LCD_buf[16*(8*j+1)+i]<<k)&0x80)>>6);
%A tt |= (((LCD_buf[16*(8*j+2)+i]<<k)&0x80)>>5);
%A tt |= (((LCD_buf[16*(8*j+3)+i]<<k)&0x80)>>4);
%A tt |= (((LCD_buf[16*(8*j+4)+i]<<k)&0x80)>>3);
%A tt |= (((LCD_buf[16*(8*j+5)+i]<<k)&0x80)>>2);
%A tt |= (((LCD_buf[16*(8*j+6)+i]<<k)&0x80)>>1);
%A tt |= (((LCD_buf[16*(8*j+7)+i]<<k)&0x80)>>0);
%A WriteByte(tt);
%A LCD_delay(1);
%A }
%A }
%A
%A }
%A }
%A
%A
%A void Test_LCD(void)
%A {
%A int ii;
%A
%A rPCONC=0x55555555;
%A rPCOND=0x5555;
%A
%A //reset LCD
%A LCD_delay(300);
%A rPDATC &= 0xFEFF; //set /RST Low
%A LCD_delay(300);
%A rPDATC |= 0x0100; //set /RST High
%A
%A SelectScreen(0);
%A CheckState();
%A SendCommandToLCD(0x3F); //关显示
%A
%A ClearScreen(1);//清屏
%A ClearScreen(2);
%A
%A SelectScreen(0);
%A SendCommandToLCD(0x3F); //开显示
%A SelectScreen(0);
%A SetStartLine(0); //开始行:0
%A
%A SendCommandToLCD(0x3E); //关显示
%A
%A for(ii=0;ii<16*64;ii++)
%A LCD_buf[ii]=0;
%A
%A //English showing
%A display_text(0,16,"hello world!",0);
%A
%A LCD_refresh();
%A
%A SelectScreen(0);
%A SendCommandToLCD(0x3F); //开显示
%A }
%A
%A
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。