LCD1602和LCD12864程序-并行与串行 下载本文

x:显示列,取值范围0-7 y:显示行,取值范围0-3 */

void LCD12864_SZXS(signed long sj,unsigned char xsfs,x,y) {

unsigned long xc; //显示缓存 unsigned char d[13]; bit xsd,fs,bf=0; xsd=0; fs=0;

LCD12864_XZL(0x04);//设置光标左移

LCD12864_XZL(LCD12864_SZDZ(x,y));//写入显示地址 y=0;

if(xsfs>10)

{x=16; //输出十六进制 d[y]=0x48; //十六进制显示H y++; } // else

{if(sj<0) //十进制正负数判断 {sj=~sj+1;

fs=1;} //负号显示使能 if(xsfs!=0) xsd=1;//小数点显示使能 x=10; } //

xc=sj;

if(xc!=0) //显示数据不为0;则显示

{while(xsd) //判是否需要显示小数 {if(xc!=0) //是否还需要计算 {sj=xc%x;

if(bf|sj!=0) //小数部分为0不需要显示 {d[y]=ascll12864[xc%x];

y++; //取数的ascll码并显示

bf=1; //小数部分不为0标志,小数部分数字有效 }

xc/=x; //取剩下的数 } else if(bf)

{d[y]=0x30; //判是否需要补0 y++;}

else; //小数部分无效,不需要补0

xsfs--;

if(xsfs==0) //小数点位数减一 {xsd=0; //小数计算部分结束标志 if(bf)

{d[y]=0x2e; //小数部分存在有效数字则显示小数点 y++;} } } }

do

{d[y]=ascll12864[xc%x]; //取数的ascll码 y++; xc/=x; } while(xc!=0); if(fs)

{d[y]=0x2d; //取负号ascll码 y++;}

if(y&&0x01) //如果显示的位数为奇数 {d[y]=0x20; //显示一个空格 y++;} x=y; y=1;

///////////////显示数据////////////// do {

LCD12864_XSJ(d[y]);//显示一个地址的前一个字符 y--;

LCD12864_XSJ(d[y]);//显示一个地址的后一个字符 y+=3; //跳到下一个要显示的两个字符 }

while(y

LCD12864_XZL(0x06);//设置光标右移 }

/***************************************************** **********LCD12864字符显示函数************************ ****************************************************** *zfc:需要显示的字符串指针,字符数不得超过64个 x:显示列,取值范围0-7 y:显示行,取值范围0-3 */

void LCD12864_ZFXS(unsigned char *zfc,x,y) {

unsigned char k1,k2,k3; k3=x*2;

k1=16-k3; k2=32-k3; k3=48-k3;

switch(y) //设置显示地址x和换行标志y {case 0:x|=0x80;y=0;break; case 1:x|=0x90;y=16;break; case 2:x|=0x88;y=32;break; case 3:x|=0x98;y=48;break; default:;}