- IC型号
企业档案
- 相关证件:
 
- 会员类型:
- 会员年限:12年
- 阿库IM:
- 地址:杭州市余杭区仁和街道永泰路2号22幢
- E-mail:752574498@qq.com
UC1698测试程序
发布时间: 2016/11/15 13:43:53 | 1437 次阅读
/*
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);
}
}
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);
}
}