📄 lcd.i
字号:
written_add_data((unsigned int)i*16,tab_13[(unsigned int)i*2]);
written(tab_13[(unsigned int)i*2+1]);
}
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16+2,tab_14[(unsigned int)i*2]);
written(tab_14[(unsigned int)i*2+1]);
}
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16+4,tab_15[(unsigned int)i*2]);
written(tab_15[(unsigned int)i*2+1]);
}
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16+256,tab_16[(unsigned int)i*2]);
written(tab_16[(unsigned int)i*2+1]);
}
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16+258,tab_17[(unsigned int)i*2]);
written(tab_17[(unsigned int)i*2+1]);
}
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16+260,tab_18[(unsigned int)i*2]);
written(tab_18[(unsigned int)i*2+1]);
}
}
void display_clear(void) //清除所有显示
{
unsigned char i;
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16,0x0);
written(0x0);
}
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16+2,0x0);
written(0x0);
}
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16+4,0x0);
written(0x0);
}
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16+256,0x0);
written(0x0);
}
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16+258,0x0);
written(0x0);
}
for(i=0;i<16;i++)
{
written_add_data((unsigned int)i*16+260,0x0);
written( 0x0);
}
}
void Written_char(unsigned char line,unsigned char row,unsigned char z)
{
unsigned char i;
if(row<6)
{
switch(line)
{
case 0:
for(i=0;i<8;i++) written_add_data((unsigned int)i*16+row,tab_char[z][i]);
break;
case 1:
for(i=8;i<16;i++) written_add_data((unsigned int)i*16+row,tab_char[z][i-8]);
break;
}
}
else
{
switch(line)
{
case 0:
for(i=0;i<8;i++) written_add_data((unsigned int)i*16+row+250,tab_char[z][i]);
break;
case 1:
for(i=8;i<16;i++) written_add_data((unsigned int)i*16+row+250,tab_char[z][i-8]);
break;
}
}
}
void start_display()
{
// LCD第1行
Written_char(0,0,55);
Written_char(0,1,25);
Written_char(0,2,63);
Written_char(0,5,62);
Written_char(0,7,54);
Written_char(0,8,63);
Written_char(0,11,62);
// LCD第2行
Written_char(1,0,58);
Written_char(1,1,24);
Written_char(1,2,27);
Written_char(1,3,20);
Written_char(1,4,64);
Written_char(1,9,66);
//Written_char(1,12,Char_T);
}
flash unsigned int Ntc_tab[70]=
flash unsigned int Ntc_tab[70]=
{
733,724,716,707,698,690,681,672,663,654, /* 0- 9*/
645,636,628,619,610,600,592,583,574,565, /*10-19*/
556,547,538,529,521,512,503,495,486,478, /*20-29*/
470,461,453,445,437,429,421,413,406,399, /*30-39*/
391,384,376,369,362,355,348,341,335,328, /*40-49*/
322,315,308,301,295,286,279,273,266,259, /*50-59*/
253,247,240,232,225,218,210,202,194,186 /*60-69*/
};
void Adc_init(void)
void Adc_init(void)
{
ADMUX=0x40; //选择模式
ADCSRA=0X87; //adc 使能,128分频
}
unsigned int Get_ADC(void) //ADC读函数
{
unsigned char Adc_Count; //定义ADC的累计次数
unsigned int Adc_Data_Sum=0; //定义ADC的总数据值
unsigned int ADC_Data; //定义ADC的平均值
// unsigned int Voltage; //定义取样的平均电压
// ADMUX=0x40; //选择模式
for(Adc_Count=0;Adc_Count<3;Adc_Count++)//累计ADC转换4次,并且将ADC数据累加到adcdata里
{
ADCSRA|=(1<<6); //开ADC,进行单次转换
delay_ms(1); //开ADC到读到准确数据件的延时
Adc_Data_Sum+=ADCW; //累加
//ADCSRA|=(0<<6); //关ADC ???
}
ADC_Data=Adc_Data_Sum/3; //平均 ADC
return(ADC_Data); //将ADC返回
}
unsigned int Search_tab(void)
//unsigned char Search_tab()
{
//unsigned int Voltage;
unsigned char i_temp=0;
unsigned int Adc_temp;
Adc_temp=Get_ADC();
// if(temp>Ntc_tab[i_temp]) {i_temp++;}
// else i_temp--;
while((Adc_temp<Ntc_tab[i_temp])&&(i_temp<70)) {i_temp++;}
return(i_temp);
//Voltage=temp*(5000/1024);
//return(temp);
//return(Voltage);
}
void display_temp(void)
{
Written_char(0,3,((Search_tab()-1)/10));
Written_char(0,4,((Search_tab()-1)%10));
//Written_char(0,3,(Search_tab()/1000));
//Written_char(0,4,(Search_tab()%1000/100));
//Written_char(0,5,(Search_tab()%1000%100/10));
//Written_char(0,6,(Search_tab()%1000%100%10));
//Written_char(0,3,Search_tab()/10);
//Written_char(0,4,Search_tab()%10);
}
bit time_Adc_ok=0;
bit time_Adc_ok=0;
unsigned int time_Adc;
bit time_1s_ok=0;
unsigned int time_count;
interrupt [20] void time0_comp_isr(void)
{
if(++time_Adc>=150)
{
time_Adc=0;
time_Adc_ok=1;
}
if(++time_count>=500)
{
time_count=0;
time_1s_ok=1;
}
}
Time_init()
{
TCCR0=0X0b;
TCNT0=0x00;
OCR0 =0x7C;
TIMSK=0X02;
}
unsigned int Seconds=0;
unsigned int Minuts=0;
void tone(unsigned int Buzzer_time) //X定义为报警时间的长短
{
unsigned int i;
for(i=0;i<Buzzer_time;i++)
{
PORTB.6 =~PORTB.6 ;
delay_us(250);
}
}
void Set_temp_display(unsigned char Set_temp_view)
{
Written_char(0,9,(Set_temp_view/10));
Written_char(0,10,(Set_temp_view%10));
}
unsigned char Set_temp=40;
void Key_scan(void)
{
if(PIND.0==0)
{
delay_ms(35); //加
if(PIND.0==0)
{
tone(200); //报警
Set_temp=Set_temp+1;
if(Set_temp>70) Set_temp=0;
}
}
if((PIND.1==0)&&(Set_temp>0))
{
delay_ms(35);
if(PIND.1==0) //减
{
tone(200); //报警
Set_temp--;
if(Set_temp<=0) Set_temp=0;
}
}
if(PIND.2==0)
{
delay_ms(35);
if(PIND.2==0)
{
tone(1500); //报警
//delay_stop();
}
}
Set_temp_display(Set_temp);
}
void time_to_display(unsigned int Work_time) //运行时间
{
Written_char(1,5,(Work_time/1000));
Written_char(1,6,(Work_time%1000/100));
Written_char(1,7,(Work_time%1000%100/10));
Written_char(1,8,(Work_time%1000%100%10));
}
unsigned char state_delay=0;
void Set_temp_compare(void)
{
if((Set_temp+1)>Search_tab()&&(state_delay==0))
{
delay_ms(100); //防止继电器的抖动
PORTB.7 =0;
delay_ms(300); //防止继电器的抖动
state_delay=1;
}
else if((Set_temp+1)<=Search_tab()&&(state_delay==1))
{
delay_ms(100); //防止继电器的抖动
PORTB.7 =1;
delay_ms(300); //防止继电器的抖动
state_delay=0;
}
}
void Display_juck(void)
{
if(PIND.0==0)
{
delay_ms(30);
if(PIND.0==0)
{
start_3(); //显示设计者名字
tone(200); //报警
delay_ms(1000);
}
}
}
void main(void) //主函数
{
DDRA=0xFE;
PORTA=0xFE; //PORT初始化
DDRB=0xff;
PORTB=0x10;
DDRC=0xff;
PORTC=0x00;
DDRD=0xf8; // PIND.0 PIND.1 PIND.2输入
PORTD=0xff; //内部上拉无效
Time_init(); //定时器初始化
Adc_init(); //ADC初始化
#asm("sei") //使能全局中断
PORTB.3 =1; //stand moudle,all output to gnd level
PORTB.3 =0; //OPEN POWER FOR IC
PORTB.4=1; //LCD's light open
Lcd_inint(); //LCD ininteally
tone(400); //报警
delay_ms(1000);
display_clear();
start_1(); //开机字幕1,"恒温控制器"
delay_ms(1000);
//display_clear(); //清除LCD的所有显示
start_2(); //开机字幕2,"厦门顶尖电子"
delay_ms(1000);
Display_juck();
//delay_ms(2000);
display_clear(); //清除LCD的所有显示
start_display(); //固定LCD某些不变字符的显示
//delay_ms(1000);
while(1)
{
if(time_Adc_ok) //ADC转换
{
time_Adc_ok=0;
display_temp();
}
if( time_1s_ok) //计时器
{
time_1s_ok=0;
Seconds++;
if(Seconds>=60)
{
Seconds=0;
Minuts++;
}
time_to_display(Minuts);
}
Key_scan();
Set_temp_compare();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -