⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.c

📁 使用Atmega8单片机开发的一个激光治疗仪的人机接口程序
💻 C
字号:
//显示模块
#include "main.h"
#include "config.h"
#include "display.h"

const prog_char  NumData[10][4]={   //0~9  10个数字
{ 0x18,0x08,0x18,0x08 },//0L
{ 0x00,0x08,0x08,0x00 },//1L
{ 0x08,0x18,0x10,0x08 },//2L
{ 0x08,0x18,0x08,0x08 },//3L
{ 0x10,0x18,0x08,0x00 },//4L
{ 0x18,0x10,0x08,0x08 },//5L
{ 0x18,0x10,0x18,0x08 },//6L
{ 0x08,0x08,0x08,0x00 },//7L
{ 0x18,0x18,0x18,0x08 },//8L
{ 0x18,0x18,0x08,0x08 },//9L
 };  
  
const prog_char  OutStateData[5][4]={   //激光功率状态
{ 0x00,0x00,0x00,0x00 },//0
{ 0x80,0x00,0x00,0x00 },//1
{ 0x80,0x80,0x00,0x00 },//2
{ 0x80,0x80,0x80,0x00 },//3
{ 0x80,0x80,0x80,0x80 },//4
 }; 
 
const prog_char  TherapyDymData[4][4]={   //治疗中...动画显示
{ 0x04,0x00,0x00,0x00 },//治疗中
{ 0x04,0x04,0x00,0x00 },//治疗中.
{ 0x04,0x04,0x04,0x00 },//治疗中..
{ 0x04,0x04,0x04,0x04 },//治疗中...
 }; 
const prog_char  BatteryCapData[5][4]={   //“电量状态”
{ 0x00,0x00,0x00,0x00 },//0
{ 0x00,0x00,0x00,0x01 },//1
{ 0x01,0x00,0x00,0x01 },//2
{ 0x01,0x01,0x00,0x01 },//3
{ 0x01,0x01,0x01,0x01 },//4
 };
const prog_char  ChargeStayData[4] ={ 0x02,0x00,0x00,0x00 };//显示“充电中”
const prog_char  BottomData[4]={ 0x00,0x02,0x02,0x00 }; //显示“纳普源“,“电池壳”
const prog_char  OutAdjustData[4]={ 0x00,0x00,0x00,0x40 };//显示文字“功率调整”

/*************
const uchar *maph= &NumData[0][0],
*mapl= &NumData[0][0],
*mapcha= &ChargeStayData[0],
*mapbot= &BottomData[0],
*mapbat= &BatteryCapData[0][0],
*mapout= &OutStateData[0][0],
*mapthe= &TherapyDymData[0][0],
*mapouta= &OutAdjustData[0];
********/
void Show_State(void)
{
// (x|=(1<<y))   //将x中的y位置1 
// (x&=~(1<<y))   //将x中的y位清0 
//(x^=(1<<y))   //将x中的y位取反 
	static char Bit=1;
			switch (Bit)
		{
		case 1:
				PORTC|=(1<<0);
				DDRC|=(1<<0);
				DDRC&=~(1<<3);
				PORTD=~Seg[0];
			break;
			
			case 2:
				PORTC&=~(1<<0);
				PORTD=Seg[0];
			break;	
			
			case 3:
				PORTC|=(1<<1);
				DDRC|=(1<<1);
				DDRC&=~(1<<0);
				PORTD=~Seg[1];
			break;
			
			case 4:
				PORTC&=~(1<<1);
				PORTD=Seg[1];
			break;
			
			case 5:
				PORTC|=(1<<2);
				DDRC|=(1<<2);
				DDRC&=~(1<<1);
				PORTD=~Seg[2];
			break;
			
			case 6:
				PORTC&=~(1<<2);
				PORTD=Seg[2];
			break;
			
			case 7:
				PORTC|=(1<<3);
				DDRC|=(1<<3);
				DDRC&=~(1<<2);
				PORTD=~Seg[3];
			break;
			
			case 8:
				PORTC&=~(1<<3);
				PORTD=Seg[3];
			break;		
			default:
			break;
		}

	if(++Bit>8)
	{
		Bit=1;
	}
	
}




