📄 lcd.c
字号:
}
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函数功能:LCD清屏。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void LcdCls(void)
{
int i;
LcdSetXy(0,0); //设置回原点
LcdSetPoint(0,0); //设置为原点
for(i=0;i<6*84;i++) //全部字节写入0
{
//LcdWriteData(0);
((unsigned char *)LcdBuffer)[i]=0; //清空buffer
}
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函数功能:LCD初始化
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void LcdInit(void)
{
//LCD对应的IO口初始化
*AT91C_PIOA_PER=(1<<7)|(1<<8)|(1<<13)|(1<<14)|(1<<31); //Enable PA7,8,13,14,31
*AT91C_PIOA_OER=(1<<7)|(1<<8)|(1<<13)|(1<<14)|(1<<31); //Output Enable PA7,8,13,14,31
*AT91C_PIOA_SODR=(1<<7)|(1<<8)|(1<<13)|(1<<14)|(1<<31); //PA7,8,13,14,31设置为高
LcdReset();
LcdWriteCmd(0x21); // 使用扩展命令设置LCD模式
LcdWriteCmd(0xC5); // 设置偏置电压
LcdWriteCmd(0x06); // 温度校正
LcdWriteCmd(0x13); // 1:48
LcdWriteCmd(0x20); // 使用基本命令
LcdCls(); // 清屏
LcdRefresh(); //刷新
LcdWriteCmd(0x0c); // 设定显示模式,正常显示
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函数功能:设置LCD显示的点。
入口参数:坐标x、y。
返 回:无。
备 注:无。
********************************************************************/
void LcdSetPoint(int x, int y)
{
LcdX=x; //设置坐标
LcdY=y;
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函数功能:画一个点。
入口参数:坐标x、y。
返 回:无。
备 注:该函数调用完后必须调用LcdRefresh()函数刷新LCD才能显示。
********************************************************************/
void LcdDrawPoint(int x, int y)
{
if((x>83)||(y>47))return; //无效点,返回
LcdBuffer[y/8][x]|=(1<<(y%8)); //设置缓冲区中对应的点
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函数功能:擦除一个点。
入口参数:坐标x、y。
返 回:无。
备 注:该函数调用完后必须调用LcdRefresh()函数刷新LCD才能显示。
********************************************************************/
void LcdErasePoint(int x, int y)
{
if((x>83)||(y>47))return; //无效点,返回
LcdBuffer[y/8][x]&=(unsigned char)(~(1<<(y%8))); //设置缓冲区中对应的点
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函数功能:画一个圆。
入口参数:x、y:圆心坐标;r:圆半径。
返 回:无。
备 注:该函数调用完后必须调用LcdRefresh()函数刷新LCD才能显示。
********************************************************************/
void LcdDrawCircle(int x, int y, int r)
{
int Angle;
float s,c;
for(Angle=0;Angle<360;Angle++) //从0到360度画一个圆
{
//计算正弦和余弦值
s=r*sin(Angle*PI/180);
c=r*cos(Angle*PI/180);
//四舍五入
if(s<0)s-=0.5;
else s+=0.5;
if(c<0)c-=0.5;
else c+=0.5;
LcdDrawPoint(x+c,y+s); //画一个点
}
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函数功能:从点x0、y0画直线到x1、y1。
入口参数:起点坐标x0、y0,终点坐标x1、y1。
返 回:无。
备 注:该函数调用完后必须调用LcdRefresh()刷新LCD。
********************************************************************/
void LcdDrawLine(int x0, int y0, int x1, int y1)
{
int x,y,dx,dy,i,dir;
float d;
if((x0==x1)&&(y0==y1)) //如果只有一个点,那么就只画一个点
{
LcdDrawPoint(x0,y0);
return;
}
dx=abs(x1-x0); //求x、y的距离
dy=abs(y1-y0);
x=x0; //起点
y=y0;
if(dx>dy) //如果x距离长,则从x轴方向移动
{
//求出运动方向
if(x1>x0)dir=1;
else dir=-1;
for(i=1;i<dx+2;i++)
{
LcdDrawPoint(x,y); //绘制对应的点
x+=dir; //x改变一个单位
d=(float)(y1-y0)*i/dx;
if(d<0)d-=0.5;
else d+=0.5;
y=y0+d; //求出对应的y值
}
}
else //如果y距离长,则从y轴方向移动
{
if(y1>y0)dir=1; //求出运动方向
else dir=-1;
for(i=1;i<dy+2;i++)
{
LcdDrawPoint(x,y); //绘制对应的点
y+=dir; //y改变一个单位
d=(float)(x1-x0)*i/dy;
if(d<0)d-=0.5;
else d+=0.5;
x=x0+d; //求出对应的x值
}
}
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函数功能:填充一个矩形,包括边缘
入口参数:x0、y0:矩形的一个顶点;x1、y1:矩形的另一个顶点。
返 回:无。
备 注:该函数调用完后必须调用LcdRefresh()函数刷新LCD才能显示。
********************************************************************/
void LcdFill(int x0, int y0, int x1, int y1)
{
int d,i,y;
if(x0==x1) //只需要填充边沿
{
LcdDrawLine(x0,y0,x0,y1);//用直线填充
return;
}
if(y0==y1) //只需要填充边沿
{
LcdDrawLine(x0,y0,x1,y0);//用直线填充
return;
}
d=abs(y1-y0);
if(y1>y0) y=y0; //选择一个小的作为起点
else y=y1;
for(i=0;i<d;i++)
{
LcdDrawLine(x0,y,x1,y);//用直线填充
y++; //画下一条线
}
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函数功能:显示一个英文字符。
入口参数:要显示的字符的ASCII码。
返 回:无。
备 注:显示位置由LcdX和LcdY决定。如果显示范围,多余的部分将无法显示。
该函数调用完后必须调用LcdRefresh()函数刷新LCD才能显示。
********************************************************************/
void LcdPutChar(unsigned char ch)
{
unsigned char i,j,temp;
if((LcdX>83)||(LcdY>47))return; //超过范围,不用显示
ch-=' '; //字库是从空格开始的
for(i=0;i<6;i++) //每个字符有6个字节
{
if(LcdX>83)break;//如果超过范围,则跳过
temp=Font6x8[ch][i]; //取出一个字节
for(j=0;j<8;j++)
{
if(LcdY>47)break; //如果超过范围,则跳过
if(temp&0x01)LcdDrawPoint(LcdX,LcdY); //对应的位为1,画点
else LcdErasePoint(LcdX,LcdY); //对应的位为0,擦除
temp>>=1;
LcdY++;
}
LcdY-=j; //调整回Y值
LcdX++; //调整X值
}
}
/////////////////////////End of function/////////////////////////////
/********************************************************************
函数功能:在LCD上显示一个字符串。
入口参数:p:字符串指针。
返 回:无。
备 注:无。
********************************************************************/
void LcdPrints(unsigned char * p)
{
while(*p)
{
LcdPutChar(*p);
p++;
}
}
/////////////////////////End of function/////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -