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

📄 12864.h

📁 这是一个51系列单片机控制加热温度的程序
💻 H
字号:
#include "ziku.h"

#define LCDPI
#define LCDPS
#define LCDPF
//#define LCDPG
//#define LCDROW



#define STX 0x02
#define ETX 0x03
#define EOT 0x04
#define ENQ 0x05
#define BS 0x08
#define CR 0x0D
#define LF 0x0A
#define DLE 0x10
#define ETB 0x17
#define SPACE 0x20
#define COMMA 0x2C
#define TRUE 1
#define FALSE 0

#define HIGH 1
#define LOW 0
 
#define LCMDW XBYTE[0x8000] //数据口
#define LCMCW XBYTE[0x8100] //命令口

// **********************T6963C 命令定义**************
#define LC_CUR_POS 0x21 // 光标位置设置
#define LC_CGR_POS 0x22 // CGRAM 偏置地址设置
#define LC_ADD_POS 0x24 // 地址指针位置
#define LC_TXT_STP 0x40 // 文本区首址
#define LC_TXT_WID 0x41 // 文本区宽度
#define LC_GRH_STP 0x42 // 图形区首址
#define LC_GRH_WID 0x43 // 图形区宽度
#define LC_MOD_OR 0x80 // 显示方式逻辑或
#define LC_MOD_XOR 0x81 // 显示方式逻辑异或
#define LC_MOD_AND 0x82 // 显示方式逻辑与
#define LC_MOD_TCH 0x83 // 显示方式文本特征
#define LC_DIS_SW 0x90 // 显示开关D0=1/0:光标闪烁启用/禁用
                        // D1=1/0:光标显示启用/禁用
                        // D2=1/0:文本显示启用/禁用
                        // D3=1/0:图形显示启用/禁用
#define LC_CUR_SHP 0xA0 // 光标形状选择0xA0-0xA7表示光标占的行数
#define LC_AUT_WR 0xB0 // 自动写设置
#define LC_AUT_RD 0xB1 // 自动读设置
#define LC_AUT_OVR 0xB2 // 自动读/写结束
#define LC_INC_WR 0xC0 // 数据一次写地址加1
#define LC_INC_RD 0xC1 // 数据一次读地址加1
#define LC_DEC_WR 0xC2 // 数据一次写地址减1
#define LC_DEC_RD 0xC3 // 数据一次读地址减1
#define LC_NOC_WR 0xC4 // 数据一次写地址不变
#define LC_NOC_RD 0xC5 // 数据一次读地址不变
#define LC_SCN_RD 0xE0 // 屏读
#define LC_SCN_CP 0xE8 // 屏拷贝
#define LC_BIT_OP 0xF0 // 位操作
//*************************************************************


