📄 display.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 + -