⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 基于AT91SAM7S64单片机的USB鼠标的实现。
💻 C
📖 第 1 页 / 共 2 页
字号:
 }
}
/////////////////////////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 + -