📄 dis_c.c
字号:
#include "Spmc75_regs.h"
#include "mcMACRO.h"
#define lint long int
#define uint unsigned int
#define uchar unsigned char
#define ulint unsigned long int
extern Asii8;
extern Asii16;
extern GB16;
void Writ_ZL(uint CMD);
void Writ_Data(uint Data);
int Read_Data(void);
//****************************************************************************************************
// 液晶初始化 LCD_ON_OFF(int a)
// 设计者: 牟联树
// 描 述: 液晶开关控制 a=0:关显示,a=1:开显示
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void LCD_Kai(int a)
{
if(a>0) Writ_ZL(0xaf); //开显示
else Writ_ZL(0xae); //关显示
}
//****************************************************************************************************
// 液晶初始化 LCD_Init(int a)
// 设计者: 牟联树
// 描 述: 液晶初始化(清除or填充显示区)
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void LCD_Init(uint a)
{
int i,j;
P_IOA_Dir->W |= 0x0fff;
P_IOA_Attrib->W |= 0x0fff;
P_IOA_SPE->W &= 0xf000;
Writ_ZL(0x25);
Writ_ZL(0x2f);
Writ_ZL(0x81);
Writ_ZL(0x00);
Writ_ZL(0xa1); //默认驱动方式
Writ_ZL(0xc0);
Writ_ZL(0xa2); //LCD偏压设置 1/9
Writ_ZL(0xa4); //非全屏点亮模式
Writ_ZL(0xa6); //默认的显示方式,不是反显
Writ_ZL(0xac); //默认驱动方式
Writ_ZL(0); //默认驱动方式
Writ_ZL(0xee); //默认驱动方式
Writ_ZL(0x40); //Z指针设为0
for(i=0;i<8;i++) //页指针
{
Writ_ZL(i+0xb0); //设置页指针
Writ_ZL(0x00); //列指针
Writ_ZL(0x10);
for(j=0;j<132;j++) //列指针
Writ_Data(a);
}
}
//****************************************************************************************************
// 图片写入子程序 void W_BMP(int x,int y,int *P,int Mode)
// 设计者: 牟联树
// 描 述: 写入一个BMP图片,起点为(x,y) Mode=0:正常显示,Mode=1:反显
// Mode=2:与原区相或
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
int W_BMP(int *p,int x,int y)
{
int Temp_With,Temp_High,i,j; //数据暂存
Temp_High = (*p)>>8; //获得图片参数(图片高度)
Temp_With = *p&0xff; //图片宽度
p++;
for(j=0;j<Temp_High;j++)
{
if(y+j<8)
{
Writ_ZL(y+j+0xb0);
Writ_ZL(x&0x0f);
Writ_ZL(((x&0xf0) >> 4)|0x10);
for(i=0;i<Temp_With;i++,p++)
{
if((x+(i<<1))<127)
{
Writ_Data((*p)>>8);
Writ_Data(*p);
}
}
}
}
}
//****************************************************************************************************
// 西文字符写入 void W_ASII(int a,int Mode) [8x16]
// 设计者: 牟联树
// 描 述: 写入一个标准字符 Mode=0:正常显示,Mode=1:反显
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void W_ASII(int x,int y,uint a,int Font)
{
int i,j,X_Witch,Y_Witch; //数据暂存
int *p_data;
a -=32;
if(Font>0)
{
X_Witch = 4;
Y_Witch = 2;
p_data = &Asii16; //字符表首址
a=a<<3;
}
else
{
p_data = &Asii8; //字符表首址
X_Witch=a<<1;
a+=X_Witch;
X_Witch = 3;
Y_Witch = 1;
}
p_data +=a; //要写字符的首地址
for(j=0;j<Y_Witch;j++)
{
if((y+j)<8)
{
Writ_ZL(y+j+0xb0);
Writ_ZL(((x&0xf0) >> 4)|0x10); //设置初始地址
Writ_ZL(x&0x0f);
for(i=0;i<X_Witch;i++,p_data++)
{
if((x+(i<<1))<127)
{
Writ_Data(((*p_data)>>8)&0xff);
Writ_Data((*p_data)&0xff);
}
}
}
}
}
//****************************************************************************************************
// 汉字写入子程序 W_GB(int x,int y,int a,int Mode) [16X16]
// 设计者: 牟联树
// 描 述: 写入一个汉字 Mode=0:正常显示,Mode=1:反显
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void W_GB(int x,int y,uint a)
{
int i,j; //数据暂存
uint *p_data;
p_data = &GB16; //汉字表首址
p_data+=(a<<4); //要写字符的首地址
for(j=0;j<2;j++)
{
if(y+j<8)
{
Writ_ZL(y+j+0xb0);
Writ_ZL(((x >> 4)&0x0f)|0x10); //设置初始地址
Writ_ZL(x&0x0f);
for(i=0;i<8;i++,p_data++)
{
if((x+(i<<1))<127)
{
Writ_Data((*p_data)>>8);
Writ_Data((*p_data)&0xff);
}
}
}
}
}
//****************************************************************************************************
// 描点子程序 void W_Dot(int x,int y,int i)
// 设计者: 牟联树
// 描 述: x,y为画点的坐标Mode=0:清点,Mode=1:亮点,Mode=2:与原点相或
// Mode=3:与原点相与
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void Writ_Dot(int x,int y,int Mode)
{
int Temp;
Temp = 1;
if(x<128)
{
Writ_ZL((y>>3)+0xb0);
Writ_ZL(((x&0x00f0) >> 4)|0x10); //设置初始地址
Writ_ZL(x&0x0f);
Writ_ZL(0xe0);
y = y&0x07;
Temp = Temp << y;
Read_Data();
switch(Mode)
{
case 0: Temp = ~Temp;
Temp &= Read_Data(); //读回数据
break;
case 1: Temp |= Read_Data(); //读回数据
break;
case 2: Temp ^= Read_Data(); //读回数据
break;
default: break;
}
Writ_ZL(0xee);
Writ_Data(Temp);
}
}
//****************************************************************************************************
// 西文字符串写入 void W_ASII_S(int x,int y,int *P) [8X16]or[6X8]
// 设计者: 牟联树
// 描 述: 写入一个标准字符串
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void W_ASII_s(int x,int y,int Font,uint *p)
{
while(*p!=0)
{
W_ASII(x,y,*p,Font);
if(Font>0) x+= 8;
else x+=6;
p++;
}
}
//****************************************************************************************************
// 汉字串写入 void W_GB_s(int x,int y,int *p) [16X16]
// 设计者: 牟联树
// 描 述: 写入一相汉字串
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void W_GB_s(int x,int y,int *p)
{
while(*p!=0)
{
W_GB(x,y,*p);
x+= 16;
p++;
}
}
//****************************************************************************************************
// 画直线子程序 void W_Line(int s_x,int s_y,int e_x,int e_y,int Mode)
// 设计者: 牟联树
// 描 述: 以s_x,s_y为起点,e_x,e_y为终点画一直线.
// Mode=0:画直线,Mode=1:画虚线
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void W_line(int s_x,int s_y,int e_x,int e_y,int Mode)
{
int Err=0,D_x,D_y;
if(e_y<s_y)
{
D_x = e_x;
e_x = s_x;s_x = D_x;
D_x = e_y;
e_y = s_y;s_y = D_x;
}
Writ_Dot(s_x,s_y,Mode);
D_x = e_x - s_x;
D_y = e_y - s_y;
if(D_x>0)
{
if(D_x>=D_y)
{ //0=<K<=1
while(s_x!=e_x)
{
if(Err>=0)
{
s_y+=1;
Err+=(D_y-D_x);
}
else Err+=D_y;
s_x+=1;
Writ_Dot(s_x,s_y,Mode);
}
}
else
{ //K>1
while(s_y!=e_y)
{
if(Err>0)
{
s_x+=1;
Err+=(D_x-D_y);
}
else Err+=D_x;
s_y+=1;
Writ_Dot(s_x,s_y,Mode);
}
}
}
else
{
D_x = s_x - e_x;
if(D_x>=D_y)
{ //-1=<K<0
while(s_x!=e_x)
{
if(Err>=0)
{
s_y+=1;
Err+=(D_y-D_x);
}
else Err+=D_y;
s_x-=1;
Writ_Dot(s_x,s_y,Mode);
}
}
else
{ //K< -1
while(s_y!=e_y)
{
if(Err<=0) Err+=D_x;
else
{
s_x-=1;
Err+=(D_x-D_y);
}
s_y+=1;
Writ_Dot(s_x,s_y,Mode);
}
}
}
}
//****************************************************************************************************
// 画多边形子程序 void W_DB_Line(int *p,int Mode)
// 设计者: 牟联树
// 描 述: 画一个任意多边形
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void W_DB_Line(int *p,int Mode)
{
int Dot_sun,x,y,i;
Dot_sun = *p++;
for(i=0;i<Dot_sun;i++)
{
W_line(*p>>8,*(p+1)&0xff,*(p+1)>>8,*(p+1)&0xff,Mode);
p+= 1;
}
}
//****************************************************************************************************
// 画圆上的点子程序 void W_Red_Dot(int x,int y,int a,int b)
// 设计者: 牟联树
// 描 述: 以x,y为圆心R为半径画一个圆
// 日 期: 2004.5.9
// 版本号: 1.1
//****************************************************************************************************
void W_Red_Dot(int x,int y,int a,int b,int mode)
{
if(mode>0)
{
W_line(x+a,y+b,x-a,y+b,1);
W_line(x+a,y-b,x-a,y-b,1);
}
else
{
Writ_Dot(x+a,y+b,1);
Writ_Dot(x-a,y+b,1);
Writ_Dot(x+a,y-b,1);
Writ_Dot(x-a,y-b,1);
}
}
//****************************************************************************************************
// 画圆子程序 void W_Red(int x,int y,int r,int mode)
// 设计者: 牟联树
// 描 述: 以x,y为圆心R为半径画一个圆(mode = 0) or 圆面(mode = 1)
// 日 期: 2004.5.9
// 版本号: 1.1
//****************************************************************************************************
void W_Red(int x,int y,int r,int mode)
{
int arx1=0,ary1,arx2,ary2=0;
ary1=r;
arx2=r;
while(1)
{
W_Red_Dot(x,y,arx1,ary1,mode);
W_Red_Err(&arx1,&ary1,&r);
if(arx1==arx2)
{
W_Red_Dot(x,y,arx1,ary1,mode);
break;
}
W_Red_Dot(x,y,arx2,ary2,mode);
W_Red_Err(&ary2,&arx2,&r);
if(arx1==arx2)
{
W_Red_Dot(x,y,arx2,ary2,mode);
break;
}
}
}
//****************************************************************************************************
// 二进制数据显示程序 void W_Data_s(int x,int y,int data,int Font)
// 设计者: 牟联树
// 描 述: 将一个整形数显示在液晶屏上,需要调用二进制到十进制的数制转换 lint BIN_BCD(int a);
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void W_Data_s(int x,int y,uint data,int Font)
{
uint Temp;
int i=0;
Temp = BIN_BCD(data); //获取转换数据
if(Font >0) x+=32;
else x+=24;
while(i<4)
{
W_ASII(x,y,48+(uint)(Temp&0x000f),Font);
Temp = Temp>>4;
if(Font >0) x-= 8;
else x-=6;
i++;
}
}
void W_Data_s1(int x,int y,int data,int Font)
{
int i=0;
if(Font >0) x+=24;
else x+=18;
while(i<4)
{
if((data&0x000f) > 9)
W_ASII(x,y,65+(int)(data&0x000f),Font);
else W_ASII(x,y,48+(int)(data&0x000f),Font);
data = data>>4;
if(Font >0) x-= 8;
else x-=6;
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -