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

📄 drawing_line.c

📁 单片机AT89C51扩展32KSRAM程序
💻 C
字号:


#include"reg51.h"
#include<drive_functions.h>
#include<math.h>
#define Graphic_Clear 0x01   //檫除点
#define Graphic_Not 0x02     //反相点
#define Graphic_Draw 0x03	 //画点
uchar j=0,i=0;
uchar r=32;
uchar  xdata  zhengxuan[]= {
    0x20, 0x23, 0x26, 0x29, 0x2C, 0x2F, 0x32, 0x34,
    0x36, 0x39, 0x3A, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3E, 0x3D, 0x3B, 0x39, 0x37,
    0x35, 0x33, 0x30, 0x2D, 0x2A, 0x27, 0x24, 0x21,
    0x1E, 0x1A, 0x17, 0x14, 0x11, 0x0F, 0x0C, 0x09,
    0x07, 0x05, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x01, 0x02, 0x03, 0x05, 0x07, 0x09,
    0x0B, 0x0E, 0x11, 0x14, 0x17, 0x1A, 0x1D, 0x20
	 }	;
/***********************在LCD上任意坐标画点********************************/

void DrawPoint(uchar X,uchar Y,uchar Type)
{ 									//X,Y化点的坐标Type画点的类型:反相点,檫除点,画点

   uchar DX = (Y >> 3);               //计算出属于哪个字节
   uchar BX = Y - (DX << 3);           //计算出属于字节哪一位
   uchar TempData = 0;


   if (X > 63)
   {
    chip_select=2;
      X -= 64;
   }
   else
   {
      chip_select=1;
   }

   SetPage(DX);             //设行地址
   SetColumn(X); 			//设列地址

   TempData = ReadData();   //读出所画点所在字节的内容

   switch (Type)            //对该字节进行相应操作
   {
       case Graphic_Clear:
          					TempData &= ~(1<< BX);
         					break;
      case Graphic_Not:
         					TempData ^= (1<< BX);
          					break;
      case Graphic_Draw:
          					TempData |= ( 1<< BX);
							break;
	  default:				break;
   }

   SetPage(DX);            //设置行地址
   SetColumn(X);  			//设置列地址
   WriteData(TempData); 	//把修改后的字节送回LCD,达到画点目的
}

/********插值法画任意两点之间直线的函数,函数中只用加减法,程序运行效率很高**********/

DrawLine(uchar x1,uchar y1,uchar x2,uchar y2)
{                           //x1,y1起点坐标;x2,y2终点坐标;
    uchar x,y;
    uchar d_x,d_y;
    char err=0;
    uchar temp=0;

    if(y2<y1){x=x1;y=y1;x1=x2;y1=y2;x2=x;y2=y;}
    d_y=y2-y1;
    if (d_y==0)
        {
        if (x1>x2) {x=x1;x1=x2;x2=x;}
        for ( x=x1;x<=x2;x++ ) DrawPoint(x,y1,Graphic_Draw);
        }
    else
        {
    if(x2>=x1){temp=1;d_x=x2-x1;}else d_x=x1-x2;
    x=x1;y=y1;DrawPoint(x,y,Graphic_Draw);
    if(temp&&(d_y<=d_x))
        while(x!=x2)
            {if(err<0){x=x+1;err=err+(y2-y);}
            else {x=x+1;y=y+1;err=err+(y2-y)-(x2-x);}
            DrawPoint(x,y,Graphic_Draw);
            }
    else if(temp&&(d_y>d_x))
        while(y!=y2)
            {d_x=x2-x;d_y=y2-y;
            if(err<0){x=x+1;y=y+1;err=err+d_y-d_x;}
            else {y=y+1;err=err-d_x;}
            DrawPoint(x,y,Graphic_Draw);
            }
    else if(!temp&&(d_y<=d_x))
        while(x!=x2)
            {d_x=x-x2;d_y=y2-y;
            if(err<0){x=x-1;err=err+d_y;}
            else {x=x-1;y=y+1;err=err+d_y-d_x;}
            DrawPoint(x,y,Graphic_Draw);
            }
    else if(!temp &&(d_y>d_x))
        while(y!=y2)
            {d_x=x-x2;d_y=y2-y;
            if(err<0){x=x-1;y=y+1;err=err+d_y-d_x;}
            else {y=y+1;err=err-d_x;}
            DrawPoint(x,y,Graphic_Draw);
            }
        }
}


/***********************************************************************/

void DrawLevel(void)
{

for(i=0;i<127;i++){DrawPoint(i,32,Graphic_Draw);}//画水平直线

}

/************************************************************************************/

 void DrawSineWave(void)
{
	uchar xn=0;
	uchar yn=32;
	uchar i,j;
	uchar xi,yi;

P27=1;
for(i=0;i<127;i++)
	{
		xi=i;
		j=i;
		if(j>63)
		{
                ACC=zhengxuan[j-64];
                yi=ACC;
                }
		else
	        {
            ACC=zhengxuan[j];
            yi=ACC;
                }

        P27=1;
		DrawLine(xn,yn,xi,yi);
		P27=1;
		xn=i;
		yn=yi;

		}

		}
/********************** main **********************************************************/

void main(void)
{
P2=0;
P27=1;
while(1)
{
DrawSineWave();
 ClearLCD();
}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -