📄 mylcd.c
字号:
LCD_Draw_Rectangle(40,50,20,10,1);
break;
case 0x5e:
dis_clr();
LCD_Draw_FillRectangle(50,50,90,90,1);
break;
case 0x79:
dis_clr();
LCD_Draw_circle(60,30,20,1);
break;
case 0x71:
dis_clr();
dis_start0();
break;
default: ;
}
}
Delay(5000);
}
}
/****************************************************************************************/
void dis_clr(void)
{
unsigned char x,y;
for(y=0;y<8;y++)
{
for(x=0;x<128;x++)
lcd_wrda(x,y,0x00);
}
}
/****************************************************************************************/
void dis_full(void)
{
unsigned char x,y;
for(y=0;y<8;y++)
{
for(x=0;x<128;x++)
lcd_wrda(x,y,0xff);
}
}
/****************************************延时*******************************************/
void Delay(Uchar MS)
{
Uchar us,usn;
while(MS!=0)
{ usn = 4;
while(usn!=0)
{
us=0xf0;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
/****************************************自定义************************************/
void checkbusy(void)
{
addr=0x980e;
_nop_();_nop_();
_nop_();_nop_();
do
{
tp=addr;
}while((*tp&0x80)==0x80);
addr=0x180f;
}
//write command to lcd
void lcd_wrct(unsigned char dd)
{
DISABLE_INTERRUPTS;
addr=0x980c;
tp=addr;
*tp=dd;
addr=0x180c;
_nop_();_nop_();
_nop_();_nop_();
addr=0x180d;
ENABLE_INTERRUPTS;
}
//set write or read lcd position
void set_xy(unsigned char x,unsigned char y)
{
DISABLE_INTERRUPTS;
checkbusy();
y&=0x07;
y|=0xB8;
lcd_wrct(y);
x&=0x3F;
x|=0x40;
lcd_wrct(x);
ENABLE_INTERRUPTS;
}
//write data to lcd
void lcd_wrda(unsigned char x,unsigned char y,unsigned char dd)
{
DISABLE_INTERRUPTS;
set_xy(x,y);
checkbusy();
if(x<64)
{
addr=0x9805;
tp=0x9805;
}
else
{
addr=0x9809;
tp=0x9809;
}
*tp=dd;
// SelectLCD();
// addr&=0x1fff;
// _nop_();_nop_();
// _nop_();_nop_();
// UnSelectLCD();
// addr|=0x8000;
ENABLE_INTERRUPTS;
}
//read data from lcd
unsigned char lcd_rdda(unsigned char x,unsigned char y)
{
unsigned char xdata readdata;
set_xy(x,y);
checkbusy();
if(x<64)
{//SelectLeft();
addr=0x9807;
tp=addr;
addr=0x1805;
}
else
{//SelectRight();
addr=0x980b;
tp=addr;
addr=0x1809;
}
readdata=*tp;
checkbusy();
if(x<64)
{//SelectLeft();
addr=0x9807;
tp=addr;
addr=0x1805;
}
else
{//SelectRight();
addr=0x980b;
tp=addr;
addr=0x1809;
}
readdata=*tp;
return readdata;
}
//显示开机画面
void dis_start(void)
{
unsigned char x,y;
for(y=0;y<8;y++)
{
for(x=0;x<128;x++)
{
_nop_();_nop_();
lcd_wrda(x,y,0xAA); _nop_();_nop_();
lcd_wrda(x+1,y,0x55);_nop_();_nop_();
x+=1;
}
}
}
// draw dot in lcd (x,y)
void LCD_Draw_dot(BYTE x,BYTE y,bool flag)
{
R_BYTE temp,bit_x;
bit_x=7-y%8;
y=7-y/8;
temp=lcd_rdda(x,y);
if (flag)
temp|=(1<<bit_x);
else
temp&=~(1<<bit_x);
lcd_wrda(x,y,temp);
}
//draw line in lcd (x1,x2)--(x2,y2)
bool LCD_Draw_line(BYTE x1,y1,x2,y2,bool flag)
{
R_BYTE i,temp;
float data k,b;
if ((x1>=MAX_BIT_X)||(x2>=MAX_BIT_X)||(y1>=MAX_BIT_Y)||(y2>=MAX_BIT_Y))
return false;
if (y1==y2)
{
if (x1>x2)
{
temp=x1;
x1=x2;
x2=temp;
}
for (i=x1;i<x2+1; i++)
LCD_Draw_dot(i,y1,flag);
}
else if (x1==x2)
{
if (y1>y2)
{
temp=y1;
y1=y2;
y2=temp;
}
for (i=y1;i<y2+1; i++)
LCD_Draw_dot(x1,i,flag);
}
else
{
if (abs(x2-x1)>=abs(y2-y1))
{
k=1.0*(y2-y1)/(x2-x1);
b=y1-k*x1;
if (x1>x2)
{
temp=x1;
x1=x2;
x2=temp;
}
for (i=x1;i<x2+1; i++)
{
temp=k*i+b;
LCD_Draw_dot(i,temp,flag);
}
}
else
{
k=1.0*(x2-x1)/(y2-y1);
b=x1-k*y1;
if (y1>y2)
{
temp=y1;
y1=y2;
y2=temp;
}
for (i=y1;i<y2+1; i++)
{
temp=k*i+b;
LCD_Draw_dot(temp,i,flag);
}
}
}
}
void LCD_Draw_circle(BYTE x,BYTE y,BYTE r,bool flag)
{
R_BYTE r_2,i,x1,y1,temp_x;
R_WORD temp;
r_2=0.707*r;
temp=r*r;
for (i=0; i<=r_2; i++)
{
if (flag)
{
if (!(i&0x01))
{
x1=i;
y1=sqrt(1.0*(temp-x1*x1))+0.5;
LCD_Draw_dot(x1+x,y1+y,flag);
LCD_Draw_dot(-x1+x,y1+y,flag);
LCD_Draw_dot(x1+x,-y1+y,flag);
LCD_Draw_dot(-x1+x,-y1+y,flag);
temp_x=x1;
x1=y1;
y1=temp_x;
LCD_Draw_dot(x1+x,y1+y,flag);
LCD_Draw_dot(-x1+x,y1+y,flag);
LCD_Draw_dot(x1+x,-y1+y,flag);
LCD_Draw_dot(-x1+x,-y1+y,flag);
}
}
else
{
x1=i;
y1=sqrt(1.0*(temp-x1*x1))+0.5;
LCD_Draw_dot(x1+x,y1+y,flag);
LCD_Draw_dot(-x1+x,y1+y,flag);
LCD_Draw_dot(x1+x,-y1+y,flag);
LCD_Draw_dot(-x1+x,-y1+y,flag);
temp_x=x1;
x1=y1;
y1=temp_x;
LCD_Draw_dot(x1+x,y1+y,flag);
LCD_Draw_dot(-x1+x,y1+y,flag);
LCD_Draw_dot(x1+x,-y1+y,flag);
LCD_Draw_dot(-x1+x,-y1+y,flag);
}
}
}
void LCD_Draw_Rectangle(BYTE x1,y1,x2,y2, bool flag)
{
LCD_Draw_line(x1,y1,x2,y1,flag);
LCD_Draw_line(x1,y1,x1,y2,flag);
LCD_Draw_line(x2,y1,x2,y2,flag);
LCD_Draw_line(x1,y2,x2,y2,flag);
}
void LCD_Draw_FillRectangle(BYTE x1,y1,x2,y2, bool flag)
{
R_BYTE i;
for (i=x1; i<=x2; i++)
LCD_Draw_line(i,y1,i,y2,flag);
}
void LCD_Draw_byte(BYTE x,y, BYTE value)
{
R_BYTE temp,bit_x;
bit_x=y%8;
y=y/8;
if (bit_x==0)
lcd_wrda(x,y,value);
else
{
temp=lcd_rdda(x,y);
temp&=(0xff>>(8-bit_x));
temp|=(value<<bit_x);
lcd_wrda(x,y,temp);
temp=lcd_rdda(x,y+1);
temp&=(0xff<<bit_x);
temp|=(value>>(8-bit_x));
lcd_wrda(x,y+1,temp);
}
}
void LCD_Disp_Word(BYTE x,y,BYTE code *p,BYTE line,length)
{
R_BYTE i,j;
y+=(4<<line);
if (y>64)
y=64;
y=64-y;
for (i=0; i<line; i++)
for (j=0; j<length; j++)
LCD_Draw_byte(x+j,y+i*8, *p++);
}
void LCD_Disp_Word_F(BYTE x,y,BYTE code *p,BYTE line,length)
{
R_BYTE i,j;
y+=(4<<line);
if (y>64)
y=64;
y=64-y;
for (i=0; i<line; i++)
for (j=0; j<length; j++)
LCD_Draw_byte(x+j,y+i*8, ~(*p++));
}
void LCD_Disp_Time(BYTE x,y,BYTE code *p,BYTE line,length)
{
R_BYTE i,j;
y+=(4<<line);
if (y>64)
y=64;
y=64-y;
for (i=0; i<line; i++)
for (j=0; j<length; j++)
LCD_Draw_byte(x+j,y+i*8, *p++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -