📄 lcd.c
字号:
* 注意: none;
************************************************************************************/
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;
ENABLE_INTERRUPTS;
}
/***********************************************************************************
* 函数名称:lcd_rdda;
*
* 函数功能描述:从LCD中读数据;
*
* 输入参数:unsigned char类型坐标x,y,
*
* 返回数据:unsigned char类型读出数据;
*
* 注意: none;
************************************************************************************/
unsigned char lcd_rdda(unsigned char x,unsigned char y)
{
unsigned char xdata readdata;
set_xy(x,y);
checkbusy();
if(x<64)
{
addr=0x9807;
tp=addr;
addr=0x1805;
}
else
{
addr=0x980b;
tp=addr;
addr=0x1809;
}
readdata=*tp;
checkbusy();
if(x<64)
{
addr=0x9807;
tp=addr;
addr=0x1805;
}
else
{
addr=0x980b;
tp=addr;
addr=0x1809;
}
readdata=*tp;
return readdata;
}
/***********************************************************************************
* 函数名称:dis_start;
*
* 函数功能描述:显示开机画面;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
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;
}
}
}
/***********************************************************************************
* 函数名称:LCD_Draw_dot;
*
* 函数功能描述:画点(x,y);
*
* 输入参数:BYTE类型坐标x,y; bool类型标识flag;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCD_Draw_dot(unsigned char x,unsigned char 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);
}
/***********************************************************************************
* 函数名称:LCD_Draw_line;
*
* 函数功能描述:(x1,y1)--(x2,y2)处划线;
*
* 输入参数:BYTE类型坐标x1,y1,x2,y2; bool类型标识flag;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
bool LCD_Draw_line(unsigned char 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);
}
}
}
}
/***********************************************************************************
* 函数名称:LCD_Draw_circle;
*
* 函数功能描述:以(x,y)为圆心,r为半径画圆;
*
* 输入参数:unsigned char类型坐标x,y, bool类型标识flag;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCD_Draw_circle(unsigned char x,unsigned char y,unsigned char 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);
}
}
}
/***********************************************************************************
* 函数名称:LCD_Draw_Rectangle;
*
* 函数功能描述:以(x1,y1)和(x2,y2)为对角点画矩形;
*
* 输入参数:BYTE类型坐标x1,y1,x2,y2; bool类型标识flag;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCD_Draw_Rectangle(unsigned char 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);
}
/***********************************************************************************
* 函数名称:LCD_Draw_FillRectangle;
*
* 函数功能描述:以(x1,y1)和(x2,y2)为对角点画矩形实体;
*
* 输入参数:BYTE类型坐标x1,y1,x2,y2; bool类型标识flag;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCD_Draw_FillRectangle(unsigned char x1,y1,x2,y2, bool flag)
{
R_BYTE i;
for (i=x1; i<=x2; i++)
LCD_Draw_line(i,y1,i,y2,flag);
}
/***********************************************************************************
* 函数名称:LCD_Draw_byte;
*
* 函数功能描述:向LCD写一个字节数据;
*
* 输入参数:BYTE类型坐标x,y;BYTE类型字节数据value;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCD_Draw_byte(unsigned char x,y, unsigned char 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);
}
}
/***********************************************************************************
* 函数名称:LCD_Disp_Word;
*
* 函数功能描述:向LCD写一组数据,显示黑字符;
*
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据code区指针p;
* BYTE类型占用空间line*8行,length列
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCD_Disp_Word(unsigned char x,y,unsigned char code *p,unsigned char 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++);
}
/***********************************************************************************
* 函数名称: LCD_Disp_Word_F;
*
* 函数功能描述:向LCD写一组数据,显示白字符;
*
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据code区指针p;
* BYTE类型占用空间line*8行,length列
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCD_Disp_Word_F(unsigned char x,y,unsigned char code *p,unsigned char 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++));
}
/***********************************************************************************
* 函数名称: LCD_Disp_Time;
*
* 函数功能描述:向LCD写一组数据,显示时间;
*
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据code区指针p;
* BYTE类型占用空间line*8行,length列
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCD_Disp_Time(unsigned char x,y,unsigned char code *p,unsigned char 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 + -