📄 dis_c.c
字号:
//========================================================================
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.
// ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================================
//========================================================================
// Filename: Dis_c.c
// Author: Lianshu Mou (email: Lianshu@sunnorth.com.cn)
// Date: 2004/12/22
// Description:
//
// Reference:
// Revision:
// 2004/12/22 First version
//========================================================================
#include "Spmc70_regs.h"
#include "mcMACRO.h"
#define lint long int
#define uint unsigned int
#define uchar unsigned char
#define ulint unsigned long int
#define Dis_Zero 4
#define Dis_With 128 + Dis_Zero
#define Dis_High 64
extern int Asii8[];
extern int Asii16[];
extern int GB16[];
void Writ_ZL(uint CMD);
void Writ_Data(uint Data);
int Read_Data(void);
int Read_State(void);
//****************************************************************************************************
// 液晶初始化 void LCD_Init(void)
// 设计者: 牟联树
// 描 述: 液晶初始化
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void LCD_Init(void)
{
P_IOA_Dir->W |= 0x0fff;
P_IOA_Attrib->W |= 0x0fff;
Writ_ZL(0x25);
Writ_ZL(0x2f);
Writ_ZL(0x81);
Writ_ZL(0x10);
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
}
//****************************************************************************************************
// 液晶初始化 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); //关显示
}
//****************************************************************************************************
// 液晶数据填充 void LCD_Init(void)
// 设计者: 牟联树
// 描 述: 液晶初始化
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void LCD_Fill(int a)
{
int i,j;
for(i=0;i<8;i++) //页指针
{
Writ_ZL(i+0xb0); //设置页指针
Writ_ZL(0x10);
Writ_ZL(0x04); //列指针
for(j=Dis_Zero;j < Dis_With;j++) //列指针
Writ_Data(a);
}
}
//****************************************************************************************************
// 描点子程序 void W_Dot(int x,int y,int i)
// 设计者: 牟联树
// 描 述: x,y为画点的坐标Mode=0:清点,Mode=1:亮点,Mode=2:与原点相或
// Mode=3:与原点相与
// 日 期: 2003.12.22
// 版本号: 1.0
//****************************************************************************************************
void Writ_Dot(int x,int y,int Mode)
{
int Temp;
Temp = 1;
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_BMP_bit(int x,int y,int *P)
// 设计者: 牟联树
// 描 述: 写入一个BMP图片,起点为(x,y)
// 日 期: 2004.12.22
// 版本号: 1.0
//****************************************************************************************************
void W_BMP_bit(int *p,int x,int y)
{
int Temp_With,Temp_High,i,j,k; //数据暂存
uint Temp;
x += Dis_Zero;
Temp_High = (*p)>>8; //获得图片参数(图片高度)
if(Temp_High & 0x07) Temp_High = (Temp_High >> 3) + 1;
else Temp_High = Temp_High >> 3;
Temp_With = (*p)&0xff; //图片宽度
p++;
for(k=0;k<Temp_High;k++)
{
for(i=0;i<Temp_With;i++)
{
if(i & 0x01)
{
Temp = *p;
p ++;
}
else Temp = *p >> 8;
for(j=0;j<8;j++)
{
if(((y+j) < Dis_High)&&((x+i) < Dis_With))
{
if(Temp&1) Writ_Dot(x+i,y+j,1);
else Writ_Dot(x+i,y+j,0);
}
Temp = Temp >> 1;
}
}
y += 8;
}
}
//****************************************************************************************************
// 图片写入子程序 void W_BMP_byte(int x,int page,int *P)
// 设计者: 牟联树
// 描 述: 写入一个BMP图片,起点为(x,page)
// 日 期: 2004.12.22
// 版本号: 1.0
//****************************************************************************************************
void W_BMP_byte(int *p,int x,int page)
{
int Temp_With,Temp_High,i,j; //数据暂存
x += Dis_Zero;
Temp_High = (*p)>>8; //获得图片参数(图片高度)
if(Temp_High & 0x07) Temp_High = (Temp_High >> 3) + 1;
else Temp_High = Temp_High >> 3;
Temp_With = (*p)&0xff; //图片宽度
p++;
for(j=0;j<Temp_High;j++)
{
if((page+j) < (Dis_High/8))
Writ_ZL(page+j+0xb0);
Writ_ZL(((x&0xf0) >> 4)|0x10);
Writ_ZL(x&0x0f);
for(i=0;i<Temp_With;i++)
{
if(((x+i) < Dis_With)&&((page+j) < (Dis_High/8)))
{
if(i&0x1) Writ_Data((*p)&0xff);
else Writ_Data(((*p)>>8)&0xff);
}
if(i&0x1) p++;
}
}
}
//****************************************************************************************************
// 西文字符写入 void W_ASII(int a,int Mode) [8x16]
// 设计者: 牟联树
// 描 述: 写入一个标准字符
// 日 期: 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 = 8;
Y_Witch = 2;
p_data = Asii16; //字符表首址
a=a<<3;
}
else
{
p_data = Asii8; //字符表首址
X_Witch = a<<1;
a += X_Witch;
X_Witch = 6;
Y_Witch = 1;
}
p_data +=a; //要写字符的首地址
for(j=0;j<Y_Witch;j++)
{
if((y+j) < (Dis_High/8))
Writ_ZL(y+j+0xb0);
Writ_ZL(((x&0xf0) >> 4)|0x10); //设置初始地址
Writ_ZL(x&0x0f);
for(i=0;i<X_Witch;i++)
{
if(((x+i) < Dis_With)&&((y+j) < (Dis_High/8)))
{
if(i&0x0001) Writ_Data((*p_data)&0xff);
else Writ_Data(((*p_data)>>8)&0xff);
}
if(i&0x0001) p_data ++;
}
}
}
//****************************************************************************************************
// 汉字写入子程序 W_GB(int x,int y,uint a) [16X16]
// 设计者: 牟联树
// 描 述: 写入一个汉字
// 日 期: 2003.12.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) < (Dis_High/8))
Writ_ZL(y+j+0xb0);
Writ_ZL(((x >> 4)&0x0f)|0x10); //设置初始地址
Writ_ZL(x&0x0f);
for(i=0;i < 16;i++,p_data++)
{
if((x+i) < Dis_With)
{
if(i&0x1) Writ_Data((*p_data)&0xff);
else Writ_Data(((*p_data)>>8)&0xff);
}
if(i&0x1) p_data ++;
}
}
}
//****************************************************************************************************
// 西文字符串写入 void W_ASII_S(int x,int y,int *P) [8X16]or[6X8]
// 设计者: 牟联树
// 描 述: 写入一个标准字符串
// 日 期: 2003.12.22
// 版本号: 1.0
//****************************************************************************************************
void W_ASII_s(int x,int y,int Font,char *p)
{
x += 4;
while(*p!=0)
{
W_ASII(x,y,*p,Font);
if(Font>0)
{
x+= 8;
if(x > 124)
{
x = Dis_Zero;
y += 2;
if(y > 6) break;
}
}
else
{
x+=6;
if(x > 126)
{
x = Dis_Zero;
y += 1;
if(y > 7) break;
}
}
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,uint *p)
{
x += 4;
while(*p!=0)
{
W_GB(x,y,*p);
x+= 16;
if(x > 116)
{
x = Dis_Zero;
y += 2;
if(y > 6) break;
}
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为终点画一直线.
// 日 期: 2003.12.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;
s_x += Dis_Zero;
e_x += Dis_Zero;
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.12.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)&0xff,*(p + 1)&0xff,(*(p + 1)>>8)&0xff,*(p + 1)&0xff,Mode);
p += 1;
}
}
//****************************************************************************************************
// 画圆上的点子程序 void W_Red_Dot(int x,int y,int a,int b)
// 设计者: 牟联树
// 描 述: 以x,y为圆心R为半径画一个圆
// 日 期: 2004.12.22
// 版本号: 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.12.22
// 版本号: 1.1
//****************************************************************************************************
void W_Red(int x,int y,int r,int mode)
{
int arx1=0,ary1,arx2,ary2=0;
x += 4;
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.12.22
// 版本号: 1.0
//****************************************************************************************************
void W_Data_s(int x,int y,uint data,int Font)
{
uint Temp;
int i=0;
x += 4;
Temp = BIN_BCD(data); //获取转换数据
if(Font >0) x+=32;
else x+=24;
while(i<4)
{
W_ASII(x,y,48+(Temp&0x000f),Font);
Temp = Temp>>4;
if(Font >0) x-= 8;
else x-=6;
i++;
}
}
void W_Data_s1(int x,int y,uint data,int Font)
{
int i=0;
x += 4;
if(Font >0) x+=24;
else x+=18;
while(i<4)
{
if((data&0x000f) > 9)
W_ASII(x,y,65+(data&0x000f),Font);
else W_ASII(x,y,48+(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 + -