UC1698测试程序

发布时间:2016/11/15 13:43:53

/*
LCD controller uc1698
SEGMENT SEG112~SEG271
since the segment is dissymmetrical,do not use X-mirror
extern MPU Crystal:20M
*/
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
#include<qh.h>
#define uchar unsigned char
#define uint unsigned int
#define dport P1


sbit wr=P3^0;
sbit rd=P3^1;
sbit cs=P3^2;
sbit cd=P3^4;
sbit rst=P3^5;


uchar data_4byte[4];
/*******延时*********/
void delay_us(uint us)
{
while(us--);
}


void delay_ms(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<120;i++);
}
/**flag=0,write command;flag=1,write data**/
void write(bit flag,uchar dat)
{
cs=0;
cd=flag;
wr=0;
rd=1;
dport=dat;
wr=1;
}
/***********读数据*******/
uchar read(bit flag)       //flag=0,READ command;flag=1,READ data
{
uchar temp;
dport=0xff;
cs=0;
cd=flag;
rd=0;
wr=1;
temp=P1;
rd=1;
return temp;
}
/*****初始化****/
void init(void)
{
cs=0;


/*reset*/
rst=0;
delay_ms(2); //power on reset
rst=1;
delay_ms(200);
write(0,0xe2); //reset by command
delay_ms(2);


/*power control*/
write(0,0xe9); //Bias Ratio:1/10 bias
// write(0,0xeb); //Bias Ratio:1/12 bias
        write(0,0x2b); //power control set as internal power
write(0,0x25); //set temperate compensation as 0.05%
//      write(0,0x24); //set temperate compensation as 0%


write(0,0x81); //electronic Potentiometer,调整对比度
write(0,0xbf);
 //      write(0,0xa0);
/*display control*/
write(0,0xa4); //all pixel off
write(0,0xa6); //inverse display off


/*lcd control*/
write(0,0xc0); //18:partial display and MX disable,MY enable
        write(0,0xa3);        //line rate 15.2klps
write(0,0xd1); //20:rgb-rgb
write(0,0xd5); //21:4k color mode
write(0,0x84); //11:partial display control disable




/*n-line inversion*/
write(0,0xc8);                  // SET N-LINE INVERSION
write(0,0x10); //enable NIV


/*com scan fuction*/
write(0,0xda); //22:enable FRC,PWM,LRM sequence


/*window*/
write(0,0xf4); //wpc0:column
write(0,0x25); //start from 130
write(0,0xf6); //wpc1
write(0,0x5A); //end:272


write(0,0xf5); //wpp0:row
write(0,0x00); //start from 0
write(0,0xf7); //wpP0
write(0,0x9F); //end 160


write(0,0xf8); //inside mode


write(0,0x89); //12:RAM control,




write(0,0xad); //display on,select on/off mode.Green Enhance mode disable
//        write(0,0xaf);                  //32-shade mode
/*scroll line*/
write(0,0x40); //low bit of scroll line
write(0,0x50); //high bit of scroll line
write(0,0xc4); //enable FLT and FLB, 18:SET LCD MAPPING CONTROL
write(0,0x90); //13:FLT,FLB set
write(0,0x00);


/*partial display*/
write(0,0x84); //11:set partial display control:off
write(0,0xf1); //com end
write(0,0x9f); //160
write(0,0xf2); //display start
write(0,0); //0
write(0,0xf3); //display end
write(0,159); //160


}
/********起始地址************/
void goto_lcd(uchar x,uchar y)
  {
  uchar x0;
  x=37+x;//地址从25H开始的,每个地址对应3个像素点【3个像素点对应RGB】X=0~54
  x0=0x00|(x&0x0f);
  x=0x10|((x&0xf0)>>4);
  write(0,0x89);//12:SET RAM ADDRESS CONTROL
  write(0,x0);//Set Column Address LSB CA[3:0]
  write(0,x);//Set Column Address MSB CA[7:4]
  write(0,0x60|(y&0x0f));//9:Set Row Address LSB RA [3:0]
  write(0,0x70|((y&0xf0)>>4));//9:Set Row Address MSB RA [7:4]
  }
/*********转换字节*********/
void write_4_byte(uchar dat)    //          一个地址对应3个像素点 ,1个半字节
                                //                 1                2
{                               //         1素点 2素点 3素点  1素点 2素点 3素点
                                //         RRRR  GGGG   BBBB  RRRR  GGGG BBBB
 uchar k,kk,kkk;
  uchar i,ii,iii;
  uchar dat0;


  kk=dat;
  for(k=0;k<3;k++)
  {
  kkk=0xc0&kk;
  switch(kkk)
  {


  /*case 0x00: data_4byte[k]=0x00; break;
  case 0x80: data_4byte[k]=0x80; break;
  case 0x40: data_4byte[k]=0x08; break;
  case 0xc0: data_4byte[k]=0x88; break; */


  case 0x00: data_4byte[k]=0x00; break;
  case 0x80: data_4byte[k]=0xf0; break;
  case 0x40: data_4byte[k]=0x0f; break;
  case 0xc0: data_4byte[k]=0xff; break;
  default: break;
  }
  kk=kk<<2;
  write(1,data_4byte[k]);
  }
}
/*****************6x8*******************/
void display68(uchar x,uchar y,uchar coder)
{
  uchar i;
  for(i=0;i<8;i++)
  {
   goto_lcd(x,y);
   write_4_byte(tab[coder*8+i]);
   y++;
  }}