void Time_Display(uchar TimeDelay)   //用于显示当前系统时间,2位,单位:分钟
{
	//uchar mh,ml;
	uchar i;
	const unsigned char *maph= &NumData[0][0],*mapl= &NumData[0][0];
	//mh=Time_minu/10;
	//ml=Time_minu%10;

	maph+=mh*4;
	mapl+=ml*4;
	for(i=0;i<4;i++)
	{Seg[i]=(pgm_read_byte(maph++)<<2)+pgm_read_byte(mapl++);}
	DelayMs(TimeDelay);
}


void Time_Display_Test(void)   //作测试 用于显示当前系统时间,2位,单位:分钟
{
	uchar mh,ml;
	//mh=Time_minu/10;
	//ml=Time_minu%10;
	mh=Time_sec/10;
	ml=Time_sec%10;

	switch(ml)
	{
	case 0x00:       //显示个位“0”
   	Seg[0]=0x18;
	Seg[1]=0x08;
	Seg[2]=0x18;
	Seg[3]=0x08;
	break;
	
	case 0x01:       //显示个位“1”
   	Seg[0]=0x00;
	Seg[1]=0x08;
	Seg[2]=0x08;
	Seg[3]=0x00;
	break;	
	
	case 0x02:       //显示个位“2”	
   	Seg[0]=0x08;
	Seg[1]=0x18;
	Seg[2]=0x10;
	Seg[3]=0x08;
	break;	
	
	case 0x03:       //显示个位“3”
   	Seg[0]=0x08;
	Seg[1]=0x18;
	Seg[2]=0x08;
	Seg[3]=0x08;
	break;		
	
	case 0x04:       //显示个位“4”	
   	Seg[0]=0x10;
	Seg[1]=0x18;
	Seg[2]=0x08;
	Seg[3]=0x00;
	break;			

	case 0x05:       //显示个位“5”	
   	Seg[0]=0x18;
	Seg[1]=0x10;
	Seg[2]=0x08;
	Seg[3]=0x08;
	break;			

	case 0x06:       //显示个位“6”
   	Seg[0]=0x18;
	Seg[1]=0x10;
	Seg[2]=0x18;
	Seg[3]=0x08;
	break;	

	case 0x07:       //显示个位“7”
   	Seg[0]=0x08;
	Seg[1]=0x08;
	Seg[2]=0x08;
	Seg[3]=0x00;
	break;	

	case 0x08:       //显示个位“8”
   	Seg[0]=0x18;
	Seg[1]=0x18;
	Seg[2]=0x18;
	Seg[3]=0x08;
	break;	

	case 0x09:       //显示个位“9”
   	Seg[0]=0x18;
	Seg[1]=0x18;
	Seg[2]=0x08;
	Seg[3]=0x08;
	break;	
	default:
	break;
	}
DelayMs(10);
	switch(mh)
	{
		case 0x00:       //显示个位“0”
   	Seg[0]=0x18<<2;
	Seg[1]=0x08<<2;
	Seg[2]=0x18<<2;
	Seg[3]=0x08<<2;
	break;
	
	case 0x01:       //显示个位“1”
   	Seg[0]=0x00<<2;
	Seg[1]=0x08<<2;
	Seg[2]=0x08<<2;
	Seg[3]=0x00<<2;
	break;	
	
	case 0x02:       //显示个位“2”	
   	Seg[0]=0x08<<2;
	Seg[1]=0x18<<2;
	Seg[2]=0x10<<2;
	Seg[3]=0x08<<2;
	break;	
	
	case 0x03:       //显示个位“3”
   	Seg[0]=0x08<<2;
	Seg[1]=0x18<<2;
	Seg[2]=0x08<<2;
	Seg[3]=0x08<<2;
	break;		
	
	case 0x04:       //显示个位“4”	
   	Seg[0]=0x10<<2;
	Seg[1]=0x18<<2;
	Seg[2]=0x08<<2;
	Seg[3]=0x00<<2;
	break;			

	case 0x05:       //显示个位“5”	
   	Seg[0]=0x18<<2;
	Seg[1]=0x10<<2;
	Seg[2]=0x08<<2;
	Seg[3]=0x08<<2;
	break;			

	case 0x06:       //显示个位“6”
   	Seg[0]=0x18<<2;
	Seg[1]=0x10<<2;
	Seg[2]=0x18<<2;
	Seg[3]=0x08<<2;
	break;	

	case 0x07:       //显示个位“7”
   	Seg[0]=0x08<<2;
	Seg[1]=0x08<<2;
	Seg[2]=0x08<<2;
	Seg[3]=0x00<<2;
	break;	

	case 0x08:       //显示个位“8”
   	Seg[0]=0x18<<2;
	Seg[1]=0x18<<2;
	Seg[2]=0x18<<2;
	Seg[3]=0x08<<2;
	break;	

	case 0x09:       //显示个位“9”
   	Seg[0]=0x18<<2;
	Seg[1]=0x18<<2;
	Seg[2]=0x08<<2;
	Seg[3]=0x08<<2;
	break;	
	default:
	break;
	}
DelayMs(10);
}

void POWERState_Display(uchar TimeDelay)
{
//AllState=0x04;
uchar i;
const unsigned char *mapbot= &BottomData[0],*mapbat= &BatteryCapData[0][0];

switch(AllState&0b00000111)
{
case 0x00:       //显示“纳普源“、“电池壳”、“电量状态(0格)”、“电量不足”	

	for(i=0;i<4;i++)
	{
	Seg[i]=pgm_read_byte(mapbat+i)+pgm_read_byte(mapbot+i);
	if(i==3)Seg[i]+=0x02;
	}
	break;

case 0x01:	 //显示“纳普源“、“电池壳”、“电量状态(1格)”

	for(i=0;i<4;i++)
	{
	Seg[i]=pgm_read_byte(mapbat+4+i)+pgm_read_byte(mapbot+i);
	}
	break;

case 0x02:	 //显示“纳普源“、“电池壳”、“电量状态(2格)”

	for(i=0;i<4;i++)
	{
	Seg[i]=pgm_read_byte(mapbat+8+i)+pgm_read_byte(mapbot+i);
	}
	break;

case 0x03:	 //显示“纳普源“、“电池壳”、“电量状态(3格)”

	for(i=0;i<4;i++)
	{
	Seg[i]=pgm_read_byte(mapbat+12+i)+pgm_read_byte(mapbot+i);
	}
	break;

case 0x04:	 //显示“纳普源“、“电池壳”、“电量状态(4格)”

	for(i=0;i<4;i++)
	{
	Seg[i]=pgm_read_byte(mapbat+16+i)+pgm_read_byte(mapbot+i);
	}
	break;
	}
DelayMs(TimeDelay);
}

//工作状态显示函数
void WORKState_Display(uchar TimeDelay,uchar n,uchar m)	//TimeDelay-显示延时;n-功率状态;m-电池容量状态
{
uchar i,mh,ml,SegTemp[4];
const unsigned char *mapout= &OutStateData[0][0],*mapthe= &TherapyDymData[0][0],*mapbat= &BatteryCapData[0][0],*mapbot= &BottomData[0],*mapouta= &OutAdjustData[0];
const unsigned char *maph= &NumData[0][0],*mapl= &NumData[0][0];

times++;
	mh=Time_minu/10;//mh=Time_sec/10;
	ml=Time_minu%10;//ml=Time_sec%10;
	maph+=mh*4;
	mapl+=ml*4;

for(i=0;i<4;i++)
{
SegTemp[i]=pgm_read_byte(mapout+n*4+i)+pgm_read_byte(mapbat+m*4+i)+pgm_read_byte(mapbot+i)+(pgm_read_byte(maph+i)<<2)+pgm_read_byte(mapl+i)+pgm_read_byte(mapouta+i);//应老板要求加mapouta的功率调整显示
if((m==0)&&(i==3))SegTemp[i]+=0x02;
}

//if(m==0)SegTemp[i]+=0x02;
	if(times<25)//显示“治疗中”,功率状态,容量状态
		{
	for(i=0;i<4;i++)
		Seg[i]=SegTemp[i]+pgm_read_byte(mapthe+i);
		}
		else if(times>=25&&times<50)
			{
		for(i=0;i<4;i++)
		Seg[i]=SegTemp[i]+pgm_read_byte(mapthe+4+i);
			}
			else if(times>=50&&times<75)
				{
			for(i=0;i<4;i++)
		Seg[i]=SegTemp[i]+pgm_read_byte(mapthe+8+i);
				}
				else if(times>=75&&times<100)
					{
				for(i=0;i<4;i++)
		Seg[i]=SegTemp[i]+pgm_read_byte(mapthe+12+i);
					}
			else times=0;
	
DelayMs(TimeDelay);
}
//工作状态/功率调整显示函数

