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

📄 finalcd.h.bak

📁 薔介绍单片机的彩色液晶显示器开发里程。手把手
💻 BAK
📖 第 1 页 / 共 2 页
字号:
//液晶显示基本函数
/***********************************************************************
公司名称:  泰克通信
模 块 名: 液晶显示基本函数                 LCD 型号:NHC-01 
创 建 人:        输入输出模块组            日期:2004-03-17
修 改 人:        输入输出模块组            日期:2004-03-23 
功能描述: 1、液晶的基本读写操作
           2、画点、线、矩形、圆        
其他说明: 本程序在atmag128和nhc-01上调试通过
版 本:    alpha 0.01
**********************************************************************/
#include "chardata.h"
#define ada (*(volatile unsigned char*) 0x1118)//外部存储器地址映射,ada是读写地址
#define adb (*(volatile unsigned char*) 0x111a)//adb是横坐标
#define adc (*(volatile unsigned char*) 0x1119)//adc是纵坐标


//延时函数
void delay_1ms(void);//延时一毫秒
void delay(unsigned int n);//延时n毫秒

//液晶读写操作函数
void write(unsigned char x ,unsigned char y, unsigned char buffer1, unsigned char buffer2, unsigned char buffer3);//液晶输入程序
void read(unsigned char x,unsigned char y,char *b1,char *b2,char *b3);//读取一个字节位的数据

//液晶基本的画线、清屏等操作
void point(unsigned int x,unsigned char y,unsigned char color);// 在任意位置显示一个点的颜色
void clrall(char color);//清屏操作
void juxing(char x1,char y1,char x2,char y2,char color);//填充矩形
void cycle(char x,char y,unsigned int rad,char color);//以(x,y)为圆心,rad为半径,用color填充这个区域

//画直线算法,包含了两种特殊直线
void line(char x1,char y1,char x2,char y2,char color);//在(x1,y1)、(x2,y2)两点间画直线
void linex(char x1,char y1,char x2,char y2,char color);//在(x1,y1)、(x2,y2)两点间画直线(画船专用直线,可以不覆盖掉经维度线)
void xuline(char x1,char y1,char x2,char y2,char color);//在(x1,y1)、(x2,y2)两点间画虚线

//液晶上的汉字、字符显示
void hz_write(char x,char y,const unsigned char *hz,char color);//将输入的黑白格式转换为给lcd可以识别的彩色字模,这里的X值为点的位横作标其值为0~39
void hanzi(char x,char y,const unsigned char *hz,char color,char bs);//按照列位置显示任意大小颜色的字符,这里的X值为点的位横作标其值为0~39
void lettershow(char x,char y,char *hz,char color);//按照列位置显示任意大小颜色的字符,这里的X值为点的位横作标其值为0~39
void showchar(char x,char y,char a,char letter,char color);//在任意位置显示a所表示的值,这里的X值为点的位横作标其值为0~39
void showchars(char x,char y,char *a,char color);//在任意位置显示字符串a所表示的值,这里的X值为点的位横作标其值为0~39
void showsmallmun(char x,char y,char *a,char color);//显示4*8的数字串,这里的X值为点的位横作标其值为0~39
void showallhz(void);//显示液晶上所有的汉字


/******液晶的基本输入输出,一次写入或读出横向八个点*******/

void write (unsigned char x ,unsigned char y, unsigned char buffer1, unsigned char buffer2, unsigned char buffer3)
{ 
   
   DDRA=0xff;//a口为输出,即向外部输出数据
   adb=x;//向外部存储器送横作标地址0~39
   adc=y;//向外部存储器送纵作标地址0~239
   ada=buffer1;//向该点阵写入三个颜色值
   ada=buffer2;
   ada=buffer3;
}

void read(unsigned char x,unsigned char y,char *b1,char *b2,char *b3)
{
   DDRA=0x00;//a口为输入,即读取外部数据
   adb=x;
   adc=y;
   *b1=ada;//将该点阵的三个颜色值分别读取出来
   *b2=ada;
   *b3=ada;
}