void display_68(uchar x,uchar y,uchar m,uchar endm)
{
 uchar i;
 for(i=m;i<endm;i++)
 {
 display68(x,y,i);x=x+2;
 }
}
/**********************************************************
16*16 汉字写方式采用4K 的RGB, 没有灰阶的
 当模块采用单色屏时 4个二进制表示一个像素点
 二进制的为1时,像素点被点亮。位是0时,像素点灭
 如1000像素点亮, 0111像素点灭,程序采用8,4,2,1法分解字节
************************************************************/
void hz(uchar x,uchar y,uchar coder)
{
 uchar i,j,dat0,dat1,dat2,dat3,dat4,dat5,dat6,dat7;
 uchar data0, data1,data2,data3,data4,data5,data6,data7;
 uchar *p;
 p=32*coder+tabhz;
 for(i=0;i<16;i++)
 {
 goto_lcd(x,y+i);
 write(0,0x89);//SET RAM ADDRESS CONTROL
 /**分解个字节***/
 dat7=*p&0x80;
 dat6=*p&0x40;
 dat6=dat6<<1;
 dat6=dat6>>4;


 dat5=*p&0x20;
 dat5=dat5<<2;
 dat4=*p&0x10;
 dat4=dat4<<3;
 dat4=dat4>>4;


 dat3=*p&0x08;
 dat3=dat3<<4;
 dat2=*p&0x04;
 dat2=dat2<<5;
 dat2=dat2>>4;


 dat1=*p&0x02;
 dat1=dat1<<6;
 dat0=*p&0x01;
 dat0=dat0<<7;
 dat0=dat0>>4;
  p++;
/**分解第二个字节***/
 data7=*p&0x80;
 data6=*p&0x40;
 data6=data6<<1;
 data6=data6>>4;


 data5=*p&0x20;
 data5=data5<<2;
 data4=*p&0x10;
 data4=data4<<3;
 data4=data4>>4;


 data3=*p&0x08;
 data3=data3<<4;
 data2=*p&0x04;
 data2=data2<<5;
 data2=data2>>4;


 data1=*p&0x02;
 data1=data1<<6;
 data0=*p&0x01;
 data0=data0<<7;
 data0=data0>>4;


 write(1,dat7|dat6);
 write(1,dat5|dat4);
 write(1,dat3|dat2);


 write(1,dat1|dat0);
 write(1,data7|data6);
 write(1,data5|data4);


 write(1,data3|data2);
 write(1,data1|data0);
 //write(1,0x00);
 p++;
 write(0,0x88);//SET RAM ADDRESS CONTROL,停止自加
}}
void hz_16(uchar x,uchar y)
{
  uchar i;
  for(i=0;i<10;i++)
  {hz(x,y,i);x+=5;}
  write(0,0x88);//SET RAM ADDRESS CONTROL,停止自加
}
/**********************************************************
16*16 汉字写方式采用4K 的RGB,带有灰阶
 当模块采用单色屏时 4个二进制表示一个像素点
 二进制的为1时,像素点被点亮。位是0时,像素点灭
 如1000像素点亮, 0111像素点灭,程序采用8,4,2,1法分解字节
************************************************************/
void hz_gray(uchar x,uchar y,uchar coder)
{
 uchar i,j,dat0,dat1,dat2,dat3,dat4,dat5,dat6,dat7;
 uchar data0, data1,data2,data3,data4,data5,data6,data7;
 uchar *p;
 p=32*coder+tabhz;
 for(i=0;i<16;i++)
 {
 goto_lcd(x,y+i);
 write(0,0x89);//SET RAM ADDRESS CONTROL
 /**分解个字节***/
 dat7=*p&0x80;
 if(dat7==0x80)
 {dat7=0xf0;}
 else
 {dat7=0x00;}
 dat6=*p&0x40;
 if(dat6==0x40)
 {dat6=0x0f;}
 else
 {dat6=0x00;}


 dat5=*p&0x20;
 if(dat5==0x20)
 {dat5=0xf0;}
 else
 {dat5=0x00;}
 dat4=*p&0x10;
 if(dat4==0x10)
 {dat4=0x0f;}
 else
 {dat4=0x00;}


 dat3=*p&0x08;
 if(dat3==0x08)
 {dat3=0xf0;}
 else
 {dat3=0x00;}
 dat2=*p&0x04;
 if(dat2==0x04)
 {dat2=0x0f;}
 else
 {dat2=0x00;}


 dat1=*p&0x02;
 if(dat1==0x02)
 {dat1=0xf0;}
 else
 {dat1=0x00;}
 dat0=*p&0x01;
 if(dat0==0x01)
 {dat0=0x0f;}
 else
 {dat0=0x00;}
  p++;
/**分解第二个字节***/
 data7=*p&0x80;
 if(data7==0x80)
 {data7=0xf0;}
 else
 {data7=0x00;}
 data6=*p&0x40;
 if(data6==0x40)
 {data6=0x0f;}
 else
 {data6=0x00;}


 data5=*p&0x20;
 if(data5==0x20)
 {data5=0xf0;}
 else
 {data5=0x00;}
 data4=*p&0x10;
 if(data4==0x10)
 {data4=0x0f;}
 else
 {data4=0x00;}


 data3=*p&0x08;
 if(data3==0x08)
 {data3=0xf0;}
 else
 {data3=0x00;}
 data2=*p&0x04;
 if(data2==0x04)
 {data2=0x0f;}
 else
 {data2=0x00;}


 data1=*p&0x02;
 if(data1==0x02)
 {data1=0xf0;}
 else
 {data1=0x00;}
 data0=*p&0x01;
 if(dat0==0x01)
 {data0=0x0f;}
 else
 {data0=0x00;}


 write(1,dat7|dat6);
 write(1,dat5|dat4);
 write(1,dat3|dat2);


 write(1,dat1|dat0);
 write(1,data7|data6);
 write(1,data5|data4);


 write(1,data3|data2);
 write(1,data1|data0);
 //write(1,0x00);
 p++;
 write(0,0x88);//SET RAM ADDRESS CONTROL,停止自加
}}
void hz_gray16(uchar x,uchar y)
{
  uchar i;
  for(i=0;i<10;i++)
  {hz_gray(x,y,i);x+=5;}
  write(0,0x88);//SET RAM ADDRESS CONTROL,停止自加
}
/**********************************************************
 8*16字母写方式采用4K 的RGB,
 当模块采用单色屏时 4个二进制表示一个像素点
 二进制的为1时,像素点被点亮。位是0时,像素点灭
 如1000像素点亮, 0111像素点灭,程序采用8,4,2,1法分解字节
************************************************************/
void display816(uchar x,uchar y,uchar coder)
{
 uchar i;
 uchar dat0,dat1,dat2,dat3,dat4,dat5,dat6,dat7;
 uchar *p;
 p=16*coder+tab816;
 for(i=0;i<16;i++)
 {
 goto_lcd(x,y+i);
 write(0,0x89);//SET RAM ADDRESS CONTROL
 dat7=*p&0x80;
 dat6=*p&0x40;
 dat6=dat6>>3;


 dat5=*p&0x20;
 dat5=dat5<<2;
 dat4=*p&0x10;
 dat4=dat4>>1;


 dat3=*p&0x08;
 dat3=dat3<<4;
 dat2=*p&0x04;
 dat2=dat2<<1;


 dat1=*p&0x02;
 dat1=dat1<<6;
 dat0=*p&0x01;
 dat0=dat0<<3;


 write(1,dat7|dat6);
 write(1,dat5|dat4);
 write(1,dat3|dat2);


 write(1,dat1|dat0);
 write(1,0x00);
  p++;
  }
}
void dispay_816(uchar x,uchar y)
{
 uchar i;
 for(i=0;i<10;i++)
 {display816(x,y,i);x+=3;}
}
/*************************
  写入边框
**********************************/
void write_bian()
{
   uchar i,j;


  for(j=1;j<159;j++)
 {
 goto_lcd(0,j);
 write(0,0x89);//SET RAM ADDRESS CONTROL
 write(1,0xf0);
 write(1,0x0);
 write(1,0x0);


 goto_lcd(53,j);
 write(1,0xff);
 write(1,0xff);
 write(1,0xff);
 }
   delay_ms(5);
 for(i=0;i<100;i=i+2)
 {
 goto_lcd(i,0);
 write(0,0x89);//SET RAM ADDRESS CONTROL
 write(1,0xff);
 write(1,0xff);
 write(1,0xff);


 goto_lcd(i,159);
 write(1,0xff);
 write(1,0xff);
 write(1,0xff);
  }


}
/**********************************************************
24*24汉字写方式采用4K 的RGB,
 当模块采用单色屏时 4个二进制表示一个像素点
 二进制的为1时,像素点被点亮。位是0时,像素点灭
 如1000像素点亮, 0111像素点灭,程序采用8,4,2,1法分解字节
 type=1,ascii;type=2,Chinese character
************************************************************/
void words(uchar x,uchar y,uchar z,uchar type,uchar *p)
{
uchar i,k,j,m,n,l,x0,dat0,dat1,dat2,dat3,dat4,dat5,dat6;
        /*
x=37+x;//地址从25H开始的,每个地址对应3个像素点【3个像素点对应RGB】X=0~54
x0=0x00|(x&0x0f);
x=0x10|((x&0xf0)>>4); */
for(i=0;i<z;i++)//纵向z=3,z=2个字节 每8行  3*8=24行  2*8=16行
{
n=i*12*type;     //每隔N个像素点后换行
for(j=0;j<8;j++)//每行的转换 一行包含 12*type个像素
{
m=i*8+j;       //换行地址
                        goto_lcd(x,y+m);
                        /*
write(0,0x89);//SET RAM ADDRESS CONTROL
write(0,x0);//Set Column Address LSB CA[3:0]
write(0,x);//Set Column Address MSB CA[7:4]
write(0,0x60|((y+m)&0x0f));//Set Row Address LSB RA [3:0]
write(0,0x70|(((y+m)&0xf0)>>4));//Set Row Address MSB RA [7:4]
/*数据转换 每次转换完成6个点的转换,转换后6个点变成 2个12点,3个字节,字符是2次循环【12点】
 当type=4时 函数将转换6*4=24个像素点后换行。 当type=2时 函数将转换6*2=12个像素点后换行。
 l变量当做转换的像素点变量值 以6个像素点转变 k*6。 */


for(k=0;k<2*type;k++)
                        {
l=k*6+n;
dat6=0x01<<j;        //dat6变量对应的位数
dat0=(*(p+l))&dat6;  //数组第0个元素 对应的位数
dat0=dat0>>j;
dat0<<=7;


dat1=(*(p+l+1))&dat6;
dat1=dat1>>j;
dat1<<=3;


dat2=*(p+2+l)&dat6;
dat2=dat2>>j;
dat2<<=7;


dat3=(*(p+3+l))&dat6;
dat3=dat3>>j;
dat3<<=3;


dat4=(*(p+4+l))&dat6;
dat4=dat4>>j;
dat4<<=7;


dat5=(*(p+5+l))&dat6;
dat5=dat5>>j;
dat5<<=3;


write(1,dat0|dat1);
write(1,dat2|dat3);
write(1,dat4|dat5);


}
write(0,0x88);//SET RAM ADDRESS CONTROL,停止自加
}
}
write(0,0x89);//SET RAM ADDRESS CONTROL
}
 /****120*120图形显示程序*****/