void ADJUSTState_Display(uchar TimeDelay,uchar n,uchar m)//TimeDelay-显示延时;n-功率状态;m-电池容量状态
{
uchar i;
const unsigned char *mapout= &OutStateData[0][0],*mapbat= &BatteryCapData[0][0],*mapbot= &BottomData[0],*mapouta= &OutAdjustData[0];
	times++;
	for(i=0;i<4;i++)
	{
	Seg[i]=pgm_read_byte(mapout+n*4+i)+pgm_read_byte(mapbat+m*4+i)+pgm_read_byte(mapbot+i)+pgm_read_byte(mapouta+i);
	if((m==0)&&(i==3))Seg[i]+=0x02;
	}
	DelayMs(TimeDelay);
}


void ChargePOWERState_Display(uchar TimeDelay)	//TimeDelay-显示延时;n-功率状态;m-电池容量状态 //用于显示当前系统是否处于“充电中...”,如果为充电中状态时,循环显示电量状态
{		//POWER/RA5键-PB6//待机过程中充电
	uchar i,mh,ml,SegTemp[4];
const uchar *maph= &NumData[0][0],
*mapl= &NumData[0][0],
*mapcha= &ChargeStayData[0],
*mapbot= &BottomData[0],
*mapbat= &BatteryCapData[0][0],
*mapout= &OutStateData[0][0],
*mapthe= &TherapyDymData[0][0],
*mapouta= &OutAdjustData[0];

ChargeTimes++;	
mh=Time_sec/10;
ml=Time_sec%10;
maph+=mh*4;
mapl+=ml*4;	
for(i=0;i<4;i++)
{
SegTemp[i]=pgm_read_byte(mapcha+i)+pgm_read_byte(mapbot+i);
}
	if(ChargeTimes<25)		//显示“纳普源“、“电池壳”、“电量状态(0格)”、“充电中...”
	{
	for(i=0;i<4;i++)
	{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+i);}
	}
	else if(ChargeTimes>=25&&ChargeTimes<50)		//显示“纳普源“、“电池壳”、“电量状态(1格)”、“充电中...”
		{
		for(i=0;i<4;i++)
		{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+4+i);}
		}
		else if(ChargeTimes>=50&&ChargeTimes<75)			////显示“纳普源“、“电池壳”、“电量状态(2格)”、“充电中...”
			{
			for(i=0;i<4;i++)  
			{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+8+i);}
			}
			else if(ChargeTimes>=75&&ChargeTimes<100)				//显示“纳普源“、“电池壳”、“电量状态(3格)”、“充电中...”
				{
				for(i=0;i<4;i++)
				{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+12+i);}
				}
				else if(ChargeTimes>=100&&ChargeTimes<125)		//显示“纳普源“、“电池壳”、“电量状态(4格)”、“充电中...”
						{		
						for(i=0;i<4;i++) 
						{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+16+i);}		
						}
						else 	ChargeTimes=0;
DelayMs(TimeDelay);
}