/**************画任意坐标上的一个点*******************/
void point(unsigned int x,unsigned char y,unsigned char color)
{       unsigned int temp;
        char buffer1,buffer2,buffer3;
        temp=x%8;//判断该点是属于该字节位的第几个点
        x=x/8;
        read((char)x,y,&buffer1,&buffer2,&buffer3);

	if(temp==0)//该字节位的第一个点,将buffer1最高三位修改为color的值
	   {  
	      buffer1 &= 0x1f;
	      buffer1 |=(color<<5);
	   }
	else if (temp==1)//该字节位的第2个点,将buffer1的3、4、5三位修改为color的值
	   {
	      buffer1 &= 0xe3;
	      buffer1 |=(color<<2);
	   }
	else if (temp==2)//该字节位的第3个点,将buffer1最低2位和buffer2的最高位修改为color的值
	   {
	      buffer1 &= 0xfc;
	      buffer1 |=(color>>1);
	      buffer2 &= 0x7f;
	      buffer2 |=(color<<7);
	   }
	else if (temp==3)//该字节位的第4个点,将buffer2的5、6、7三位修改为color的值
	   {
	      buffer2 &= 0x8f;
	      buffer2 |=(color<<4);
	   }
	else if (temp==4)//该字节位的第5个点,将buffer2的2、3、4三位修改为color的值
	   {
	      buffer2 &= 0xf1;
	      buffer2 |=(color<<1);
	   }
	else if (temp==5)//该字节位的第6个点,将buffer2最低位和buffer3的最高两位修改为color的值
	   {
	      buffer2 &= 0xfe;
	      buffer2 |=(color>>2);
	      buffer3 &= 0x3f;
	      buffer3 |=(color<<6);
	   }
	else if (temp==6)//该字节位的第7个点,将buffer3的4、5、6三位修改为color的值
	   {
	      buffer3 &= 0xc7;
	      buffer3 |=(color<<3);
	   }
	else if (temp==7)//该字节位的第8个点,将buffer3最低三位修改为color的值
	   {
	      buffer3 &= 0xf8;
	      buffer3 |= color;
	   }
        write ((char)x,y,buffer1,buffer2,buffer3);
}



/*********************用某种颜色清屏**************/


void clrall(char color)
{
      char buffer1=0,buffer2=0,buffer3=0;
      char i,j;
      buffer1 |=(color<<5);
      buffer1 |=(color<<2);
      buffer1 |=(color>>1);
      buffer2 |=(color<<7);
      buffer2 |=(color<<4);
      buffer2 |=(color<<1);
      buffer2 |=(color>>2);
      buffer3 |=(color<<6);
      buffer3 |=(color<<3);
      buffer3 |= color;//将三个buffer的值都修改为相应颜色的值
      for(i=0;i<40;i++)
      {
      	for(j=0;j<240;j++)
      	{
      		write(i,j,buffer1,buffer2,buffer3);
      	}
      }
}

/***********************用某种颜色画矩形***************************/
void juxing(char x1,char y1,char x2,char y2,char color)
{ 
      char buffer1=0,buffer2=0,buffer3=0;
      char i,j;
      buffer1 |=(color<<5);
      buffer1 |=(color<<2);
      buffer1 |=(color>>1);
      buffer2 |=(color<<7);
      buffer2 |=(color<<4);
      buffer2 |=(color<<1);
      buffer2 |=(color>>2);
      buffer3 |=(color<<6);
      buffer3 |=(color<<3);
      buffer3 |= color;
      for(i=x1;i<=x2;i++)
      {
      	for(j=y1;j<=y2;j++)
      	{
      		write(i,j,buffer1,buffer2,buffer3);
      	}
      }
}