void picture(uchar *p)
{
uchar i,k;




for(i=0;i<120;i++)
{
      write(0,0x60|(i&0x0f));//Set Row Address LSB RA [3:0]
write(0,0x70|((i&0xf0)>>4));//Set Row Address MSB RA [7:4]
      write(0,0x05); //culomn address LSB//25H开始
      write(0,0x12); //culomn address MSB
for(k=0;k<60;k++)//120个点,每个点占4位
{
write(1,*p++);//写数据
}
}
}
/***奇数行时写入dat2 偶数行写入dat1***/
void lcdscan(uchar dat1,uchar dat2)
{
uchar i,j;
write(0,0x60); //row address LSB
write(0,0x70); //row address MSB
write(0,0x05); //culomn address LSB
write(0,0x12); //culomn address MSB


for(j=0;j<160;j++)
{
for(i=0;i<27;i++)
{
if(j%2==0)
{
write(1,dat1);
write(1,dat1);
write(1,dat1);
}
else
{
write(1,dat2);
write(1,dat2);
write(1,dat2);
}
}
}
}
/***character***/
void character(void)
{
uchar *q;
uchar i,j;
//temp[3],table[6];
lcdscan(0x00,0x00);
     for(i=0;i<4;i++)//
{
        q=hanzi+i*72;
        j=9*i+4; // j=8*i+4;// 每个汉字是24*24点的,计算其地址,24个点占用地址为8个
words(j,10,3,2,q);
}


for(i=0;i<11;i++)//controller:
{
q=zimu+i*36;
j=4*i+4;
words(j,40,3,1,q);
}


for(i=11;i<18;i++)//uc1698u
{
q=zimu+i*36;
j=4*(i-11)+4;
words(j,70,3,1,q);
}
for(i=18;i<25;i++)//status:
{
q=zimu+i*36;
j=4*(i-18)+1;
words(j,100,3,1,q);
}
        for(i=0;i<10;i++)//12*12
{
q=tab12+i*24;
j=4*i+2;
words(j,140,2,1,q);
}


}
/******读出数据*****/
void write_dot(uchar x,uchar y)
{
 uchar dat0,dat1,dat2;
 uchar n,m;
 m=x/3;
 n=x%3;


 goto_lcd(m,y);
 dat0=read(1);
 dat1=read(1);
 dat2=read(1);
 goto_lcd(m,y);
 switch(n)
 {
        case 0:
             write(1,dat0&0xf0);
             write(1,0x00);


             break;
        case 1:
              write(1,dat1&0x0f);
              write(1,0x00);
             break;
        case 2:
             write(1,dat2&0xff);
             write(1,0x00);
             break;
 }


 }
/***主函数***/
void main(void)
{
// uchar *p;


uchar i,j,k;


while(1)
{
init();




write(0,0x84); //12,set partial display off


lcdscan(0xf0,0x0f); //雪花
delay_ms(500);




  write(0xff,0xff); //all pixel on
  delay_ms(500);


lcdscan(0xff,0x00); //横线
delay_ms(500);


lcdscan(0x00,0x00);
character();
                 write_bian();
delay_ms(800);
      lcdscan(0x00,0x00);
//hz_16(0,20);
//hz_16(1,40);
//hz_16(2,60);
//hz_16(1,80);
//dispay_816(5,100);
//delay_ms(1000);
//lcdscan(0x00,0x00);
//hz_gray16(0,60);
//hz_gray16(2,90);
//hz_gray16(1,120);


//write_dot(3,30);
//write_dot(4,30);
//write_dot(5,30);
//write_dot(6,30);


//hz_16(10,40);
//display_68(0,0,26,52);
//display_68(0,16,0,26);
//display_68(0,32,52,78);
  //delay_ms(800);
 //while(1);




}
}






上一篇:大尺寸OLED或将在2020年实现喷墨打印
下一篇:3D玻璃投资机会显现 与OLED屏完美搭配