void ChargeWORKState_Display(uchar TimeDelay,uchar n,uchar m)	//TimeDelay-显示延时;n-功率状态;m-电池容量状态
{			//WORK键-PC4//工作过程中充电
	uchar i,mh,ml,SegTemp[4];
const uchar *maph= &NumData[0][0],
*mapl= &NumData[0][0],
*mapcha= &ChargeStayData[0],
*mapbot= &BottomData[0],
*mapbat= &BatteryCapData[0][0],
*mapout= &OutStateData[0][0],
*mapthe= &TherapyDymData[0][0],
*mapouta= &OutAdjustData[0];

	ChargeTimes++;	
	mh=Time_minu/10;//mh=Time_sec/10;
	ml=Time_minu%10;//ml=Time_sec%10;
	maph+=mh*4;
	mapl+=ml*4;	
	for(i=0;i<4;i++)
{
SegTemp[i]=pgm_read_byte(mapout+n*4+i)+pgm_read_byte(mapbot+i)+(pgm_read_byte(maph+i)<<2)+pgm_read_byte(mapl+i)+pgm_read_byte(mapcha+i)+pgm_read_byte(mapouta+i);
}
if(ChargeTimes<25)		//显示“电量状态(0格)”、“充电中...”、“治疗中”
{
for(i=0;i<4;i++)
{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+i)+pgm_read_byte(mapthe+i);}
}
else if(ChargeTimes>=25&&ChargeTimes<50)		//显示“电量状态(1格)”、“充电中...”、“治疗中.”
	{
	for(i=0;i<4;i++)
	{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+4+i)+pgm_read_byte(mapthe+4+i);}
	}
	else if(ChargeTimes>=50&&ChargeTimes<75)			//显示“电量状态(2格)”、“充电中...”、“治疗中..”
		{
		for(i=0;i<4;i++)  
		{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+8+i)+pgm_read_byte(mapthe+8+i);}
		}
		else if(ChargeTimes>=75&&ChargeTimes<100)				//显示“电量状态(3格)”、“充电中...”、“治疗中...”
			{
			for(i=0;i<4;i++)
			{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+12+i)+pgm_read_byte(mapthe+12+i);}
			}
			else if(ChargeTimes>=100&&ChargeTimes<125) 	//显示“纳普源“、“电池壳”、“电量状态(4格)”、“充电中...”
					{		
					for(i=0;i<4;i++) 
					{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+16+i)+pgm_read_byte(mapthe+i);}		//显示“电量状态(4格)”、“充电中...”、“治疗中...”
					}
				else ChargeTimes=0;
DelayMs(TimeDelay);
}

void ChargeADJUSTState_Display(uchar TimeDelay,uchar n,uchar m)//TimeDelay-显示延时;n-功率状态;m-电池容量状态
{		//ADJUST_P键-PC5//调整过程中充电
	uchar i,mh,ml,SegTemp[4];
const uchar *maph= &NumData[0][0],
*mapl= &NumData[0][0],
*mapcha= &ChargeStayData[0],
*mapbot= &BottomData[0],
*mapbat= &BatteryCapData[0][0],
*mapout= &OutStateData[0][0],
*mapthe= &TherapyDymData[0][0],
*mapouta= &OutAdjustData[0];

	ChargeTimes++;	
	mh=Time_sec/10;
	ml=Time_sec%10;
	maph+=mh*4;
	mapl+=ml*4;	
		for(i=0;i<4;i++)
			{
		SegTemp[i]=pgm_read_byte(mapout+n*4+i)+pgm_read_byte(mapbot+i)+pgm_read_byte(mapouta+i)+pgm_read_byte(mapcha+i);
			}
		if(ChargeTimes<25)		//显示“电量状态(0格)”、“充电中...”、“当前功率状态”、功率调整
			{
			for(i=0;i<4;i++)
			{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+i);}
			}
			else if(ChargeTimes>=25&&ChargeTimes<50)		//显示“电量状态(1格)”、“充电中...”、“当前功率状态”、功率调整
				{
				for(i=0;i<4;i++)
				{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+4+i);}
				}
				else if(ChargeTimes>=50&&ChargeTimes<75)			//显示“电量状态(2格)”、“充电中...”、“当前功率状态”、功率调整
					{
					for(i=0;i<4;i++)  
					{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+8+i);}
					}
					else if(ChargeTimes>=75&&ChargeTimes<100)				//显示“电量状态(3格)”、“充电中...”、“当前功率状态”、功率调整
						{
						for(i=0;i<4;i++)
						{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+12+i);}
						}
						else if(ChargeTimes>=100&&ChargeTimes<125)	//显示“电量状态(4格)”、“充电中...”、“当前功率状态”、功率调整
								{		
								for(i=0;i<4;i++) 
								{Seg[i]=SegTemp[i]+pgm_read_byte(mapbat+16+i);}		
								}
							else ChargeTimes=0;
			DelayMs(TimeDelay);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -