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

📄 12864.h

📁 avr单片机EEPROM读写程序 经过调试
💻 H
字号:
/**************************************************************
* 文件名 :128_64.h
* 功能:实现单片机与LCD12864之间的串口通讯
* 说明 :引脚接线:CS接PA0脚 SID接PA1脚 SCLK接PA2脚,PA3脚接地
**************************************************************/
#ifndef _12864_H
#define _12864_H

#include<iom128v.h>
#include<macros.h>
#include<BIT.h>    

#define CS _PA0                       
#define SID _PA1                     
#define SCLK _PA2                   


#define uchar unsigned char
#define uint unsigned int


void delay_us(uint t);                //函数功能: 16M晶振,延时t微秒
void delay_ms(uint t);                //函数功能: 16M晶振,延时t毫秒
void Sendbyte(uchar byte);        //函数功能:发送1字节
uchar Receivebyte(void);            //函数功能:串口接收一个字节
                                              //仅在读取数据的时候用到
                                              //而读出的数据是一次只能读出4bit的
void Checkbusy( void );             //函数功能:检测忙
void Writecommand(uchar data);  //函数功能:写命令
void Writedata(uchar data);        //函数功能:发送数据 
void Locate_x_y(uchar x,uchar y);//函数功能:光标定位x行y列                                            
void Write_string(uchar *s);        //函数功能:写入中文串                                  
void Display_x_y_symbol(uchar x,uchar y,uint data);
                                             //函数功能:以字码的形式录
void Display_x_y_data(uchar x,uchar y,uchar *data);
                                             //函数功能:光标定位x行y列写入中文串
void LcmClearTXT();                 //文本区清RAM函数
void LcmClearBMP( void );         //函数说明:清除字模
void PUT_BMP(uchar *puts);      //函数说明:字模提取
void Float_to_string();              //函数说明:浮点转字符                                   
void DisplayDots(uchar DotByte);//函数功能: 维捷登测试用点阵显示
void Init_12864(void);              //函数功能: 液晶初始化



//自动换行编码表
unsigned char AC_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,      //第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,      //第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,      //第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,      //第四行汉字位置
};



/**************************************************************
* 名称:delay_us()
* 功能:16M晶振,延时t微秒
* 入口参数:t    延时t微秒
* 出口参数:无
**************************************************************/
void delay_us(uint t)
{ 
  	uint i,j;
	 for(i=t;i>0;i--)
	 	for(j=2;j>0;j--);
} 


/**************************************************************
* 名称:delay_ms()
* 功能:16M晶振,延时t毫秒
* 入口参数:t   延时t毫秒
* 出口参数:无
**************************************************************/
void delay_ms(uint t)
{
 	 uint i,j;
	 for(i=t;i>0;i--)
	 	for(j=2800;j>0;j--);
}


/**************************************************************
* 名称:Sendbyte()
* 功能:发送1字节
* 入口参数:data   要写入的数据
* 出口参数:无
**************************************************************/
void Sendbyte(uchar data)
{ 
	uchar i=0;
	SCLK;
	delay_us(8);										//针对高频晶振
	for(i=0;i<8;i++)
		{
			if(data&0x80)
				SID=1;
			else 
				SID=0;
			SCLK=1;
			delay_us(8);								//针对高频晶振
			data<<=1;
			SCLK=0;
			delay_us(8);								//针对高频晶振
		}
}


/**************************************************************
* 名称:Receivebyte()
* 功能:串口接收一个字节,仅在读取数据的时候用到,一次只能读出4bit的数据
* 入口参数:无
* 出口参数:(0xf0&temp1)+(0x0f&temp2)
**************************************************************/
uchar Receivebyte(void)
{
     uchar i,temp1,temp2;
     temp1=temp2=0;
     for(i=0;i<8;i++)
     {
           temp1=temp1<<1;
           SCLK = 0;
           SCLK = 1;            
           SCLK = 0;
           if(SID) temp1++;
     }
     for(i=0;i<8;i++)
     {
           temp2=temp2<<1;
           SCLK = 0;
           SCLK = 1;
           SCLK = 0;
           if(SID) temp2++;
     }
     return ((0xf0&temp1)+(0x0f&temp2));
}

/**************************************************************
* 名称:Checkbusy()
* 功能:液晶检测忙
* 入口参数:无
* 出口参数:无
**************************************************************/
void Checkbusy( void )
{
     do   Sendbyte(0xfc);                           //11111,RW(1),RS(0),0
     while(0x80&Receivebyte());                  //BF(.7)=1 Busy
}

/**************************************************************
* 名称:Writecommand()
* 功能:发送的是控制指令(数据从LCD到MCU)
* 入口参数:data   要写入的命令
* 出口参数:无
**************************************************************/
void Writecommand(uchar data)
{ 
	CS=1;
	Checkbusy();
	Sendbyte(0xf8); 							     //表示发送的是控制命令
	Sendbyte(data&0xf0);
	Sendbyte((data&0x0f)<<4);
	CS=0;
}
/**************************************************************
* 名称:Writedata()
* 功能:向液晶写入数据 
* 入口参数:data   向液晶写入数据 
* 出口参数:无
**************************************************************/
void Writedata(uchar data)
{
	CS=1;
	Checkbusy();
	Sendbyte(0xfa);								    //表示发送的是数据
	Sendbyte(data&0xf0);  
	Sendbyte((data&0x0f)<<4);
	CS=0;
}

/**************************************************************
* 名称:Locate_x_y()
* 功能:光标定位x行y列
* 入口参数:X,Y   x行y列
* 出口参数:无
**************************************************************/
void Locate_x_y(uchar x,uchar y)
{
	uchar addr=0x80;
	Writecommand(0x80);
	switch(x)
	{
		case 0: addr = 0x80 + y; break;
		case 1:addr=0x90+y;break;
		case 2:addr=0x88+y;break;
		case 3:addr=0x98+y;break;
		default:break;
	}
	Writecommand(addr);
}
/**************************************************************
* 名称:Display_x_y_symbol()
* 功能:以字码的形式写入一个中文
* 入口参数:X,Y,data   X行地址,Y列地址,data是字码
* 出口参数:无
**************************************************************/
void Display_x_y_symbol(uchar x,uchar y,uint data)
{ 
	uchar i,j;
	Locate_x_y(x,y);
	j=(uchar)(data);
	i=(uchar)(data>>8);
	Writedata(i);
	Writedata(j);
}
/**************************************************************
* 名称:Write_string()
* 功能:写入串数据
* 入口参数:*s
* 出口参数:无
**************************************************************/
void Write_string(uchar *s)
{ 
	for(;*s!='\0';s++)
		{
			Writedata(*s);
		}
}
/**************************************************************
* 名称:Display_x_y_data()
* 功能:光标定位x行y列写入字符串,自动换行
* 入口参数:X,Y,data  
* 出口参数:无
**************************************************************/
void Display_x_y_data(uchar x,uchar y,uchar *data)
{
	Writecommand(AC_TABLE[8*x+y]);
	for(;*data!='\0';data++)
		{
			if(y==16)        						 //判断换行 换行后重写地址
				{            							//若不判断,则自动从第一行到第三行
					y=0;
					x++;
					if (x==4) x=0;
					Writecommand(AC_TABLE[8*x+y]);
				}
			Writedata(*data);
			y++;
		}
}

/**************************************************************
* 名称:PUT_BMP()
* 功能:写入图片
* 入口参数:*puts
* 出口参数:无
**************************************************************/
void PUT_BMP(uchar *puts)
{
     unsigned int x=0;
     uchar i,j;
     Writecommand(0x34);      					//8Bit扩充指令集,即使是36H也要写两次
     Writecommand(0x36);      					//绘图ON,基本指令集里面36H不能开绘图
     for(i=0;i<32;i++)            					//12864实际为256x32
     {
           Writecommand(0x80|i);     			//行位置
           Writecommand(0x80);      		    //列位置
           for(j=0;j<32;j++)      					//256/8=32 byte
           {           									  //列位置每行自动增加
                 //Writedata(0);
                 Writedata(puts[x]);
                 x++;
           }
     }
}

/**************************************************************
* 名称:LcmClearTXT()
* 功能:清文本区RAM数据
* 入口参数:无
* 出口参数:无
**************************************************************/
void LcmClearTXT()
{
     uchar i;
     Writecommand(0x30);                       //8BitMCU,基本指令集合
     Writecommand(0x80);                       //AC归起始位
     for(i=0;i<64;i++)
        Writedata(0x20);                           //地址归位
} 
/**************************************************************          
* 名称:LcmClearBMP()
* 功能:清图形区RAM数据
* 入口参数:无
* 出口参数:无
**************************************************************/

void LcmClearBMP()
{
     uchar i,j;
     Writecommand(0x34);                        //8Bit扩充指令集,即使是36H也要写两次
     Writecommand(0x36);                        //绘图ON,基本指令集里面36H不能开绘图
     for(i=0;i<32;i++)                              //12864实际为256x32
     { 
           Writecommand(0x80|i);               //行位置
           Writecommand(0x80);                 //列位置
           for(j=0;j<32;j++)                       //256/8=32 byte
                Writedata(0);
     }
}
/**************************************************************
* 名称:Float_to_string()
* 功能:浮点数转换为字符串
* 入口参数:value            为要转换的浮点数,
                   decimal         为保留几位有效数字,
                   valuestring     保存字符串的数组
* 出口参数:无
**************************************************************/
void Float_to_string(float value, int decimal, uchar* valuestring)
{
	unsigned char flag = 0;
    int neg = 0;     
    char tempstr[20];
    int i = 0;    
    int j = 0;    
    int c;     
    long int val1, val2;
    char* tempstring;
	val1 = value;
	if (val1 == 0) 										//判断是否小于1
		{
			value++;
			flag = 1;
		}
    tempstring = valuestring;
    if (value < 0)
		{
			neg = 1;
			value = -value;
		}
    for (j=0; j < decimal; j++)
		{
			value = value * 10;
		}
    val1 = (value * 2);
    val2 = (val1 / 2) + (val1 % 2);
    while (val2 !=0)
		{
			if ((decimal > 0) && (i == decimal))
				{
					tempstr[i] = (char)(0x2E);
					i++;
				} 
			else
				{
					c = (val2 % 10);
					tempstr[i] = (char) (c + 0x30);
					val2 = val2 / 10;
					i++;
				} 
		}
     if (neg)
		{
			*tempstring = '-';
			tempstring++;
		}
     i--;
     for (;i > -1;i--)
		{
			*tempstring = tempstr[i];
			tempstring++;
		}
     *tempstring = '\0';
	 if (flag == 1)
		{
			valuestring[0] = 0x30;
		}
}
/**************************************************************
* 名称:DisplayDots()
* 功能:维捷登测试用点阵显示
* 入口参数:DotByte
* 出口参数:无
**************************************************************/
void DisplayDots(uchar DotByte)
{
    uchar i,j;
    Writecommand(0x34);                             //8Bit扩充指令集,即使是36H也要写两次
    Writecommand(0x36);                             //绘图ON,基本指令集里面36H不能开绘图
    for(i=0;i<32;i++)                                    //12864实际为256x32
    {
        Writecommand(0x80|i);                       //行位置
        Writecommand(0x80);                         //列位置
		for(j=0;j<32;j++)                               //256/8=32 byte
			{                                                //列位置每行自动增加
                Writedata(DotByte);                  
			}
        DotByte=~DotByte;
     }
}
/**************************************************************
* 名称:Init_12864()			
* 功能:初始化12864
* 入口参数:无
* 出口参数:无
**************************************************************/
void Init_12864(void)			
{
	delay_ms(50); 			                           //用延时代替读忙,以避免死机
     Writecommand(0x30);                           //8BitMCU,基本指令集合
     Writecommand(0x03);                           //AC归0,不改变DDRAM内容
     Writecommand(0x0C);                           //显示ON,游标OFF,游标位反白OFF
     Writecommand(0x01);                           //清屏,AC归0
     Writecommand(0x06);                           //写入时,游标右移动
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -