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

📄 disp160_128.c

📁 手表在液晶上动态显示
💻 C
字号:
#include"t6963.h"
#include"reg51.h"
#include"tab.h"
extern void Delay_500ms();
//引脚定义
sbit _CD=P1^5;
sbit _RD=P1^6;
sbit _WR=P1^7;
//读状态函数
unsigned char Read_State()
{
			unsigned char a;
			P2=0xff;//读状态之前先将数据线拉高
			_CD=1;  //1为指令通道,0为数据通道
			_RD=0;
			_RD=1;
			a=P2;
			return a;
}
//bit0指令写状态位,bit1数据读/写状态位,为1时候空闲
void Enable()
{
			while(1)
			if((Read_State()&3)==3)break;
}
//bit3数据自动写状态位,为1时候空闲
void Aut_Write()
{
			while(1)
			if((Read_State()&8)==8)break;
}
//写单参数函数,Data1为传入的参数,Com为传入的指令
//注意:写入顺序为先数据后写指令,不可颠倒
void Write_Data1(unsigned char Data1,unsigned char Com)
			{
			Enable();
			_CD=0;
			P2=Data1;
			_WR=0;
			_WR=1;
			Enable();
			_CD=1;
			P2=Com;
			_WR=0;
			_WR=1;
			}
//写双参数函数,Data1/Data2为传入的参数,Com为传入的指令
//注意:写入顺序为先数据Data1后写数据Data2,最后写指令,不可颠倒
void Write_Data2(unsigned char Data1,unsigned char Data2,unsigned char Com)
{
			Enable();
			_CD=0;
			P2=Data1;
			_WR=0;
			_WR=1;
			Enable();
			_CD=0;
			P2=Data2;
			_WR=0;
			_WR=1;
			Enable();
			_CD=1;
			P2=Com;
			_WR=0;
			_WR=1;
}
//写指令函数
void Write_Com(unsigned char Com)
{
			Enable();
			_CD=1;
			P2=Com;
			_WR=0;
			_WR=1;
}
//写8字节数据函数Addr表示数据首地址,Way表示写的方式
void Write_8_Data(unsigned char Addr,unsigned char Way)
{
			Aut_Write();//判断是否能自动写
			Write_Com(AUT_WR);//自动写开始
			Write_Data1(Addr,Way);
			Write_Com(AUT_WO);//自动写结束
}
//设置数据显示在屏幕上的坐标(以字节为单位)
//x表示显示的行(0~15),y表示显示的列(0~19)
void Set_xy(unsigned char x,unsigned char y)
{
			unsigned int a;
			a=x*20+y;
			Write_Data2(a&0xff,a>>8,ADR_POS);
}
//设置数据存储起始地址
void Set_Addr(unsigned char Addr1,unsigned char Addr2)
{
           Write_Data2(Addr1,Addr2,ADR_POS);
}
/*CGRAM偏置地址设置函数*/
void Set_CGRAM()
{
           Write_Data2(1,0,CGR_POS);
}
//液晶初始化函数
//(文本区首地址D1,文本区首地址D2, 文本区宽度,  
//图形区首地址D1, 图形区首地址D2, 图形区宽度,   
//光标形状,  显示方式,  显示开关)
void LCD_Init(unsigned char Txt1,unsigned char Txt2,unsigned char Txt_Wide,
              unsigned char Map1,unsigned char Map2,unsigned char Map_Wide,
              unsigned char Guang_Biao,unsigned char Disp_Mode,unsigned char Kai_Guan)
			{
			Write_Data2(Txt1,Txt2,TXT_STP);    //设置文本方式RAM起始地址
			Write_Data2(Txt_Wide,0,TXT_WID);   //设置文本模式宽度,宽度为N/6或N/8,N为宽度点数,比如N=160
			Write_Data2(Map1,Map2,GRH_STP);    //设置图形方式RAM起始地址
			Write_Data2(Map_Wide,0,GRH_WID);   //设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如160
			Write_Com(CUR_SHP|Guang_Biao);
			Write_Com(Disp_Mode);
			Write_Com(DIS_SW|Kai_Guan);
}
//显示一个汉字子程序,
//x表示显示的行(0~15),y表示显示的列(0~19),n表示字在表格中的位置
void Han_Zi(unsigned char x,unsigned char y,unsigned char Addr)
{
			Set_xy(x,y);
			Write_8_Data(Addr,INC_WR);
			Write_8_Data(Addr+2,INC_WR);
			Set_xy(x+1,y);
			Write_8_Data(Addr+1,INC_WR);
			Write_8_Data(Addr+3,INC_WR);
}
//清屏程序
void Clear_LCD()
{
unsigned int a;
			Set_xy(0,0);
			for(a=0;a<320;a++)
			Write_8_Data(0x80,INC_WR);
}
/*自定义字符写入CGROM函数*/
void Write_CGORM()
{
			int a;
			Set_CGRAM();
			Set_Addr(0,0x0c);
			for(a=0;a<2568;a++)
			Write_8_Data(Tab[a],INC_WR);
}
//设置点显示在屏幕上的坐标(以位为单位)
//x表示显示的行(0~127),y表示显示的列(0~159),n=1表示打个点,n=0清除一个点
void Point(unsigned char x,unsigned char y,bit n)
{
			unsigned char point;
			unsigned int temp;
			temp=x*20+y/8+320;
			point=0xf7-y%8;
			if(n)point|=0xf8;
			else point&=0xf7;
			Write_Data2(temp&0xff,temp>>8,0x24);	//设置写地址
			Write_Com(point);
}
//画线子程序,x1/y1/x2/y2,分别表示起点和终点的坐标、draw=1表示画直线为0表示清除直线
void Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,bit n)
{
			unsigned char _x,_y;
			unsigned char i,j=0,k=0;
			unsigned char shang1,shang2,yu_shu;
			if(x1>=x2)_x=x1-x2;
			else _x=x2-x1;
			if(y1>=y2)_y=y1-y2;
			else _y=y2-y1;
			if(!_x)
				{
				if(y1>y2)for(i=y2;i<=y1;i++)Point(x1,i,n);
				else     for(i=y1;i<=y2;i++)Point(x1,i,n);
				}
			else if(!_y)
				{
				if(x1>x2)for(i=x2;i<=x1;i++)Point(i,y1,n);
				else     for(i=x1;i<=x2;i++)Point(i,y1,n);
				}
			else if(_x>=_y)
			{
			shang1=_x/_y;
			yu_shu=_x%_y;
			shang2=_x/yu_shu;
			//if(_x%yu_shu*10/yu_shu>=5)shang2+=shang2;
			if((y2>y1)&&(x2>x1))
				{
				for(i=x1;i<=x2;i++)
					{
					j++;k++;
					Point(i,y1,n);
					if(k==shang2)j=k=0;
					else if(j==shang1){y1++;j=0;}
					}
				}
			else if((y2<y1)&&(x2<x1))
				{
				for(i=x2;i<=x1;i++)
					{
					j++;k++;
					Point(i,y2,n);
					if(k==shang2)j=k=0;
					else if(j==shang1){y2++;j=0;}
					}
				}
			else if((y2<y1)&&(x2>x1))
				{
				for(i=x1;i<=x2;i++)
					{
					j++;k++;
					Point(i,y1,n);
					if(k==shang2)j=k=0;
					else if(j==shang1){y1--;j=0;}
					}
				}
			else if((y2>y1)&&(x2<x1))
				{
				for(i=x2;i<=x1;i++)
					{
					j++;k++;
					Point(i,y2,n);
					if(k==shang2)j=k=0;
					else if(j==shang1){y2--;j=0;}
					}
				}
			}
			else
			{
			shang1=_y/_x;
			yu_shu=_y%_x;
			shang2=_y/yu_shu;
			if((y2>y1)&&(x2>x1))
				{
				for(i=y1;i<=y2;i++)
					{
					j++;k++;
					Point(x1,i,n);
					if(k==shang2)j=k=0;
					else if(j==shang1){x1++;j=0;}
					}
				}
			else if((y2<y1)&&(x2<x1))
				{
				for(i=y2;i<=y1;i++)
					{
					j++;k++;
					Point(x2,i,n);
					if(k==shang2)j=k=0;
					else if(j==shang1){x2++;j=0;}
					}
				}
			
			else if((y2>y1)&&(x2<x1))
				{
				for(i=y1;i<=y2;i++)
					{
					j++;k++;
					Point(x1,i,n);
					if(k==shang2)j=k=0;
					else if(j==shang1){x1--;j=0;}
					}
				}
			else if((y2<y1)&&(x2>x1))
				{
				for(i=y2;i<=y1;i++)
					{
					j++;k++;
					Point(x2,i,n);
					if(k==shang2)j=k=0;
					else if(j==shang1){x2--;j=0;}
					}
				}
			}
}
//画圆子程序,其中x0,y0表示圆心,R表示半径
//圆方程为(x-x0)^2+(y-y0)^2=R^2
//先打第一象限内的1/4段圆弧(顺时针和反时针各打一次),再依据对称原理打出其他3段圆弧
void Circle(unsigned char x0,unsigned char y0,unsigned R,bit n)
{
unsigned char i,j=0;
Point(x0,y0,n);
for(i=0;i<=R;i++)
   {
   while(1)
      {
      if(R*R-i*i<=j*j)break;
      j++;
      }
//第一象限打点
      Point(x0-j,y0+i,n);
	  Point(x0-i,y0+j,n);
	  //Delay_500ms();
//第二象限打点
      Point(x0+j,y0+i,n);
	  Point(x0+i,y0+j,n);
	  //Delay_500ms();
//第三象限打点
      Point(x0+j,y0-i,n);
      Point(x0+i,y0-j,n);
	 // Delay_500ms();
//第四象限打点
      Point(x0-j,y0-i,n);
	  Point(x0-i,y0-j,n);
	  //Delay_500ms();
	  j=0;
   }
}
/********************************没有用到的驱动******************************/
//显示图片程序,Addr1/Addr2为图片的地址,I表示图片的大小,
/*void Map_Display(unsigned  char Addr1,unsigned char Addr2,unsigned int i)
{
Write_Data2(Addr1,Addr2,ADR_POS);//设置写地址
Write_Com(AUT_WR);	//设置自动写方式
for(;i>0;i--)
	{
	Enable();
	_CD=0;
	P2=Map[i];
	_WR=0;
	_WR=1;
	}
	Write_Com(AUT_WO);	//自动写结束
}
//bit2数据自动读状态位,为1时候空闲
void Aut_Read()
{
while(1)
if((Read_State()&4)==4)break;
}
//写数据函数(注意:此处只能写一个字节)
void Write_Data(unsigned char Data)
{
Enable();
_CD=0;
P2=Data;
_WR=0;
_WR=1;
}
//读数据函数(注意:此处只能读一个字节)
unsigned char Read_Data()
{
unsigned char a;
Enable();
_CD=0;
P2=0xff;//读状态之前先将数据线拉高
_RD=0;
_RD=1;
a=P2;
return a;
}
//读8字节数据函数
unsigned char Read_8_Data(unsigned char Way)
{
unsigned char a;
Aut_Read();//判断是否能自动读
Write_Com(AUT_RD);//自动读开始
Write_Com(Way);
a=Read_Data();
Write_Com(AUT_RO);//自动读结束
return a;
}
*//*****************************************************************/


⌨️ 快捷键说明

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