/**************两点间画带颜色直线*******************/
void line(char x1,char y1,char x2,char y2,char color)
{
	char x,y;
	unsigned int dx,dy;
	if(x1>x2)
	{
		x=x2;
		y=y2;
		x2=x1;
		y2=y1;
		x1=x;
		y1=y;
	}//保证(x,y)从最靠近屏幕左侧开始开始。
    point(x1,y1,color);
	x=x1;
	y=y1;
	dx=x2-x1;
		if(dx==0)//直线与y轴平行
	{
		if(y1<y2)
		{
			for(;y<=y2;y++)//沿y1画点到y2成直线
			   point(x,y,color);
		}
		else
		{
			for(;y>=y2;y--)//沿y2画点到y1成直线
			   point(x,y,color);
	        }
	}
	else if(y1==y2)//直线与X轴平行
	{
		if(x>x1)
		{
			for(;x<=x2;x++)//沿x1画点到x2成直线
			   point(x,y,color);
		}
		else
		{
			for(;x>=x2;x--)//沿x2画点到x1成直线
			   point(x,y,color);
		}
	}
	else if(y1<y2)//直线与x轴夹角小于90°
	{
	    dy=y2-y1;

		while(x<=x2&&y<=y2)
		{
			point(x,y,color);
			if(dx*(y-y1)<dy*(x-x1))//保证所画直线尽量和所求直线靠近
			    y++;
			else x++;
			
	        }
	}
	else if(y1>y2)//直线于y轴夹角大于90°
	{
	    dy=y1-y2;
		while(x<=x2&&y>=y2)
		{
			point(x,y,color);
			if(dx*(y1-y)<dy*(x-x1))//保证所画直线尽量和所求直线靠近
			    y--;
			else x++;
			
	        }
	}
}
/******************两点间画虚线**********************/
void xuline(char x1,char y1,char x2,char y2,char color)
{
	char x,y;
	unsigned int dx,dy;
	if(x1>x2)
	{
		x=x2;
		y=y2;
		x2=x1;
		y2=y1;
		x1=x;
		y1=y;
	}//保证(x,y)从最靠近屏幕左侧开始开始。
    point(x1,y1,color);
	x=x1;
	y=y1;
	dx=x2-x1;
		if(dx==0)//直线与y轴平行
	{
		if(y1<y2)
		{
			for(;y<=y2;y++)
			{
			   if(y%3!=0)//每画两点空出一点
			       point(x,y,color);
			}
		}
		else
		{
			for(;y>=y2;y--)
			{
			   if(y%3!=0)
			       point(x,y,color);
			}
	        }
	}
	else if(y1==y2)//直线与X轴平行
	{
		if(x>x1)
		{
			for(;x<=x2;x++)
			{
				if(x%3!=0)//每画两点空出一点
				point(x,y,color);
			}
		}
		else
		{
			for(;x>=x2;x--)
			{
				if(x%3!=0)
				point(x,y,color);
			}
		}
	}
	else if(y1<y2)//直线与x轴夹角小于90°
	{
	    dy=y2-y1;

		while(x<=x2&&y<=y2)
		{
			if(x%3!=0)
			point(x,y,color);
			if(dx*(y-y1)<dy*(x-x1))//保证所画直线尽量和所求直线靠近
			    y++;
			else x++;
			
	        }
	}
	else if(y1>y2)//直线于y轴夹角大于90°
	{
	    dy=y1-y2;
		while(x<=x2&&y>=y2)
		{
			if(x%3!=0)
			point(x,y,color);
			if(dx*(y1-y)<dy*(x-x1))//保证所画直线尽量和所求直线靠近
			    y--;
			else x++;
			
	        }
	}
}
/**************两点间画带颜色直线,画船专用,避免维度线被覆盖*******************/
void linex(char x1,char y1,char x2,char y2,char color)
{
	char x,y;
	unsigned int dx,dy;
	if(x1>x2)
	{
		x=x2;
		y=y2;
		x2=x1;
		y2=y1;
		x1=x;
		y1=y;
	}//保证(x,y)从最靠近屏幕左侧开始开始。
    if(y1>120)//画的该点不在维度线上,则画该点
	{
	 		if((y1-120)%40!=0&&x1%40!=0)
				point(x1,y1,color);
	}
	else
	{
	        if((120-y1)%40!=0&&x1%40!=0)
				point(x1,y1,color);
	}
	x=x1;
	y=y1;
	dx=x2-x1;
		if(dx==0)//直线与y轴平行
	{
		if(y1<y2)
		{
			for(;y<=y2;y++)
			{
			       if(y>120)
				   {
	 			   			if((y-120)%40!=0&&x%40!=0)
							point(x,y,color);
					}
					else
					{
	        		 		if((120-y)%40!=0&&x%40!=0)
							point(x,y,color);
					}
			}
		}
		else
		{
			for(;y>=y2;y--)
			{
			       if(y>120)
				   {
	 			   			if((y-120)%40!=0&&x%40!=0)
							point(x,y,color);
					}
					else
					{
	        		 		if((120-y)%40!=0&&x%40!=0)
							point(x,y,color);
					}
			}
	    }
	}
	else if(y1==y2)//直线与X轴平行
	{
		if(x1<x2)
		{
			for(;x<=x2;x++)
			{
			       if(y>120)
				   {
	 			   			if((y-120)%40!=0&&x%40!=0)
							point(x,y,color);
					}
					else
					{
	        		 		if((120-y)%40!=0&&x%40!=0)
							point(x,y,color);
					}
			}
		}
		else
		{
			for(;x>=x2;x--)
			{
			       if(y>120)
				   {
			       if(y>120)
				   {
	 			   			if((y-120)%40!=0&&x%40!=0)
							point(x,y,color);
					}
					else
					{
	        		 		if((120-y)%40!=0&&x%40!=0)
							point(x,y,color);
					}
					}
					else
					{
			       if(y>120)
				   {
	 			   			if((y-120)%40!=0&&x%40!=0)
							point(x,y,color);
					}
					else
					{
	        		 		if((120-y)%40!=0&&x%40!=0)
							point(x,y,color);
					}
					}
			}
		}
	}
	else if(y1<y2)//直线与x轴夹角小于90°
	{
	    dy=y2-y1;

		while(x<=x2&&y<=y2)
		{
			if(y>120)
			{
	 			   	if((y-120)%40!=0&&x%40!=0)
					point(x,y,color);
			}
			else
			{
	        		 if((120-y)%40!=0&&x%40!=0)
					point(x,y,color);
			}
			if(dx*(y-y1)<dy*(x-x1))//保证所画直线尽量和所求直线靠近
			    y++;
			else x++;
			
	        }
	}
	else if(y1>y2)//直线于y轴夹角大于90°
	{
	    dy=y1-y2;
		while(x<=x2&&y>=y2)
		{
			if(y>120)
			{
	 			   	if((y-120)%40!=0&&x%40!=0)
					point(x,y,color);
			}
			else
			{

⌨️ 快捷键说明

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