📄 disp160_128.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 + -