//***********************全局变量********************************
uchar code uPowArr[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code turnf[8] = {7,6,5,4,3,2,1,0};
uchar gCurRow,gCurCol; // 当前行列存储行高16 点列宽8点
//**************************************************************

//***********************硬件隔离层函数*************************
uchar Lcd_Readsta1(void)/* 状态位STA1,STA0判断读写指令和读写数据*/
{									/* 在读写数据或者写入命令前必须保证均为1 */
    uchar i;
    for(i=10;i>0;i--)
    {
        if((LCMCW & 0x03) == 0x03) // 读取状态
        {
            break;
        }
    }
    return(i); // 若返回零说明错误
}
uchar Lcd_Readsta2(void)/* 检查STA2,如果STA2=1 为自动读状态*/
{
    uchar i;
    for(i=10;i>0;i--)
    {
        if((LCMCW & 0x04) == 0x04)
        {
            break;
        }
    }
    return(i); // 若返回零说明错误
}

uchar Lcd_Readsta3(void)/* 状态位STA3 判断STA3 = 1 数据自动写状态*/
{
    uchar i;
    for(i=10;i>0;i--)
    {
        if((LCMCW & 0x08) == 0x08)
        {
            break;
        }
    }
    return(i); // 若返回零说明错误
}

uchar Lcd_Readsta6(void)/* 状态位STA6 判断STA6 =1 屏读/屏拷贝状态*/
{
    uchar i;
    for(i=10;i>0;i--)
    {
        if((LCMCW & 0x40) == 0x40)
        {
            break;
        }
    }
    return(i); // 若返回零说明错误
}
uchar Lcd_Writecmd0(uchar uCmd)/* 写无参数的指令*/
{   
    if(Lcd_Readsta1() == 0)
    {
        return 1;
    }
   LCMCW=uCmd;
   return(0); // 返回0 成功
}

uchar Lcd_Writecmd1(uchar uCmd,uchar uPar1)/* 写单参数的指令*/
{
    if(Lcd_Readsta1() == 0)
    {
        return 1;
    }
    LCMDW=uPar1;
    if(Lcd_Readsta1() == 0)
    {
        return 2;
    }
    LCMCW=uCmd;
    return(0); // 返回0 成功 
}

uchar Lcd_Writecmd2(uchar uCmd,uchar uPar1,uchar uPar2)/* 写双参数的指令*/
{											
    if(Lcd_Readsta1() == 0)
    {
        return 1;
    }
    LCMDW=uPar1;
    if(Lcd_Readsta1() == 0)
    {
        return 2;
    }
    LCMDW=uPar2;
    if(Lcd_Readsta1() == 0)
    {
        return 3;
    }
    LCMCW=uCmd;
    return(0); // 返回0 成功
}
uchar Lcd_Writedata(uchar uData)/* 写数据*/
{
    if(Lcd_Readsta3() == 0)
    {
        return 1;
    }
    LCMDW=uData;
    return(0); // 返回0 成功
}
uchar Lcd_Readdata(void)/* 读数据*/
{
    if(Lcd_Readsta1() == 0)
    {
         return 1; // 获取状态如果状态错
    }
    return(LCMDW); // 返回数据
}
//**************************************************************

//***********************设备驱动层函数*************************
void Lcd_Setxy(uchar ucol,uchar urow )//* 设置当前地址0<ucol<128 0<urow<64
{
    uint iPos;
	 ucol >>=3;
    iPos = (uint)urow * 30 + ucol;   //?~~~~~~~~~~~~~~~~~~
    Lcd_Writecmd2(LC_ADD_POS,iPos & 0x00FF,iPos >> 8);
    gCurRow = urow;
    gCurCol = ucol;
}
void Lcd_Putpoint(uchar x,uchar y,uchar s)/* 画点*/
{
    uchar x1;
    //x1 = x >> 3; // 取Y方向分页地址
    Lcd_Setxy(x,y); // 起点定位
    x1 = turnf[ x & 0x07 ];
    x1 = 0xF0 | x1 | s; // 字节内位置计算
    Lcd_Writecmd0(x1); // 画上屏幕S显示属性8 画点0 擦除点
}
#ifdef LCDROW
uchar Lcd_GetRow(void)/*读取当前行数*/   // 当前行列存储行高16 点列宽8点
{
    return(gCurRow);
}
uchar Lcd_GetCol(void)/*读取当前列数*/
{
    return(gCurCol);
}
#endif
uchar Lcd_Putchar(uchar x,uchar y,uchar c[2])//输出一个字符,或汉字,返回值1为字符,2为汉字,0<x<16,0<y<4
{
	uchar j,i,k,c1,c2;
	c1=c[0];
	c2=c[1];
	y = y<<4;
	x = x<<3;
	if(c1 <=128)// **************************************ASCII*************************
	{
		for(j=0;j<16;j++) //写16行
		{
			Lcd_Setxy(x,y+j);
        	Lcd_Writecmd0(LC_AUT_WR);    			// 写数据(命令)
        	if (c1 >= 0x20)
        	{
				Lcd_Writedata( ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)] );
        	}
     	 	else
     	 	{
        	    Lcd_Writedata(0x00);
        	}
        	Lcd_Writecmd0(LC_AUT_OVR);  			//写数据结束
		}
		if(c1==BS)return -1;//退格键
		else return 1;//一般字符	   				
	}
	else //************************************************中文***************************
	{
		for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)  	// 查找定位,第几个汉字
		{
			if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
			{
				break;
			}			
		}
		for(k=0;k<sizeof(GB_16[0].Msk)/HZ_WIDTH;k++)    //16行循环
		{
			Lcd_Setxy(x,y+k);
			Lcd_Writecmd0(LC_AUT_WR);      		// 写数据
			if(j < sizeof(GB_16)/sizeof(GB_16[0]))  //四个汉字 第几个汉字
			{
				for(i=0;i<HZ_WIDTH;i++)Lcd_Writedata(GB_16[j].Msk[k*HZ_WIDTH+i]);
			}
			else   		// 未找到该字
			{
				if(k < sizeof(GB_16[0].Msk)/4)
				{
					Lcd_Writedata(0x00);
					Lcd_Writedata(0x00);
				}
				else
				{
					Lcd_Writedata(0xff);
					Lcd_Writedata(0xff);
				}
			}
			Lcd_Writecmd0(LC_AUT_OVR);
		}
		return 2;
	}
}
//**************************************************************

//***********************功能层函数*****************************
void Lcd_Clr(void)/* 清屏*/
{
    uint i;
    Lcd_Writecmd2(LC_ADD_POS,0x00,0x00); // 置地址指针为从零开始
    Lcd_Writecmd0(LC_AUT_WR); // 自动写
    for(i=0;i<240*128/8;i++) // 清一屏
    {
        Lcd_Readsta3();
        Lcd_Writedata(0x0); // 写数据实际使用时请将0x55 改成0x0
    }
    Lcd_Writecmd0(LC_AUT_OVR); // 自动写结束
    Lcd_Writecmd2(LC_ADD_POS,0x00,0x00); // 重置地址指针
    gCurRow = 0; // 置地址指针存储变量
    gCurCol = 0;
}

uchar Lcd_Initial(void)/* LCD 初始化*/
{
    if(Lcd_Writecmd2(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
    {
        return (0xff);
    }
    Lcd_Writecmd2(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
    Lcd_Writecmd2(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
    Lcd_Writecmd2(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
    Lcd_Writecmd0(LC_CUR_SHP | 0x01); // 光标形状
    Lcd_Writecmd0(LC_MOD_OR); // 显示方式设置
    Lcd_Writecmd0(LC_DIS_SW | 0x08); // 显示开关设置
	Lcd_Clr();
    return(0);
}
#ifdef LCDPS
uchar Lcd_Puts(uchar x,uchar y, uchar *ptr)/*显示 ASCII(8*16) 及 汉字(16*16)字符串函数*/
{
	uchar c[2],i,uLen;
	uLen=0;
	while(ptr[uLen]!=0) //探测字串长度
	{
		uLen++;
	}
	i=0;	
	while(i<uLen)
	{
		c[0]= ptr[i];
    	c[1]= ptr[i+1];
		x+=Lcd_Putchar(x,y,c);//显示一个字符
		if(ptr[i]>128)i++;
		if(x==255)
		{
			x=15;
			y=(y-1+4)&0x03;
		}
		if(x>=16)//向上换行
		{
			x=0;
			y=(y+1)&0x03;
		}
		i++;
	}
	return uLen;        //返回字串长度,汉字按2字节计算
}
#endif
#ifdef LCDG
void Lcd_Putline(uchar x0,uchar y0,uchar xt,uchar yt,uchar s)
{												/* 画线任意方向的斜线,直线数学方程aX+bY=1 */
    register uchar t;
    int xerr = 0,yerr = 0;
    int delta_x,delta_y,distance;
    int incx,incy,uRow,uCol;
    delta_x = xt-x0; // 计算坐标增量
    delta_y = yt-y0;
    uRow = x0;
    uCol = y0;
    if(delta_x>0)
    {
        incx = 1; // 设置单步方向
    }
    else if( delta_x==0 )
    {
        incx=0; // 垂直线
    }
    else
    {
        incx = -1;
        delta_x = -delta_x;
     
    }
    if(delta_y>0)
    {
        incy=1;
    }
    else if( delta_y==0 ) 
    {
        incy=0; // 水平线
    }
    else 
    {
        incy=-1;
        delta_y=-delta_y;
    }
    if( delta_x > delta_y ) 
    {
        distance=delta_x; // 选取基本增量坐标轴
    }
    else 
    {
        distance=delta_y;
    }
    for( t=0;t <= distance+1; t++ )   // 画线输出
    { 
        Lcd_Putpoint(uRow,uCol,s); // 画点
        xerr += delta_x;
        yerr += delta_y;
        if( xerr > distance )
        {
            xerr -= distance;
            uRow += incx;
        }
        if( yerr > distance )
        {
            yerr -= distance;
            uCol += incy;
        }
    }
}
//**************************************************************


void Lcd_Putcircle(uchar Ox,uchar Oy,uchar Rx,uchar s)/* 画圆数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
{
    uint xx,rr;
    uint xt,yt;
    uint rs,row,col;
    yt = Rx;
    rr = (uint)Rx*Rx+1; // 补偿1 修正方形
    rs = (yt+(yt>>1))>>1; // (*0.75)分开1/8圆弧来画
    for (xt=0;xt<=rs;xt++)
    {
        xx = xt*xt;
        while ((yt*yt)>(rr-xx))
        {
            yt--;
        }
        row = Ox+xt; // 第一象限
        col = Oy-yt;
        Lcd_Putpoint(row,col,s);
        row = Ox-xt; // 第二象限
        Lcd_Putpoint(row,col,s);
        col = Oy+yt; // 第三象限
        Lcd_Putpoint(row,col,s);
        row = Ox+xt; // 第四象限
        Lcd_Putpoint(row,col,s);
        /***************45度镜象画另一半***************/
        row = Ox+yt; // 第一象限
        col = Oy-xt;
        Lcd_Putpoint(row,col,s);
        row = Ox-yt; // 第二象限
        Lcd_Putpoint(row,col,s);
        col = Oy+xt; // 第三象限
        Lcd_Putpoint(row,col,s);
        row = Ox+yt; // 第四象限
        Lcd_Putpoint(row,col,s);
    }
}
#endif
//**************************应用层函数**************************
#ifdef LCDPI
void Lcd_Putint(uchar x,uchar y,uchar i,uint num)//最多5位
								//x y为起始坐标,num是要显示的数,i是要显示的位数
{
	uchar bcd[8];
	uint temp;
	bcd[i--]=0x00;
	temp=num;
	for(;(i>=0)&&(i<8);i--)
	{
		bcd[i]=temp%10+0x30;
		temp=temp/10;
	}
	Lcd_Puts(x,y,bcd);	
}
#endif
#ifdef LCDPF 
void Lcd_Putfloat(uchar x,uchar y,uchar intnum,uchar fnum,uint num)//最多5位
								//x y为起始坐标,num是要显示的数,fnum小数位数,intnum为整数位数
{
	Lcd_Putint(x+intnum+1,y,fnum,num);//显示小数部分
	for(;fnum>0;fnum--)num/=10;
	Lcd_Putint(x,y,intnum,num);//显示整数部分
	Lcd_Putchar(x+intnum,y,".");//小数点
}
#endif
//**************************************************************

⌨️ 快捷键说明

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