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

📄 display.c

📁 用ATmega88的一款温湿度仪的原程序
💻 C
字号:
#include <avr/io.h>
#include <util/delay.h>
#include "ht1621.h" 
#include <avr/eeprom.h>

#define FH			10

#define MAX 		128
#define MAX_L		130   //长按键!
#define MIN 		32
#define MIN_L 		34
#define FRESH 		64
#define FRESH_L     66         
#define CF	        1
#define CF_L        3
unsigned      adj_sign;
int			  tempr_adj;
signed char   hum_adj;
int 		  tempr_max;
int           tempr_min;
unsigned char hum_max;
unsigned char hum_min;
int 		  tempr;
unsigned char hum;
unsigned char sign;
//const unsigned char number1[10]={0xFA,0x60,0xBC,0xF4,0x66,0xD6,0xDE,0x70,0xFE,0xF6};
//const unsigned char number2[10]={0xBE,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE};
const unsigned char number[20]={0xFA,0x60,0xBC,0xF4,0x66,0xD6,0xDE,0x70,0xFE,0xF6,
								 0xBE,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE};
/*void display_number(unsigned char addr,unsigned char data)
{   
    unsigned char comdata=0;
    addr--;
	addr*=2;
	addr+=7;
	if(addr>10)
	{
	    switch(addr)
		{
			case 11: comdata=(number2[data])|((sign>>2)&0x01);
					break;
			case 13: comdata=(number2[data])|((sign>>1)&0x01);
			        break;
			case 15: comdata=(number2[data])|(sign&0x01);
			        break;
		}
    	Write_1621(addr,comdata);//写低4位
		Write_1621(addr+1,comdata>>4);//写高四位
	}
    else
	{
		switch(addr)
		{
			case 7: comdata=(number1[data])|((sign>>4)&0x01);
			        break;
			case 9: comdata=(number1[data])|((sign>>3)&0x01);
			        break;
		}
		Write_1621(addr,comdata);//写低4位
		Write_1621(addr+1,comdata>>4);//写高四位
	}

}
*/
/**/
void display_number(unsigned char addr,unsigned char data)
{   
    unsigned char comdata=0;
	comdata=(number[data+(addr>2?10:0)])|((sign>>(5-addr))&0x01);
	Write_1621(addr*2+5,comdata);//写低4位
	Write_1621(addr*2+6,comdata>>4);//写高四位
}

void display_H(unsigned char data,unsigned char xsign)
{
	unsigned char comdata;
	if(xsign)
	data+=hum_adj;
	comdata=data/10;
	display_number(1,comdata);
	comdata=data%10;
	display_number(2,comdata);
}
void display_T(int data,unsigned char xsign)  //因为小数点是固定亮的,最低温度只能显示-9.9
{
	unsigned char comdata;
	if(xsign)
	data+=tempr_adj;
	if(sign&0x02)
	data+=FH;
	if(data>0)	comdata=data/100;
	else	   { comdata=0x40;//显示负号
				data=-data;
				}
	display_number(5,comdata);
	comdata=data%100;
	comdata/=10;
	display_number(4,comdata);
	comdata=data%10;
	display_number(3,comdata);
}
/*
void shine_max(unsigned char shine,unsigned char time)
{
	if((sign&0x08)==0)
	return;
	if(shine==time)
	{
		sign|=0x08;
	 	display_T(tempr_max,0);
	 	display_H(hum_max,0);
	}
	else if(shine==70)
	{
		sign&=~0x08;
		display_T(tempr_max,0);
		display_H(hum_max,0);
    }
	sign|=0x08;
}
void shine_min(unsigned char shine,unsigned char time)
{
	if((sign&0x10)==0)
	return;
	if(shine==time)
	{
		sign|=0x10;
	 	display_T(tempr_min,0);
	 	display_H(hum_min,0);
	}
	else if(shine==70)
	{
		sign&=~0x10;
		display_T(tempr_min,0);
		display_H(hum_min,0);
    }
	sign|=0x10;
}
*/
void key_deal(unsigned char key)
{
	switch(key)
	{
		case MAX_L:
		case MAX:
		        if(adj_sign)
				{
					if(adj_sign==1)
					{
					if(tempr+tempr_adj>998)
						break;
					tempr_adj++;
					eeprom_write_word((unsigned int*)6,tempr_adj);
					display_T(tempr,1);
					}
					if(adj_sign==2)
					{
					if(hum+hum_adj>98)
						break;
						hum_adj++;
						eeprom_write_byte((unsigned char*)8,(unsigned char)hum_adj);
		
					    display_H(hum,1);
					}
					break;
				}
				if(sign&0x08)
				{
					sign&=~0x08;
					display_T(tempr,1);
				    display_H(hum,1);
				}
				else
				{
					sign|=0x08;
					sign&=~0x10;
					display_T(tempr_max,0);
				    display_H(hum_max,0);
				}
				break;
       	case MIN_L:
		case MIN:
				if(adj_sign)
				{
					if(adj_sign==1)
					{
						 if(tempr+tempr_adj<1)
						break;
						tempr_adj--;
						eeprom_write_word((unsigned int*)6,tempr_adj);
						display_T(tempr,1);
					}
					if(adj_sign==2)
					{
						if(hum+hum_adj<1)
						break;
						hum_adj--;
						eeprom_write_byte((unsigned char*)8,(unsigned char)hum_adj);
						display_H(hum,1);
					}
					break;
				}
				if(sign&0x10)
				{
					sign&=~0x10;
					display_T(tempr,1);
				    display_H(hum,1);
				}
				else
				{
					sign|=0x10;
					sign&=~0x08;
					display_T(tempr_min,0);
				    display_H(hum_min,0);
				}
				break;
       case  FRESH:
	            if(adj_sign)
				{
					adj_sign=(adj_sign+1)%3;
					break;
				}
	            if((sign&0x18)==0)
				break;
				if(sign&0x08)
				{
					tempr_max=tempr+tempr_adj;
					hum_max=hum+hum_adj;
					eeprom_busy_wait();
					eeprom_write_word((unsigned int*)0,tempr_max);
				//	eeprom_write_byte((unsigned char*)1,(unsigned char)(tempr_max>>8));
					eeprom_write_byte((unsigned char*)4,hum_max);
					display_T(tempr_max,0);
			    	display_H(hum_max,0);
				}
				else
				{
					tempr_min=tempr+tempr_adj;
					hum_min=hum+hum_adj;
					eeprom_write_word((unsigned int*)2,tempr_min);
					eeprom_write_byte((unsigned char*)5,hum_min);
					display_T(tempr_min,0);
			    	display_H(hum_min,0);	
				}
				break;
      case FRESH_L:
	  			if(sign&0x18)
				break;
				adj_sign=1;
				break;
      case CF :
	            if(sign&0x02)
				{
					  sign&=~0x02;
					  sign|=0x04;
				}
				else
				{
					sign&=~0x04;
					sign|=0x02;
				}
				if((sign&0x18)==0)
					display_T(tempr,1);
                else if(sign&0x08)
					display_T(tempr_max,0);
				else
					display_T(tempr_min,0);
				break;
     default:
	 	break;
	}
}


⌨️ 快捷键说明

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