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

📄 dis_c.c

📁 基于SPMC75的NNAD_Flash K9F1208的驱动程式序,对一些需要存海量数据的单片机应用场合有用.
💻 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 + -