#include<c8051F410.h>
#include <intrins.h>
#define NOP() _nop_() /* 定义空指令 */
typedef unsigned char uchar;
typedef unsigned int uint;
sbit seg_clk=P0^6;
sbit seg_dat=P0^7;
uchar code seg_data_disp[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管段码表0~9
uchar code seg_interface_disp[] = {0x78,0x5c,0x54,0x71,0x39,0x1c,0x50,0x77,0x38,0x76,0x3e,0x6d,0x40,0x73,0x5e,0x00}; //把除换成加,可以扩展人机界面
//-0:t--1:o--2:n--3:F--4:C--5:u--6:r--7:A--8:L--9:H--10:V-11:S-12:--13:P-14:d-15:
uint voltage=0; //电压
uint current=0; //电流
bit V_show_flag=1; //为0时不显示,为1时显示
bit A_show_flag=1;
bit V_data_flag=1; //为1时显示数据,为0时显示界面
bit A_data_flag=1; //为1时显示数据,为0时显示设置参数
//声明外部变量
extern uint idata r_and_d[7];
//段选
void F164SendDat(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
if(0x80 & (dat<<i))
seg_dat=1;
else
seg_dat=0;
seg_clk=0;
NOP();
NOP();
NOP();
NOP();
seg_clk=1;
}
}
//位选
void weixuan(uchar wei)
{
P1&=0x1f;
P1|=wei<<5;
}
//------通用显示------
void all_display(void)
{
static uchar chose=0;
switch(chose)
{
//---------前四位-----------
case 0:
if(V_show_flag)
{
if(V_data_flag) //显示数据
{
if(r_and_d[3]==3)
F164SendDat(seg_data_disp[voltage/1000%10]|0x80); //送字型
else
{
if(voltage<1000)
F164SendDat(0x00);
else
F164SendDat(seg_data_disp[voltage/1000%10]); //送字型
}
}
else //显示界面
{
F164SendDat(seg_interface_disp[voltage/4096]);
}
}
else
F164SendDat(0x00);
weixuan(0);
chose=1;
break;
case 1:
if(V_show_flag)
{
if(V_data_flag) //显示数据
{
if(r_and_d[3]==2)
F164SendDat(seg_data_disp[voltage/100%10]|0x80); //送字型
else
{
if(voltage<100 && r_and_d[3]<2)
F164SendDat(0x00); //关显示
else
F164SendDat(seg_data_disp[voltage/100%10]); //送字型
}
}
else //显示界面
{
F164SendDat(seg_interface_disp[voltage/256%16]);
}
}
else
F164SendDat(0x00);
weixuan(4);
chose=2;
break;
case 2:
if(V_show_flag)
{
if(V_data_flag) //显示数据
{
if(r_and_d[3]==1)
F164SendDat(seg_data_disp[voltage/10%10]|0x80); //送字型
else
{
if(voltage<10 && r_and_d[3]<1)
F164SendDat(0x00);
else
F164SendDat(seg_data_disp[voltage/10%10]); //送字型
}
}
else //显示界面
{
F164SendDat(seg_interface_disp[voltage/16%16]);
}
}
else
F164SendDat(0x00);
weixuan(2);
chose=3;
break;
case 3:
if(V_show_flag)
{
if(V_data_flag) //显示数据
{
F164SendDat(seg_data_disp[voltage%10]); //送字型
}
else //显示界面
{
F164SendDat(seg_interface_disp[voltage%16]);
}
}
else
F164SendDat(0x00);
weixuan(6);
chose=4;
break;
//------------后四位---------------
case 4:
if(A_show_flag)
{
if(A_data_flag) //显示数据
{
if(r_and_d[1]==3)
F164SendDat(seg_data_disp[current/1000%10]|0x80); //送字型
else
{
if(current<1000)
F164SendDat(0x00);
else
F164SendDat(seg_data_disp[current/1000%10]); //送字型
}
}
else //显示设置参数
{
if(current<1000)
F164SendDat(0x00);
else
F164SendDat(seg_data_disp[current/1000%10]); //送字型
}
}
else
F164SendDat(0x00);
weixuan(1);
chose=5;
break;
case 5:
if(A_show_flag)
{
if(A_data_flag) //显示数据
{
if(r_and_d[1]==2)
F164SendDat(seg_data_disp[current/100%10]|0x80); //送字型
else
{
if(current<100 && r_and_d[1]<2)
F164SendDat(0x00);
else
F164SendDat(seg_data_disp[current/100%10]|0x00); //送字型
}
}
else //显示界面
{
if(current<100)
F164SendDat(0x00);
else
F164SendDat(seg_data_disp[current/100%10]|0x00); //送字型
}
}
else
F164SendDat(0x00);
weixuan(5);
chose=6;
break;
case 6:
if(A_show_flag)
{
if(A_data_flag) //显示数据
{
if(r_and_d[1]==1)
F164SendDat(seg_data_disp[current/10%10]|0x80); //送字型
else
{
if(current<10 && r_and_d[1]<1)
F164SendDat(0x00);
else
F164SendDat(seg_data_disp[current/10%10]); //送字型
}
}
else //显示界面
{
if(current<10)
F164SendDat(0x00);
else
F164SendDat(seg_data_disp[current/10%10]); //送字型
}
}
else
F164SendDat(0x00);
weixuan(3);
chose=7;
break;
case 7:
if(A_show_flag)
{
F164SendDat(seg_data_disp[current%10]); //一家亲
}
else
F164SendDat(0x00);
weixuan(7);
chose=0;
break;
default:chose=0;
break;
}
}
为了方便讨论,把程序贴出来了,void all_display(void)是放在定时器里的,大概是2ms中断一次 |