📄 bi2.c
字号:
void LCD_write_ch(unsigned char X,unsigned char Y,unsigned char z,unsigned int s)
{unsigned char k;
unsigned char p[6]="0";
unsigned char i=0;
//写地址
LCD_set_xy( X, Y );
for(i=0;i<z;i++)
{
p[i]=s%10;
s=s/10;
}
i--;
/*
while(!(p[i]))
{
if(i==0)
{LCD_write_char( 0, 0b00110000 );i--;}
else
{i--;LCD_write_char( 0, 0b10000000 );}
}
*/
for(;i<255;i--)
{
LCD_write_char( 0, p[i]+0b00110000 );
}}
void LCD_init(void) //液晶初始化
{
delay_nms(15);
LCD_write_char(0x28,0); //4位显示
LCD_write_char(0x0c,0); //显示开
LCD_write_char(0x01,0); //清屏
}
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y ); //写地址
while (*s) // 写显示字符
{
LCD_write_char( 0, *s );
s ++;
}
}
void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
{
unsigned char address;
if (y == 0) address = 0x80 + x;
else
address = 0xc0 + x;
LCD_write_char( address, 0 );
}
void LCD_en_write(void) //液晶使能
{
LCD_EN_PORT|=LCD_EN;
delay_nus(1);
LCD_EN_PORT&=~LCD_EN;
}
void LCD_write_char(unsigned command,unsigned data) // 写数据
{
unsigned command_temp,data_temp;
command_temp=command;
data_temp=data;
delay_nus(16);
if(command==0)
{
LCD_RS_PORT|=LCD_RS; //RS=1
LCD_DATA_PORT&=0XF0;
LCD_DATA_PORT|=(data_temp>>4)&0x0F; //写高四位
LCD_en_write();
//data_temp=data_temp<<4;
LCD_DATA_PORT&=0XF0;
LCD_DATA_PORT|=data_temp&0x0F; //写低四位
LCD_en_write();
}
else
{
LCD_RS_PORT&=~LCD_RS; //RS=0
LCD_DATA_PORT&=0XF0;
LCD_DATA_PORT|=(command_temp>>4)&0x0F; //写高四位
LCD_en_write();
// command_temp=command_temp<<4;
LCD_DATA_PORT&=0xF0;
LCD_DATA_PORT|=command_temp&0x0F; //写低四位
LCD_en_write();
}
}
/***************************************
T2初始化,中断
****************************************/
void time_change(void)
{
if(time[0][0]<60)
return;
else
{time[0][0]-=60;
if(time[0][1]<59)
time[0][1]++;
else
{
time[0][1]=0;
if(time[0][2]<23)
time[0][2]++;
else
time[0][2]=0;
}
}
}
void t2_init()
{
ASSR=(1<<AS2);
TCNT2=0XE0;
TCCR2=(7<<CS20);
TIMSK|=(1<<TOIE2);
}
#pragma interrupt_handler t2_iov:5
void t2_iov(void)
{
TCNT2=0XE0;
time[0][0]++;
time_change();
}
void disp_temp(unsigned char x,unsigned char y,unsigned char q)
{
if(q==1)
{LCD_write_string(0,1,"alarm clock: ");
if(alarmfalg==1)
{LCD_write_string(13,1,"on ");}
else
{LCD_write_string(13,1,"off");}
}
LCD_write_string(0,y,"time:");
LCD_write_ch(6,y,2,time[change/10][2]);
LCD_write_string(8,y,":");
LCD_write_ch(9,y,2,time[change/10][1]);
LCD_write_string(11,y,":");
LCD_write_ch(12,y,2,time[change/10][0]);
}
char get_key()
{
unsigned char temp,tempn0;
temp=PINA&0XF0;
switch (temp)
{
case 0xe0:tempn0=1;break;
case 0xd0:tempn0=2;break;
case 0xb0:tempn0=3;break;
case 0x70:tempn0=4;break;
}
return tempn0;
}
void sys_init()
{
DDRA=0X0F;
PORTA=0XFF;
DDRC=0XFF;
PORTC=0XFF;
LCD_DATA_DDR=0XFF;
DDRB=0B10110000;
SEI();
}
void disp_change()
{
if((change/10)!=0)
{
LCD_write_string(0,0,"alarm ");
LCD_write_ch(7,0,1,change/10);
}
else
{ LCD_write_string(0,0,"set time");
}
switch(change%10)
{
case 0: LCD_write_string(9,0,"second");break;
case 1: LCD_write_string(9,0,"mintue");break;
case 2: LCD_write_string(9,0,"hour ");break;
}
}
void changetime()
{
if(change%10==0)
{time[change/10][0]=0;}
else if(change%10==1)
{if(time[change/10][1]==255)
{time[change/10][1]=59;}
else if(time[change/10][1]==60)
{time[change/10][1]=0;}
}
else if(change%10==2)
{if(time[change/10][2]==255)
{time[change/10][2]=23;}
else if(time[change/10][2]==24)
{time[change/10][2]=0;}
}
}
void write_eep()
{
unsigned char i;
change=10;
for(;;)
{
if((change%10)==2)
{if(change!=52)
{change=change+9;}
else
{change=0;mo=0;break;}
}
else
{change++;}
EEPROMwrite(change,time[change/10][change%10]);
}
}
void write_1302()
{unsigned char temp[8];
Burst_SPI(0xbe,3,&time[0][0],&time[0][0]);
}
void settime()
{unsigned char j;
disp_temp(0,1,0);
disp_change();
switch(get_key())
{
case 1:if((change%10)==2)
{if(change!=52)
{change=change+9;}
else
{change=0;write_eep();}
}
else
{change++;}
delay(300);
break;
case 2: LCD_write_char(0x01,0);write_eep();break;
case 3:time[change/10][change%10]++;changetime();delay(200);write_1302();break;
case 4:time[change/10][change%10]--;changetime();delay(200);write_1302();break;
}
}
char com()
{
unsigned char i,temp=0;
for(i=1;i<6;i++)
{
if(time[0][1]==time[i][1])
{if(time[0][2]==time[i][2])
{temp=1;}
}
}
return temp;
}
void read_eep()
{
change=10;
for(;;)
{
if((change%10)==2)
{if(change!=52)
{change=change+9;}
else
{change=0;mo=0;break;}
}
else
{change++;}
time[change/10][change%10]=EEPROMread(change);
}
}
void main()
{
unsigned int i;
sys_init();
for(i=0;i<10;i++)
{
LCD_init();
LCD_write_string(0,0,"set the distance");
LCD_write_string(10,1,"cm");
}
//write_eep();
//t2_init();
i=EEPROMread(11);
if(i==255)
{write_eep();}
init_SPI();
date=Single_SPI(0x80,0);
read_eep();
timer2_init();
MCUCR = 0x00;
TIMSK|=(1<<TOIE2); //允许定时器2溢出中断
SEI();
TCCR2 = 0x00;
LCD_write_string(0,0,"time:");
LCD_write_string(0,1,"alarm clock: ");
Burst_SPI(0xbe,8,&time[0][0],&temp_1302[0]);
for(;;)
{Burst_SPI(0xbf,8,&date_init[0],&temp_1302[0]);
switch(mo)
{
case 0:change=0;
disp_temp(0,0,1);
if(get_key()==1)
{mo=1; LCD_write_char(0x01,0);
LCD_write_string(0,0,"set time second");
disp_temp(0,1,0);
disp_temp(0,1,0);
LCD_write_string(0,0,"set time second");
change=0;
delay(300);}
if(get_key()==4)
{alarmfalg=0;}
if(get_key()==3)
{alarmfalg=1;}
if((com()==1)&&(alarmfalg==1))
{music();}
break;
case 1:settime();break;
case 2:
/* LCD_write_string(0,0," alarm clock: ");
if(alarmfalg==1)
{LCD_write_string(0,1," on ");}
else
{LCD_write_string(0,1," off ");}
switch(get_key())
{
case 1:
case 2: LCD_write_char(0x01,0);mo=0;break;
case 3:alarmfalg=1;delay(200);break;
case 4:alarmfalg=0;delay(200);break;
}*/
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -