📄 dispfinal.c
字号:
i=(receive_buf[1]&0x30)>>4;
left_shift(charsize|i);
while(osd_busy); left_shift(smooth|pos);
i=char_position|((disp_lines>>3)&0x01);
j=disp_lines<<5&0xe0|disp_words;
while(osd_busy);
left_shift(i); //command and lines.3
while(osd_busy);
left_shift(j); //lines.2-0 and words
if(start_blink==1) left_shift(char_blink);
else left_shift(char_attribute);
for(i=0;i<24;i++)
{
if(i+disp_words>=24)
{
address_buf[i]=0xef;
continue;
}
if((start_blink==(i+1))&(i!=0))
{
if(channel==0)
{
osd1_cs=1;
_nop_();
osd1_cs=0;
}
else
{
osd2_cs=1;
_nop_();
osd2_cs=0;
}
left_shift(char_blink);
}
if(end_blink==(i+1))
{
if(channel==0)
{
osd1_cs=1;
_nop_();
osd1_cs=0;
}
else
{
osd2_cs=1;
_nop_();
osd2_cs=0;
}
left_shift(char_attribute);
}
if(address_buf[i]==0xef) break;
left_shift(address_buf[i]);
address_buf[i]=0xef;
}
while(osd_busy);
{ osd1_cs=1;
osd2_cs=1; }
}
//---------------------------------------------------------------------------
void create_character(unsigned int pos) //requista address
{
unsigned char data i,pow;
while(osd_busy); //write a space line
left_shift(cram_data);
while(osd_busy);
left_shift(0x00);
while(osd_busy); //write a space line
left_shift(cram_data);
while(osd_busy);
left_shift(0x00);
for(i=0;i<16;i++) //write character dot information
{
pow=XBYTE[pos++];
pow=pow&0x0f|cram_data;
while(osd_busy);
left_shift(pow);
pow=XBYTE[pos++];
while(osd_busy);
left_shift(pow);
}
}
//----------------------------------------------------------------------------
void detemine_command(void)
{
unsigned char data comm;
receive_flag=0;
ES=0;
for(comm=0;comm<29;comm++)
{
receive_buf[comm]=receive_buf2[comm];
}
ES=1;
comm=receive_buf[0]&0xf0;
switch(comm)
{
case 0x10: timer_position(); break;
case 0x20: timer_setup(); break;
case 0x30: clear_disp(); break;
case 0x40: disp_character(); break;
case 0x50: release_alarm(); break;
case 0x60: video_change(); break;
case 0x70: background_set(); break;
case 0x80: close_time(); break;
case 0x90: close_date(); break;
case 0xa0: televisionmode(); break;
default: break;
}
}
//--------------------------------------------------------------------------
unsigned char get_strokes(unsigned char pow)
{
char data t,i=0,j=47;
while(j>=i)
{
t=(i+j)/2;
if(pow==disp_strokes[t].ascii)
{
return(disp_strokes[t].stroke);
}
else
{
if(pow<disp_strokes[t].ascii)
{
j=t-1;
}
else
{
if(pow>disp_strokes[t].ascii)
i=t+1;
}
}
}
return(0xce);
}
//---------------------------------------------------------------------------
unsigned char get_ch_strokes(unsigned char high_data,unsigned char low_data)
{
char data t,i=0,j=49;
while(j>=i)
{
t=(i+j)/2;
if((high_data==disp_ch_strokes[t].code_high)&(low_data==disp_ch_strokes[t].code_low))
{
return(disp_ch_strokes[t].ch_stroke);
}
else
{
if((high_data<disp_ch_strokes[t].code_high)||\
((high_data==disp_ch_strokes[t].code_high)&&\
(low_data<disp_ch_strokes[t].code_low)))
{
j=t-1;
}
else
{
if((high_data>disp_ch_strokes[t].code_high)||\
((high_data==disp_ch_strokes[t].code_high)&&\
(low_data>disp_ch_strokes[t].code_low)))
i=t+1;
}
}
}
return(0);
}
//---------------------------------------------------------
void getaddrone(unsigned char channel)
{
unsigned char data i,pow,j,t,n=0;
i=receive_buf[1]&0x0f;
if(i>=12) i-=12;
disp_lines=i;
disp_words=receive_buf[2];
start_blink=receive_buf[3];
end_blink=receive_buf[4];
for(j=5;j<29;j++)
{
if(receive_buf[j]==0)
{
address_buf[n++]=0xef;
continue;
}
else
{
if(receive_buf[j]<0x80)
address_buf[n++]=get_strokes(toupper(receive_buf[j]));
else
{
pow=get_ch_strokes(receive_buf[j],receive_buf[j+1]);
if(pow!=0)
{
j++;
address_buf[n++]=pow;
} //is internal existed chinese code
else //is not internal chinese
{
for(t=0;t<32;t++,t++)
{
if((receive_buf[j]==character_code[0][t])&&\
(receive_buf[j+1]==character_code[0][t+1])) //aready exist pregenerated code
{
j++;
address_buf[n++]=0xf0+t/2;
already=1;
break;
}
}
if(!already)
{
character_code[0][disp_count++]=receive_buf[j++];
character_code[0][disp_count]=receive_buf[j];
address_buf[n++]=0xf0+disp_count/2;
if(++disp_count>=32) disp_count=0;
required=1;
}
already=0;
}
}
}
}
if(required)
{
write_osd_cram(channel);
required=0;
}
write_osd_vram(i,channel);
}
//---------------------------------------------------------
void getaddrtwo(unsigned char channel)
{
unsigned char data i,pow,j,t,n=0;
i=receive_buf[1]&0x0f;
if(i>=12) i-=12;
disp_lines=i;
disp_words=receive_buf[2];
start_blink=receive_buf[3];
end_blink=receive_buf[4];
for(j=5;j<29;j++)
{
if(receive_buf[j]==0)
{
address_buf[n++]=0xef;
continue;
}
else
{
if(receive_buf[j]<0x80)
address_buf[n++]=get_strokes(toupper(receive_buf[j]));
else
{
pow=get_ch_strokes(receive_buf[j],receive_buf[j+1]);
if(pow!=0)
{
j++;
address_buf[n++]=pow;
} //is internal existed chinese code
else //is not internal chinese
{
for(t=0;t<32;t++,t++)
{
if((receive_buf[j]==character_code[1][t])&&\
(receive_buf[j+1]==character_code[1][t+1])) //aready exist pregenerated code
{
j++;
address_buf[n++]=0xf0+t/2;
already=1;
break;
}
}
if(!already)
{
character_code[1][addr_count++]=receive_buf[j++];
character_code[1][addr_count]=receive_buf[j];
address_buf[n++]=0xf0+addr_count/2;
if(++addr_count>=32) addr_count=0;
required=1;
}
already=0;
}
}
}
}
if(required)
{
write_osd_cram(channel);
required=0;
}
write_osd_vram(i,channel);
}
//---------------------------------------------------------------------
void disp_character(void)
{
unsigned char data i;
i=receive_buf[0]&0x03;
if(i==0)
{
getaddrone(0);
getaddrtwo(1);
}
if(i==1) getaddrone(0);
if(i==2) getaddrtwo(1); //-
}
//--------------------------------------------------------------------
void video_change(void)
{
unsigned char i;
i=receive_buf[0]&0x01;
if(i) k_4053c=1;
else k_4053c=0;
}
//----------------------------------------------------------------------
void release_alarm(void)
{
alarm=1;
}
//--------------------------------------------------------------------
void separate_half_date(void)
{
unsigned char data i=0;
address_buf[i++]=(unsigned char)(real_clock.years/1000);
address_buf[i++]=(unsigned char)(real_clock.years%1000/100);
address_buf[i++]=(unsigned char)(real_clock.years%100/10);
address_buf[i++]=(unsigned char)(real_clock.years%10);
address_buf[i++]=0xcd;
address_buf[i++]=real_clock.months/10;
address_buf[i++]=real_clock.months%10;
address_buf[i++]=0xcd;
address_buf[i++]=real_clock.dates/10;
address_buf[i++]=real_clock.dates%10;
}
//----------------------------------------------------------------------
void separate_half_time(void)
{
unsigned char data i=0;
address_buf[i++]=real_clock.hours/10;
address_buf[i++]=real_clock.hours%10;
address_buf[i++]=0xe1;
address_buf[i++]=real_clock.minutes/10;
address_buf[i++]=real_clock.minutes%10;
address_buf[i++]=0xe1;
address_buf[i++]=real_clock.seconds/10;
address_buf[i++]=real_clock.seconds%10;
}
//---------------------------------------------------------------------------
void write_osd_date(void)
{
unsigned char data i;
separate_half_date();
while(osd_busy);
left_shift(((real_clock.date_lines>>3)&0x01)|char_position);
while(osd_busy);
left_shift((real_clock.date_lines<<5)|real_clock.date_words);
while(osd_busy);
left_shift(char_attribute);
for(i=0;i<10;i++)
{
while(osd_busy);
left_shift(address_buf[i]);
}
}
//---------------------------------------------------------------------------
void write_osd_time(void)
{
unsigned char data i;
separate_half_time();
while(osd_busy);
left_shift(((real_clock.time_lines>>3)&0x01)|char_position);
while(osd_busy);
left_shift((real_clock.time_lines<<5)|real_clock.time_words);
while(osd_busy);
left_shift(char_attribute);
for(i=0;i<8;i++)
{
while(osd_busy);
left_shift(address_buf[i]);
}
}
//--------------------------------------------------------------------
void clear_disp(void)
{
unsigned char data k,i;
k=receive_buf[0]&0x03;
oneday=1;
if(k==0)
{
osd1_cs=0;
osd2_cs=0;
for(i=0;i<32;i++){
character_code[0][i]=0;
character_code[1][i]=0;
}
addr_count=0;
disp_count=0;
}
else
{
if(k==1) {
osd1_cs=0;
for(i=0;i<32;i++)
character_code[0][i]=0;
disp_count=0;
}
else {
osd2_cs=0;
for(i=0;i<32;i++)
character_code[1][i]=0;
addr_count=0;
}
}
while(osd_busy);
left_shift(clear_vram);
delay(1); //5 to 1 ;9.2
while(osd_busy);
left_shift(disp_control);
while(osd_busy);
{osd1_cs=1;
osd2_cs=1;}
}
//----------------------------------------------------------------------------
void timer_setup(void)
{
oneday=1;
real_clock.years=((receive_buf[1]&0x0f)*1000l)+(unsigned int)(receive_buf[2]&0x0f)*100\
+(receive_buf[3]&0x0f)*10+(receive_buf[4]&0x0f);
real_clock.months=(receive_buf[5]&0x0f)*10+receive_buf[6]&0x0f;
real_clock.dates=(receive_buf[7]&0x0f)*10+(receive_buf[8]&0x0f);
real_clock.hours=(receive_buf[9]&0x0f)*10+(receive_buf[10]&0x0f);
real_clock.minutes=(receive_buf[11]&0x0f)*10+(receive_buf[12]&0x0f);
real_clock.seconds=(receive_buf[13]&0x0f)*10+(receive_buf[14]&0x0f);
if(real_clock.years%4==0&&real_clock.years%100!=0||real_clock.years%400==0) leap=1;
else leap=0;
}
//-------------------------------------------------------------------
void timer_position(void)
{
unsigned char i;
oneday=1;
for(i=0;i<10;i++)
address_buf[i]=0xef;
osd1_cs=0;
osd2_cs=0;
while(osd_busy);
left_shift(((real_clock.date_lines>>3)&0x01)|char_position);
while(osd_busy);
left_shift((real_clock.date_lines<<5)|real_clock.date_words);
while(osd_busy);
left_shift(char_attribute);
for(i=0;i<10;i++)
{
while(osd_busy);
left_shift(address_buf[i]);
}
osd1_cs=1;
osd2_cs=1;
osd1_cs=0;
osd2_cs=0;
while(osd_busy);
left_shift(((real_clock.time_lines>>3)&0x01)|char_position);
while(osd_busy);
left_shift((real_clock.time_lines<<5)|real_clock.time_words);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -