📄 c8051f021.c
字号:
}
for(i=0;i<4;i++) //写入pwnum1
{
*pwrite=pwnum1[i];
pwrite++;
}
PSCTL=0x00;
FLSCL&=0xc0;
EA=1;
}
/*---------------功能一显示子程序------------------------*/
void f1disp(void)
{
f1co++;
if (f1co==10)
{
f1co=0;
npd_ad(0x80,adnum0[0],adnum0[1],adnum0[2]); //显示第一路AD
wr_lcd(comm,0x30);
wr_lcd(comm,0x95);
wr_lcd(dat,0x56); //显示V
npd_ad(0x88,adnum1[0],adnum1[1],adnum1[2]); //显示第二路AD
wr_lcd(comm,0x30);
wr_lcd(comm,0x9d);
wr_lcd(dat,0x56); //显示V
}
}
/*---------------功能二一显示子程序------------------------*/
void f2disp(void)
{
switch (f2count)
{
case 0:
{
chns_disp(tab2);
npd_da(0x88,danum0[0],danum0[1],danum0[2],danum0[3]); //显示第一路AD
break;
}
case 1:
{
chns_disp(tab3);
npd_da(0x88,danum1[0],danum1[1],danum1[2],danum1[3]); //显示第二路AD
break;
}
}
wr_lcd(comm,0x30);
wr_lcd(comm,0x9e);
wr_lcd(dat,0x20);
wr_lcd(dat,0x56); //显示V
}
/*---------------功能三显示子程序------------------------*/
void f3disp(void)
{
switch (f3count)
{
case 0:
{
chns_disp(tab5);
//npd_da(0x80,pwpr0[0],pwpr0[1],pwpr0[2],pwpr0[3]); //显示占空比
npd_da(0x88,pwnum0[0],pwnum0[1],pwnum0[2],pwnum0[3]); //显示第一路PWM
break;
}
case 1:
{
chns_disp(tab6);
//npd_da(0x80,pwpr1[0],pwpr1[1],pwpr1[2],pwpr1[3]); //显示占空比
npd_da(0x88,pwnum1[0],pwnum1[1],pwnum1[2],pwnum1[3]); //显示第二路PWM
break;
}
}
wr_lcd(comm,0x30);
wr_lcd(comm,0x9e);
wr_lcd(dat,0x20);
wr_lcd(dat,0x56); //显示V
}
/*---------------功能四显示子程序------------------------*/
void f4disp(void)
{
chns_disp(tab7);
if (fqnum0[0]==0&&fqnum0[1]==0&&fqnum0[2]==0)
{
npd_fa(0x88,fqnum0[3],fqnum0[4],fqnum0[5]); //XXX
wr_lcd(comm,0x30); //HZ
wr_lcd(comm,0x9d);
wr_lcd(dat,0x48);
wr_lcd(dat,0x5a);
}
else if(fqnum0!=0)
{
npd_fb(0x88,fqnum0[0],fqnum0[1],fqnum0[2],fqnum0[3]); //XXX.X
wr_lcd(comm,0x30); //KHZ
wr_lcd(comm,0x9e);
wr_lcd(dat,0x20);
wr_lcd(dat,0x4b);
wr_lcd(comm,0x9f);
wr_lcd(dat,0x48);
wr_lcd(dat,0x5a);
}
else
{
npd_da(0x88,fqnum0[1],fqnum0[2],fqnum0[3],fqnum0[4]); //XX.XX
wr_lcd(comm,0x30); //KHZ
wr_lcd(comm,0x9e);
wr_lcd(dat,0x20);
wr_lcd(dat,0x4b);
wr_lcd(comm,0x9f);
wr_lcd(dat,0x48);
wr_lcd(dat,0x5a);
}
}
/*---------------图形数字显示子程序1------------------------*/
void npd_ad(uchar lcd_x,uchar num1,uchar num2,uchar num3) //显示三位数字num1,num2,num3,形式为X.XX.
{ //可选择在上下半屏幕显示:
//lcd_x为0x80显示在上半屏幕,为0x88在下半屏幕
uchar lcd_y=0x80;
uchar i=0;
uchar j=0;
uchar code *nump; //数字图形表指针
uchar py=0; //表指针偏移量
for (j=0;j<32;j++) //显示第1,2个汉字的位置
{
wr_zb(lcd_x,lcd_y);
nump=selnt(num1); //显示num1
py=j*3; //修改显示的起始地址,到下一行
for (i=0;i<3;i++)
{
wr_lcd(dat,nump[py+i]);
}
nump=tabd; //显示小数点
py=j;
wr_lcd(dat,nump[py]);
lcd_y++;
}
lcd_x+=0x02;
lcd_y=0x80;
for (j=0;j<32;j++) //显示第3,4个汉字的位置
{
wr_zb(lcd_x,lcd_y);
nump=selnt(num2); //显示num2
py=j*3; //修改显示的起始地址,到下一行
for (i=0;i<3;i++)
{
wr_lcd(dat,nump[py+i]);
}
nump=selnt(num3); //显示num3的第一列
py=j*3;
wr_lcd(dat,nump[py]);
lcd_y++;
}
lcd_x+=0x02;
lcd_y=0x80;
for (j=0;j<32;j++) //显示第5,6个汉字的位置
{
wr_zb(lcd_x,lcd_y);
nump=selnt(num3); //显示num3的剩余两列
py=j*3+1; //修改显示的起始地址,到下一行
for (i=0;i<2;i++)
{
wr_lcd(dat,nump[py+i]);
}
for (i=0;i<2;i++) //空显示两列
{
wr_lcd(dat,0x00);
}
lcd_y++;
}
wr_lcd(comm,0x36);
}
/*---------------图形数字显示子程序2------------------------*/
void npd_da(uchar lcd_x,uchar num1,uchar num2,uchar num3,uchar num4) //显示三位数字num1,num2,num3,num4.形式为XX.XX.
{ //可选择在上下半屏幕显示:
//lcd_x为0x80显示在上半屏幕,为0x88在下半屏幕
uchar lcd_y=0x80;
uchar i=0;
uchar j=0;
uchar code *nump; //数字图形表指针
uchar py=0; //表指针偏移量
for (j=0;j<32;j++) //显示第1,2个汉字的位置
{
wr_zb(lcd_x,lcd_y);
if (num1==0)
{
for (i=0;i<3;i++)
{
wr_lcd(dat,0x00);
}
}
else
{
nump=selnt(num1); //显示num1
py=j*3; //修改显示的起始地址,到下一行
for (i=0;i<3;i++)
{
wr_lcd(dat,nump[py+i]);
}
}
nump=selnt(num2); //显示num2
py=j*3;
wr_lcd(dat,nump[py]);
lcd_y++;
}
lcd_x+=0x02;
lcd_y=0x80;
for (j=0;j<32;j++) //显示第3,4个汉字的位置
{
wr_zb(lcd_x,lcd_y);
nump=selnt(num2); //显示num2
py=j*3+1; //修改显示的起始地址,到下一行
for (i=0;i<2;i++)
{
wr_lcd(dat,nump[py+i]);
}
nump=tabd; //显示小数点
py=j;
wr_lcd(dat,nump[py]);
nump=selnt(num3); //显示num3
py=j*3;
wr_lcd(dat,nump[py]);
lcd_y++;
}
lcd_x+=0x02;
lcd_y=0x80;
for (j=0;j<32;j++) //显示第5,6个汉字的位置
{
wr_zb(lcd_x,lcd_y);
nump=selnt(num3); //显示num3的剩余两列
py=j*3+1; //修改显示的起始地址,到下一行
for (i=0;i<2;i++)
{
wr_lcd(dat,nump[py+i]);
}
nump=selnt(num4); //显示num4
py=j*3;
for (i=0;i<2;i++)
{
wr_lcd(dat,nump[py+i]);
}
lcd_y++;
}
lcd_x+=0x02;
lcd_y=0x80;
for (j=0;j<32;j++) //显示第7,8个汉字的位置
{
wr_zb(lcd_x,lcd_y);
nump=selnt(num4); //显示num4的剩余一列
py=j*3+2; //修改显示的起始地址,到下一行
wr_lcd(dat,nump[py]);
for (i=0;i<3;i++) //空显示三列
{
wr_lcd(dat,0x00);
}
lcd_y++;
}
wr_lcd(comm,0x36);
}
/*---------------图形数字显示子程序3------------------------*/
void npd_fa(uchar lcd_x,uchar num1,uchar num2,uchar num3) //显示三位数字num1,num2,num3.形式为XXX.
{ //可选择在上下半屏幕显示:
//lcd_x为0x80显示在上半屏幕,为0x88在下半屏幕
uchar lcd_y=0x80;
uchar i=0;
uchar j=0;
uchar code *nump; //数字图形表指针
uchar py=0; //表指针偏移量
for (j=0;j<32;j++) //显示第1,2个汉字的位置
{
wr_zb(lcd_x,lcd_y);
if (num1==0)
{
for (i=0;i<3;i++)
{
wr_lcd(dat,0x00);
}
}
else
{
nump=selnt(num1); //显示num1
py=j*3; //修改显示的起始地址,到下一行
for (i=0;i<3;i++)
{
wr_lcd(dat,nump[py+i]);
}
}
if (num2==0)
{
wr_lcd(dat,0x00);
}
else
{
nump=selnt(num2); //显示num2
py=j*3;
wr_lcd(dat,nump[py]);
}
lcd_y++;
}
lcd_x+=0x02;
lcd_y=0x80;
for (j=0;j<32;j++) //显示第3,4个汉字的位置
{
wr_zb(lcd_x,lcd_y);
if (num2==0)
{
for (i=0;i<2;i++)
{
wr_lcd(dat,0x00);
}
}
else
{
nump=selnt(num2); //显示num2
py=j*3+1; //修改显示的起始地址,到下一行
for (i=0;i<2;i++)
{
wr_lcd(dat,nump[py+i]);
}
}
nump=selnt(num3); //显示num3
py=j*3;
for (i=0;i<2;i++)
{
wr_lcd(dat,nump[py+i]);
}
lcd_y++;
}
lcd_x+=0x02;
lcd_y=0x80;
for (j=0;j<32;j++) //显示第5,6个汉字的位置
{
wr_zb(lcd_x,lcd_y);
nump=selnt(num3); //显示num3的剩余一列
py=j*3+2; //修改显示的起始地址,到下一行
wr_lcd(dat,nump[py+i]);
for (i=0;i<3;i++)
{
wr_lcd(dat,0x00);
}
lcd_y++;
}
wr_lcd(comm,0x36);
}
/*---------------图形数字显示子程序4------------------------*/
void npd_fb(uchar lcd_x,uchar num1,uchar num2,uchar num3,uchar num4) //显示三位数字num1,num2,num3,num4.形式为XXX.X
{ //可选择在上下半屏幕显示:
//lcd_x为0x80显示在上半屏幕,为0x88在下半屏幕
uchar lcd_y=0x80;
uchar i=0;
uchar j=0;
uchar code *nump; //数字图形表指针
uchar py=0; //表指针偏移量
for (j=0;j<32;j++) //显示第1,2个汉字的位置
{
wr_zb(lcd_x,lcd_y);
if (num1==0)
{
for (i=0;i<3;i++)
{
wr_lcd(dat,0x00);
}
}
else
{
nump=selnt(num1); //显示num1
py=j*3; //修改显示的起始地址,到下一行
for (i=0;i<3;i++)
{
wr_lcd(dat,nump[py+i]);
}
}
if (num2==0)
{
wr_lcd(dat,0x00);
}
else
{
nump=selnt(num2); //显示num2
py=j*3;
wr_lcd(dat,nump[py]);
}
lcd_y++;
}
lcd_x+=0x02;
lcd_y=0x80;
for (j=0;j<32;j++) //显示第3,4个汉字的位置
{
wr_zb(lcd_x,lcd_y);
if (num2==0)
{
for (i=0;i<2;i++)
{
wr_lcd(dat,0x00);
}
}
else
{
nump=selnt(num2); //显示num2
py=j*3+1; //修改显示的起始地址,到下一行
for (i=0;i<2;i++)
{
wr_lcd(dat,nump[py+i]);
}
}
nump=selnt(num3); //显示num3
py=j*3;
for (i=0;i<2;i++)
{
wr_lcd(dat,nump[py+i]);
}
lcd_y++;
}
lcd_x+=0x02;
lcd_y=0x80;
for (j=0;j<32;j++) //显示第5,6个汉字的位置
{
wr_zb(lcd_x,lcd_y);
nump=selnt(num3); //显示num3的剩余一列
py=j*3+2; //修改显示的起始地址,到下一行
wr_lcd(dat,nump[py+i]);
nump=tabd; //显示小数点
py=j;
wr_lcd(dat,nump[py]);
nump=selnt(num4); //显示num4
py=j*3;
for (i=0;i<2;i++)
{
wr_lcd(dat,nump[py+i]);
}
lcd_y++;
}
lcd_x+=0x02;
lcd_y=0x80;
for (j=0;j<32;j++) //显示第7,8个汉字的位置
{
wr_zb(lcd_x,lcd_y);
nump=selnt(num4); //显示num4的剩余一列
py=j*3+2; //修改显示的起始地址,到下一行
wr_lcd(dat,nump[py]);
for (i=0;i<3;i++) //空显示三列
{
wr_lcd(dat,0x00);
}
lcd_y++;
}
wr_lcd(comm,0x36);
}
uchar code * selnt(uchar i) //选择数字(无小数点)码的表地址
{ //数字放在i中
switch (i)
{
case 0: return tabn0;break;
case 1: return tabn1;break;
case 2: return tabn2;break;
case 3: return tabn3;break;
case 4: return tabn4;break;
case 5: return tabn5;break;
case 6: return tabn6;break;
case 7: return tabn7;break;
case 8: return tabn8;break;
case 9: return tabn9;break;
}
}
/*------------------运算子程序--------------------*/
void bcda4(uchar *a,uchar b0,uchar b1,uchar b2,uchar b3)
{ //BCD码加法子程序,*a0_*a3+b0_b3,结果放在*a1_*a3中
a[3]+=b3;
if (a[3]>=10)
{
a[3]-=10;
a[2]+=1;
}
a[2]+=b2;
if (a[2]>=10)
{
a[2]-=10;
a[1]+=1;
}
a[1]+=b1;
if (a[1]>=10)
{
a[1]-=10;
a[0]+=1;
}
a[0]+=b0;
if (a[0]>=10)
{
a[0]-=10;
}
}
void bcds4(uchar *a,uchar b0,uchar b1,uchar b2,uchar b3)
{ //BCD码减法子程序,*a0_*a3-b0_b3,结果放在*a1_*a3中
if (a[3]<b3)
{
a[2]-=1;
if (a[2]==255)
{
a[2]=9;
a[1]-=1;
if (a[1]==255)
{
a[1]=9;
a[0]-=1;
if (a[0]==255)
{
a[0]=9;
}
}
}
a[3]+=10;
}
a[3]-=b3;
if (a[2]<b2)
{
a[1]-=1;
if (a[1]==255)
{
a[1]=9;
a[0]-=1;
if (a[0]==255)
{
a[0]=9;
}
}
a[2]+=10;
}
a[2]-=b2;
if (a[1]<b1)
{
a[0]-=1;
if (a[0]==255)
{
a[0]=9;
}
a[1]+=10;
}
a[1]-=b1;
if (a[0]<b0)
{
a[3]+=10;
}
a[0]-=b0;
}
uint bcdhb(uchar *a,uchar n) //将a数组存放在BCD码合并到res指向的uint型的数中,a数组的元素个数为n
{
uchar i=0;
uint res=0;
for (;i<n;i++)
{
res*=10;
res+=a[i];
}
return res;
}
/*------------------主程序--------------------*/
void main ()
{
SP=0x7f;
PSW=0x00;
config();
init_lcd();
init_disp();
pwnum0[0]=0;
pwnum0[1]=0;
pwnum0[2]=0;
pwnum0[3]=0;
pwnum1[0]=0;
pwnum1[1]=0;
pwnum1[2]=0;
pwnum1[3]=0;
flashre();
while (1)
{
keyans();
adfun();
dafun();
pwm0fun();
pwm1fun();
if (fun1==1)
{
f1disp();
}
if (fun2==1)
{
f2disp();
}
if (fun3==1)
{
f3disp();
}
if (fun4==1)
{
f4disp();
}
//delay1 (8000);
}
}
void tt0(void) interrupt 1 using 1
{
TR0=0;
ET0=0;
kscan();
TL0=0xea;
TH0=0xcb;
TR0=1;
ET0=1;
}
void pca(void) interrupt 9
{
CF=0;
if (pwnum0[0]==0&&pwnum0[1]==0&&pwnum0[2]==0&&pwnum0[3]==0)
{
PCA0CPM0&=0xbf; //将ECOM0清1
}
else
{
PCA0CPM0|=0x40; //将ECOM0置1
PCA0CPL0=pwcp0l;
PCA0CPH0=pwcp0h;
}
if (pwnum1[0]==0&&pwnum1[1]==0&&pwnum1[2]==0&&pwnum1[3]==0)
{
PCA0CPM1&=0xbf; //将ECOM1置1
}
else
{
PCA0CPM1|=0x40; //将ECOM0置1
PCA0CPL1=pwcp1l;
PCA0CPH1=pwcp1h;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -