📄 c_lcd19264_driver.c
字号:
* . -- .
* D7 -- P0.16 // DB7
***********************************************************************/
void LCD19264_16BNumber(uint8 x,uint8 y,uint16 integral,uint8 effect)
{
uint8 nx,i,j,k,flage;
k = x;
//Lcd19264_8X16_Cls (x, y, effect) ; //擦除原来的
flage = 0;
//if(integral==0) Lcd19264_8X16(x,y,(ynumber),1);
for(i=effect;i>0;i--)
{
nx = (integral >>(4*(i-1)))&0x0f;
if(nx == 0 && flage==0) j++;
else flage = 1;
if(flage == 1)
{
Lcd19264_8X16(x,y,(ynumber16b+nx*16),1);
x += 8;
}
}
Lcd19264_8X16_Cls ((k+(effect-j)*8), y,j);
if(integral==0) Lcd19264_8X16(x,y,(ynumber),1);
}
/***********************************************************************
* 名 称:uint8 LCD19264_Number(uint8 x,uint8 y,uint16 integral)
* 功 能:将4位的16进制数输出
* 入口参数:输入,x,y坐标,整数部分,有效数字个数
* 出口参数:
* 说明 :
* R/S -- P0.3 // RS
* R/W -- P0.4 // RW
* E -- P0.5 // E
* CS1 -- P0.6 //CS1
* CS2 -- P0.7 //CS2
* CS3 -- P0.8 //CS3
* D0 -- P0.9 // DB0
* . -- .
* . -- .
* . -- .
* D7 -- P0.16 // DB7
***********************************************************************/
void LCD19264_Number(uint8 x,uint8 y,uint16 integral,uint8 effect,uint8 turn_over)
{
uint32 nx,i,j,k,l,m,flage;
flage = 0;
k = x;
l = effect;
m = integral;
for(i=(effect+1);i>0;i--)
{
nx = integral/SQURE10[l];
integral = integral%SQURE10[l];
l--;
if(nx == 0 && flage==0) j++;
else flage = 1;
if(flage == 1)
{
Lcd19264_8X16COVE(x,y,(ynumber16b+nx*16),1,turn_over);
x += 8;
}
}
Lcd19264_8X16_Cls ((k+(effect-j+1)*8), y,j);
if(m==0) Lcd19264_8X16COVE(x,y,(ynumber),1,turn_over);
}
/***********************************************************************
* 名 称:
* 功 能:
* 原 理: 自动识别位数(最大6位),整数部分,小数部分输出完后,将剩余位置清零
* 入口参数:输入,x,y坐标,数据(支持浮点),输出小数最大位数,turnover为1时反色输出,有效位数
* 出口参数:不成功输出0XFF,成功0x01
* 说明 :,
* R/S -- P0.3 // RS
* R/W -- P0.4 // RW
* E -- P0.5 // E
* CS1 -- P0.6 //CS1
* CS2 -- P0.7 //CS2
* CS3 -- P0.8 //CS3
* D0 -- P0.9 // DB0
* . -- .
* . -- .
* . -- .
* D7 -- P0.16 // DB7
***********************************************************************/
uint8 LCD19264_FNum(uint8 x,uint8 y,fp32 float_num,uint8 outbit ,uint8 turnover,uint8 effect)
{
uint8 i,j,k,ox; //循环用变量,中转变量,ox为保留x的原来值
uint32 integral,ni,k32;
fp32 floatt;
ox = x; //保留原值
if(float_num ==0)
{
Lcd19264_8X16COVE(x,y,ynumber,1,turnover);
x+=8;
Lcd19264_8X16COVE(x,y,NONE,(effect-1),turnover);
return(0x44);
}
integral = (uint32)float_num; //获取整数部分
/***********************************************************************
* 输出整数部分
***********************************************************************/
if(integral>999999 ) return(0x44); //过滤参数,最大999999
else
{
if(integral>99999) i = 6;
else if(integral>9999) i = 5;
else if(integral>999) i = 4;
else if(integral>99) i = 3;
else if(integral>9) i =2;
else i = 1;
}
k32 = integral;
k = i;
for(;i>0;)
{
i--;
ni = integral/SQURE10[i]; //取剩下的最高位
Lcd19264_8X16COVE(x,y,(ynumber+ni*16),1,turnover);
integral %= SQURE10[i]; //取下一个位
x += 8; //移向下一位
}
integral = k32;
i = k;
/***********************************************************************
* 输出小部分
***********************************************************************/
floatt = (float_num*SQURE10[outbit] - integral*SQURE10[outbit])/SQURE10[outbit] ;//取出小数,这样搞的目的是消除浮点运算错误
if(floatt == 0)
{
Lcd19264_8X16COVE(x,y,NONE,(effect-k+1),turnover); //擦除剩下的
return(0x01); //无小数部分输出完毕
}
integral = (uint32)(floatt*SQURE10[outbit]); //将小数变整
if(integral==0) //防止浮点舍入错误
{
Lcd19264_8X16COVE(x,y,NONE,(effect-k+1),turnover); //擦除剩下的
return(0x01);
}
Lcd19264_8X16COVE( x,y,dot,1,turnover); //写小数点
x+=8; //刷新位置
k32 = integral;
for(i=0;;) //获取真正需要显示的位数
{
ni = integral%10;
if(ni !=0 ) //探测最高位
{
//i = outbit - i; //获得真正需要显示的位数
break;
}
i++;
integral /= 10;
}
k=i;
integral = k32;
//以下输出为0的位
//k32 =SQURE10[outbit-1];
for(j=0;;j++)
{
floatt *= 10;
if(floatt >0.99999999) break; //出现整数即可退出
Lcd19264_8X16COVE( x,y,ynumber,1,turnover);//输出0
x+=8;
}
integral /= SQURE10[i]; //获得输出非0部分
i = outbit - j-i;
for(;i>0;i--) //输出剩下的非0值
{
ni = integral;
ni /= SQURE10[i-1] ; //取剩下的最高位
Lcd19264_8X16COVE(x,y,(ynumber+ni*16),1,turnover);
integral %= SQURE10[i-1] ; //取下一个位
x += 8; //移向下一位
}
Lcd19264_8X16COVE(x,y,NONE,k,turnover); //擦除剩下的
return(0x01);
}
/***********************************************************************
* 名 称:uint8 LCD19264_NEW_FNum(uint8 x,uint8 y,fp32 float_num,uint8 Qpoint ,uint8 turnover)
* 功 能:输出一个带小数点的浮点数
* 入口参数:输入,x,y坐标,数据(支持浮点),输出小数位数,最多可显示数字位数,turnover为1时反色输出
* 出口参数:不成功输出0X00,成功0x01
* 说明 :占用位置为有效位数+1,注意小数位不能太大,5以下,否则会造成溢出错误
注意显示显示数字位数应大于(小数位数+加预想的整数位数+1),为占液晶显示的数字个数
* R/S -- P0.3 // RS
* R/W -- P0.4 // RW
* E -- P0.5 // E
* CS1 -- P0.6 //CS1
* CS2 -- P0.7 //CS2
* CS3 -- P0.8 //CS3
* D0 -- P0.9 // DB0
* . -- .
* . -- .
* . -- .
* D7 -- P0.16 // DB7
***********************************************************************/
uint8 LCD19264_NEW_FNum(uint8 x,uint8 y,fp32 float_num,int8 Qpoint ,int8 effect,uint8 turnover)
{
uint32 m_sbuf;
int32 i,j,point_flage=0;
uint8 sbuf[12]; //数据缓冲
fp32 mf;
if(float_num<0) float_num = 0;
i=0;
if(float_num == 0) //数字为0
{
i = Qpoint+1;
Stack_Push8_7_11(sbuf,0,12);
}
if(float_num<1&&float_num>0) //为显示小于一的那个数的0做准备
{
mf = float_num;
while(mf < 0.9999999) //不为1是为了解决浮点运算错误
{
mf = mf*10;
point_flage++;
}
}
float_num *=SQURE10[Qpoint];
if(float_num > 1000000000) return(0); //超出所能处理的范围
m_sbuf = (uint32) float_num;
if(m_sbuf>SQURE10[effect]) m_sbuf =SQURE10[effect]-1;//超出设定的可显视范围
if(m_sbuf%SQURE10[Qpoint] == 0) point_flage=-1;
sbuf[0] = 1; //按要求初始化堆栈用数组
while(m_sbuf!=0) //将数字入盏
{
i++; //输入计数
j = m_sbuf%10;
Stack_Push8_7_11(sbuf,j,12);
m_sbuf/=10;
}
if(point_flage>0) //输入数字小于1
{
i = Qpoint+1; //输出一个0
for(;point_flage>0;point_flage--)
{
Stack_Push8_7_11(sbuf,0,12);
}
}
i = i - Qpoint; //获取整数个数
for(;i>0;i--)
{
j = Stack_Pop8_7_11(sbuf);
Lcd19264_8X16COVE( x,y,(ynumber+j*16),1,turnover);//输出
x+=8;
effect--;
}
if(point_flage <0 )
{
Qpoint=0;
effect +=Qpoint+1;
}
if(Qpoint!=0)
{
Lcd19264_8X16COVE( x,y,dot,1,turnover); //写小数点
x+=8;
for(;Qpoint>0;Qpoint--)
{
j = Stack_Pop8_7_11(sbuf);
Lcd19264_8X16COVE( x,y,(ynumber+j*16),1,turnover);//输出
x+=8;
effect--;
}
}
if(effect <0) //超出显示有的效位数,将超出部分删除
{
effect *= -1;
x -= (effect<<3);
}
Lcd19264_8X16_Cls (x, y,effect); //擦除多余的
return(1);
}
/***********************************************************************
* 名 称:LCD19264_Navigate(uint8 x,uint8 y,uint16 along, uint16 Total,uint16 value )
* 功 能:导航条
* 原 理:
* 入口参数:导航条坐标,总长along,代表总量Total,当前量value,复位reset
* 出口参数:
* 说明 :使用前必须先复位,非可重入函数
* R/S -- P0.3 // RS
* R/W -- P0.4 // RW
* E -- P0.5 // E
* CS1 -- P0.6 //CS1
* CS2 -- P0.7 //CS2
* CS3 -- P0.8 //CS3
* D0 -- P0.9 // DB0
* . -- .
* . -- .
* . -- .
* D7 -- P0.16 // DB7
***********************************************************************/
void LCD19264_Navigate(uint8 x,uint8 y,uint16 along , uint16 Total,uint16 value ,uint8 reset)
{
uint8 i;
static hl,hy,ovalue=1;
if(reset ==1 ) //复位
{
ovalue =0;
/***********************************************************************
* 画方条
***********************************************************************/
LCD19264_Linehv(x,y,x,(y+along));
LCD19264_Linehv((x+5),y,(x+5),(y+along));
LCD19264_Linehv(x,y,(x+5),y);
LCD19264_Linehv(x,(y+along),(x+5),(y+along));
/***********************************************************************
* 画划块
***********************************************************************/
hl = along / Total; //计算划块长度
if ( hl==0 ) hl = 1; //倘若小于1
}
if(ovalue != value || reset ==1) //现在的value出现变化
{
hy = (value*hl)+1; //计算划块的位置
if(hy>(y+along)) hy = y+along-1; //超过复位
for(i=1;i<5;i++)
{
LCD19264_Cls_Linehv((x+i),(y+1),(x+i),(y+along-1)); //以下为清除原来的划快
}
for(i=0;i<hl;i++) //画滑块
{
if(y+hy+i < y+along)
{
LCD19264_Linehv((x+1),(y+hy+i),(x+4),(y+hy+i));
}
}
ovalue = value; //给旧值付新值
}
}
#endif
/***********************************************************************
* 名 称:LCD19264_picture (uint8 x,uint8 y,uint8 width,uint8 hight,uint8 const *str)
* 功 能:画任意大小的图
* 原 理:
* 入口参数://输入坐标,数组指针,字符个数
* 出口参数:
* 说明 :
* R/S -- P0.3 // RS
* R/W -- P0.4 // RW
* E -- P0.5 // E
* CS1 -- P0.6 //CS1
* CS2 -- P0.7 //CS2
* CS3 -- P0.8 //CS3
* D0 -- P0.9 // DB0
* . -- .
* . -- .
* . -- .
* D7 -- P0.16 // DB7
***********************************************************************/
void LCD19264_picture (uint8 x,uint8 y,uint8 width,uint8 hight,uint8 const *str) //输入坐标,数组指针,字符个数
{ uint8 i,j;
for ( i = 0; i < hight; i ++) //写上下两个半部分
for (j = 0; j < width; j ++ ) //整行16个
LCD19264_Writedata(x + j,y + i,*(str ++)); //遇到‘/0’不写
//y += 2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -