数码管驱动[教材]
数码管驱动
//P201 电压 P202 电流
//LG5641AH管脚 共阴极 1至12脚分别为:e d h c g 4 b 3 2 f a
1 管脚的数法:有字面向自己,左下脚为第一脚,逆时针数。
#define SMYS 1 //扫描延时
#define KJYS 1000 //开机延时
#define AA 10 //A
#define bb 11 //b
#define CC 12 //C
#define dd 13 //d
#define EE 14 //E
#define FF 15 //F
#define HH 16 //H
#define LL 17 //L
#define PP 18 //P
#define rr 19 //r
#define UU 20 //U
#define ZHX 21 //中横线
#define XHX 22 //下横线
#define OFF 23 //全灭
#define POINT 24 //带点的0
unsigned char code
font[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71, 0x76,0x38,0x73,0x31,0x3e,
0x40,0x08, 0x00,
0x3f+0x80,0x06+0x80,0x5b+0x80,0x4f+0x80,0x66+0x80,0x6d+0
x80,0x7d+0x80,0x07+0x80,0x7f+0x80,0x6f+0x80,}; //不带小数点 +0x80则带小数点
//0-9 A b C d E F H L P r U - _ 全灭 带点的0-9
//0-9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24-33
//unsigned char code led[]={0x31,0x32,0x34,
0x51,0x52,0x54, 0x18, }; //分别为待机,准备,工作
unsigned char data xsbuf[8]; //对应8个数码管
unsigned char data xspos; //
void xsinit()
{
P0M0 =0xff; //提高驱动能力
P0M1 =0x00;
// P2M0=0xff;
// P2M1=0x00;
// P0=0; //全灭 //单片机开机复位后,所有引脚为高电平,全亮,,
// P2=0;
}
void xscl() small //显示任务 {
while(1)
{
xspos=0; // 从第0个xsbuf开始,以下顺序不能巅倒,可以把显示缓冲放在任意数据码中显示
P0=font[xsbuf[xspos]];//加载内容
P24=0; //(低)显示
wait(SMYS);
P24=1; //(高)不显示
xspos++;
P0=font[xsbuf[xspos]];//加载内容
P25=0; //(低)显示
wait(SMYS);
P25=1; //(高)不显示
xspos++;
P0=font[xsbuf[xspos]];//加载内容
P26=0; //(低)显示
wait(SMYS);
P26=1; //(高)不显示
xspos++;
P0=font[xsbuf[xspos]];//加载内容
P27=0; //(低)显示
wait(SMYS);
P27=1; //(高)不显示
xspos++;
P0=font[xsbuf[xspos]];//加载内容
P20=0; //(低)显示
wait(SMYS);
P20=1; //(高)不显示
xspos++;
P0=font[xsbuf[xspos]];//加载内容
P21=0; //(低)显示
wait(SMYS);
P21=1; //(高)不显示
xspos++;
P0=font[xsbuf[xspos]];//加载内容
P22=0; //(低)显示
wait(SMYS);
P22=1; //(高)不显示
xspos++;
P0=font[xsbuf[xspos]];//加载内容
P23=0; //(低)显示
wait(SMYS);
P23=1; //(高)不显示
xspos++;
}
}
//以上为显示驱动
//以下为显示内容
void xskjdh() //P2.(4567 0123)逐个显示 再全灭
{
L_ERROR=L_ON;
P0=0xff;
P24=0;
yans(KJYS);
P24=1;
L_WORK=L_ON;
P0=0xff;
P25=0;
yans(KJYS);
P25=1;
L_READY=L_ON;
P0=0xff;
P26=0;
yans(KJYS);
P26=1;
L_STANDBY=L_ON;
P0=0xff;
P27=0;
yans(KJYS);
P27=1;
L_STANDBY=L_OFF;
P0=0xff;
P20=0;
yans(KJYS);
P20=1;
L_READY=L_OFF;
P0=0xff;
P21=0;
yans(KJYS);
P21=1;
L_WORK=L_OFF;
P0=0xff;
P22=0;
yans(KJYS);
P22=1;
L_ERROR=L_OFF;
P0=0xff;
P23=0;
yans(KJYS);
P23=1;
/* P0=0; //全灭
P2=0;
yans(KJYS);
P0=0; //全灭
P2=0xff;
yans(KJYS);
P0=0xff; //全亮
P2=0;
yans(KJYS);
*/
P0=0xff; //全灭 先全部关闭,给P0赋值,P2决定在哪个
数码管上显示P0值,然后关闭该数码管,扫描显示其它值到其它数码
管。
P2=0xff;
yans(KJYS);
}
void xsbbh()
{
xsbuf[0]=8;
xsbuf[1]=8;
xsbuf[2]=HH; //
xsbuf[3]=BBH/16; //十位 软件版本号
xsbuf[4]=BBH%16; //个位
xsbuf[5]=ZHX; //
xsbuf[6]=dybbh/16;
xsbuf[7]=dybbh%16; // 电源版本号 }
void xsgztime() //十进制显示 分钟前有点 时间是倒着保存的,所以倒着读出
{
xsbuf[0]=Byte_Read(GZADD+erjm+3)%100/10; //十位
xsbuf[1]=Byte_Read(GZADD+erjm+3)%10; //个位
xsbuf[2]=Byte_Read(GZADD+erjm+2)%100/10; //十位
xsbuf[3]=Byte_Read(GZADD+erjm+2)%10; //个位
xsbuf[4]=Byte_Read(GZADD+erjm+1)%100/10; //十位
xsbuf[5]=Byte_Read(GZADD+erjm+1)%10+POINT; //个位
xsbuf[6]=Byte_Read(GZADD+erjm )%100/10; //十位
xsbuf[7]=Byte_Read(GZADD+erjm )%10; //个位
}
void xsgzsj() //显示故障接收数据 {
xsbuf[0]=Byte_Read(GZADD+erjm )/16; //十位
xsbuf[1]=Byte_Read(GZADD+erjm )%16; //个位
xsbuf[2]=Byte_Read(GZADD+erjm+1)/16; //十位
xsbuf[3]=Byte_Read(GZADD+erjm+1)%16; //个位
xsbuf[4]=Byte_Read(GZADD+erjm+2)/16; //十位
xsbuf[5]=Byte_Read(GZADD+erjm+2)%16; //个位
xsbuf[6]=Byte_Read(GZADD+erjm+3)/16; //十位
xsbuf[7]=Byte_Read(GZADD+erjm+3)%16; //个位
}
//-----------------------------显示画面,故障显示
void xsgz()
{
if(erjm*GZBJ==0||erjm/GZBJ%7==0) //4*0 4*1 4*2 4*3 4*4
4*5 4*6 4*7
xsgztime();
else
xsgzsj();
}
//-------------------------------------显示时间
void xstime() //十进制显示 分钟前有点 {
xsbuf[0]=sjsz[3]/10; //十位
xsbuf[1]=sjsz[3]%10; //个位
xsbuf[2]=sjsz[2]/10; //十位
xsbuf[3]=sjsz[2]%10; //个位
xsbuf[4]=sjsz[1]/10; //十位
xsbuf[5]=sjsz[1]%10+POINT; //个位
xsbuf[6]=sjsz[0]/10; //十位
xsbuf[7]=sjsz[0]%10; //个位 }
void xszt()
{
switch(POW_CON)
{
case WORK: //工作
L_STANDBY=L_OFF;
L_READY=L_OFF;
L_WORK=L_ON;
break;
case READY: //准备
L_STANDBY=L_OFF;
L_READY=L_ON;
L_WORK=L_OFF;
break;
default:
L_STANDBY=L_ON;
L_READY=L_OFF;
L_WORK=L_OFF;
}
}
void xserledoff()
{
L_ERROR=L_OFF;
}
void xser() small
{
L_ERROR=L_ON;
xsbuf[0]=EE; //最高位 错误
xsbuf[1]=ZHX; //千位
xsbuf[2]=ZHX; //十位
xsbuf[3]=ZHX; //个位
xsbuf[4]=ZHX; //最高位
xsbuf[5]=ZHX; //千位
xsbuf[6]=errno/16; //十位
xsbuf[7]=errno%16; //个位 }
void xsxtwd()
{
xsbuf[0]=dd; //最高位 错误
xsbuf[1]=XHX; //千位
xsbuf[2]=XHX; //十位
xsbuf[3]=XHX; //个位
xsbuf[4]=XHX; //最高位
xsbuf[5]=wdbarr[(unsigned char)(wdsj+wdjz)]%1000/100; //
千位
xsbuf[6]=wdbarr[(unsigned char)(wdsj+wdjz)]%100/10; //
十位
xsbuf[7]=wdbarr[(unsigned char)(wdsj+wdjz)]%10; //个
位
}
void xss(unsigned char bs,num)
{
if(0==(bs&0xc0)) //无小数 0x1100 0000 //192
//0x00 XX XXXX
{
// xsbuf[3]=((unsigned int )(num*bs))%100000/10000;
//万位
xsbuf[4]=((unsigned int )(num*bs))%10000/1000; //千
位
xsbuf[5]=((unsigned int )(num*bs))%1000/100; //百位
xsbuf[6]=((unsigned int )(num*bs))%100/10; //十位
xsbuf[7]=((unsigned int )(num*bs))%10; //个位
}
else if((bs&0xc0)==0x80) //一位小数 //0x10 XX XXXX
{
// xsbuf[3]=((unsigned int )(num*bs))%100000/10000; //
万位
xsbuf[4]=((unsigned int )(num*(bs&0x3f)))%10000/1000;
//千位
xsbuf[5]=((unsigned int )(num*(bs&0x3f)))%1000/100;
//百位
xsbuf[6]=((unsigned
int )(num*(bs&0x3f)))%100/10+POINT ; //十位
xsbuf[7]=((unsigned int )(num*(bs&0x3f)))%10; //个
位
}
else if((bs&0xc0)==0xc0) //两位小数 //0x11 XX XXXX
{
// xsbuf[3]=((unsigned int )(num*bs))%100000/10000;
//万位
xsbuf[4]=((unsigned int )(num*(bs&0x3f)))%10000/1000;
//千位
xsbuf[5]=((unsigned
int )(num*(bs&0x3f)))%1000/100+POINT; //百位
xsbuf[6]=((unsigned int )(num*(bs&0x3f)))%100/10; //十位
xsbuf[7]=((unsigned int )(num*(bs&0x3f)))%10; //个
位
}
else if((bs&0xc0)==0x40) //两位小数 取一位有效 //0x01
XX XXXX
{
// xsbuf[3]=XHX;
xsbuf[4]= ((unsigned
int )(num*(bs&0x3f)))%100000/10000; //万位
xsbuf[5]=((unsigned int )(num*(bs&0x3f)))%10000/1000;
//千位
xsbuf[6]=((unsigned
int )(num*(bs&0x3f)))%1000/100+POINT; //百位
xsbuf[7]=((unsigned int )(num*(bs&0x3f)))%100/10; //十位
}
}
void xsszcs() small
{
unsigned char i;
xsbuf[0]=CC; //最高位
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示设置
xsbuf[1]=xuhao%100/10; //十位
xsbuf[2]=xuhao%10; //个位
xsbuf[3]=XHX;
if(9==xuhao) //与温度相关的单独处理
i=wdbarr[(unsigned char)(wdsx+wdjz)];
else if(8==xuhao)
i=wdbarr[(unsigned char)(fsqd+wdjz)];
else if(23==xuhao)
i=wdbarr[(unsigned char)(wdsx+wdjz)];
else if(2==xuhao)
{
xss(dlbs,mcdl);
return;
}
else if(4==xuhao)
{
xss(dlbs,ydl);
return;
}
else
i=(*xuhaoarr[xuhao]);
xsbuf[4]=XHX; //最高位
switch(xuhao) //使用switch可以快速处理 十/十六进制分流
{
case 6: case 7: case 10: case 11: case 12: case 13:
case 18: case 19: case 20: case 21: //十六进制
xsbuf[5]=XHX; //千位
xsbuf[6]=(*xuhaoarr[xuhao])/16; //十位
xsbuf[7]=(*xuhaoarr[xuhao])%16; //个位
break;
default: //十进制
xsbuf[5]=(*xuhaoarr[xuhao])%1000/100; //千位
xsbuf[6]=(*xuhaoarr[xuhao])%100/10; //十位
xsbuf[7]=(*xuhaoarr[xuhao])%10; //个位
break;
}
}
void xss0123(unsigned char bs,num) //和xss一样 显示位置为0123
{
if(0==(bs&0xc0)) //无小数 0x1100 0000 //192
//0x00 XX XXXX
{
// xsbuf[3]=((unsigned int )(num*bs))%100000/10000;
//万位
xsbuf[0]=((unsigned int )(num*bs))%10000/1000; //千位
xsbuf[1]=((unsigned int )(num*bs))%1000/100; //百位
xsbuf[2]=((unsigned int )(num*bs))%100/10; //十位
xsbuf[3]=((unsigned int )(num*bs))%10; //个位
}
else if((bs&0xc0)==0x80) //一位小数 //0x10 XX XXXX
{
// xsbuf[3]=((unsigned int )(num*(bs&0x3f)))%100000/10000;
//万位
xsbuf[0]=((unsigned int )(num*(bs&0x3f)))%10000/1000;
//千位
xsbuf[1]=((unsigned int )(num*(bs&0x3f)))%1000/100;
//百位
xsbuf[2]=((unsigned
int )(num*(bs&0x3f)))%100/10+POINT ; //十位
xsbuf[3]=((unsigned int )(num*(bs&0x3f)))%10; //个
位
}
else if((bs&0xc0)==0xc0) //两位小数 //0x11 XX XXXX
{
// xsbuf[3]=((unsigned int )(num*(bs&0x3f)))%100000/10000;
//万位
xsbuf[0]=((unsigned int )(num*(bs&0x3f)))%10000/1000;
//千位
xsbuf[1]=((unsigned
int )(num*(bs&0x3f)))%1000/100+POINT; //百位
xsbuf[2]=((unsigned int )(num*(bs&0x3f)))%100/10; //十位
xsbuf[3]=((unsigned int )(num*(bs&0x3f)))%10; //个位
}
else if((bs&0xc0)==0x40) //两位小数 取一位有效 //0x01 XX XXXX
{
// xsbuf[3]=XHX;
xsbuf[0]= ((unsigned
int )(num*(bs&0x3f)))%100000/10000; //万位
xsbuf[1]=((unsigned int )(num*(bs&0x3f)))%10000/1000;
//千位
xsbuf[2]=((unsigned
int )(num*(bs&0x3f)))%1000/100+POINT; //百位
xsbuf[3]=((unsigned int )(num*(bs&0x3f)))%100/10; //
十位
}
}
void xssddy()
{
xsbuf[0]=UU; //最高位
xsbuf[1]=XHX; //千位
xsbuf[2]=XHX; //
xsbuf[3]=XHX;
xss(dybs,sddy);
}
void xssddl()
{
xsbuf[0]=AA; //最高位
xsbuf[1]=XHX; //千位
xsbuf[2]=XHX; //
xsbuf[3]=XHX;
xss(dlbs,sddl);
}
void xssdgl()
{
xsbuf[0]=PP; //最高位
xsbuf[1]=XHX; //千位
xsbuf[2]=XHX; //
xsbuf[3]=XHX;
xss(glbs,sdgl);
}
void xssdcs() //显示设定参数 {
if((szkg&0x03)==0) //设定电压
xssddy();
else if((szkg&0x03)==1) //设定电流
xssddl();
else //设定功率
xssdgl();
}
void xscs() small //显示参数 数据更新要调用此函数
{
xss0123(dlbs,scdl);
xss(dybs,scdy);
xszt(); //显示状态 }
void xszjtime() //十进制显示 分钟前有点 时间是倒着保
存的,所以倒着读出
{
xsbuf[0]=sjsz[3]%100/10; //十位
xsbuf[1]=sjsz[3]%10; //个位
xsbuf[2]=sjsz[2]%100/10; //十位
xsbuf[3]=sjsz[2]%10; //个位
xsbuf[4]=sjsz[1]%100/10; //十位
xsbuf[5]=sjsz[1]%10+POINT; //个位
xsbuf[6]=sjsz[0]%100/10; //十位
xsbuf[7]=sjsz[0]%10; //个位 }
void xszjsj() //显示自检接收数据 {
xsbuf[0]=jshc[erjm-4+2]/16; //十位
xsbuf[1]=jshc[erjm-4+2]%16; //个位
xsbuf[2]=jshc[erjm-4+3]/16; //十位
xsbuf[3]=jshc[erjm-4+3]%16; //个位
xsbuf[4]=jshc[erjm-4+4]/16; //十位
xsbuf[5]=jshc[erjm-4+4]%16; //个位
xsbuf[6]=jshc[erjm-4+5]/16; //十位
xsbuf[7]=jshc[erjm-4+5]%16; //个位 }
//-----------------------------显示画面,自检显示
void xszj()
{
if(erjm==0) //4*0 4*1 4*2 4*3 4*4 4*5 4*6 4*7
xszjtime();
else
xszjsj();
}
//-----------------------------显示序号 方便看 void xsxh()
{
unsigned char i;
for(i=0;i<5;i++)
{
xsbuf[1]=OFF; //十位
xsbuf[2]=OFF; //个位
yans(2000);
xsbuf[1]=xuhao%100/10; //十位
xsbuf[2]=xuhao%10; //个位
yans(2000);
}
}