新闻  |   论坛  |   博客  |   在线研讨会
KS0108显示屏在44B0上的驱动
yanqin | 2009-04-16 16:51:22    阅读:1380   发布文章

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客