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

📄 dis_c.c

📁 基于SPMC75F2413A的LCD驱动程式序, 使用128X64的液晶模块,包含有画线,画圆和BMP,字符串等显示处理,全部源码,完整的工程.愿对从事单片机开发的工程式师有用.
💻 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 + -