?? main.c
字號:
TL0=up_time_l; //載入抬起時間
TH0=up_time_h;
if(insert_line>0)
{if(plc==0||plc==12)
{insert_line--; main_delay(30); IE1=0; EX1=1; goto nodot;}
}
if(plc==0) {if(del_1==1) plc+=2;}
else if(plc==12) {if(del_2==1) plc+=2;}
else if(plc==10) {if(del_1==1) plc+=1;}
else if(plc==22) {if(del_2==1) plc+=1;}
if(insert_line==0) insert_line=insert_line_bak;
TR0=1;
dot_done=0; //清點打印完成數(shù)
dot_count=0; //清點計數(shù)
up_or_down=1; //打印頭為抬起
line_over=0; //一行打完的標志清零
// if(int_counter==1) //如果第一次計時
/// { TR0=1; back=0;} //開定時器
// else if(int_counter==2) //如果是假計時,
// {TR0=0; int_counter=0; EX1=1; } //關(guān)打點計時,清行中斷計數(shù),從新打開自己的行中斷
// else {TR0=0; EX1=1;}
nodot:
next_dota=1; next_dotb=1; next_dotc=1; next_dotd=1;
}
//============================================================================
void dot_int(void) interrupt 1 //T0 //點中斷
{
if(back==1) //如果是在打印頭返回狀態(tài)
{if(back_counter<35)
{ TL0=down_time_l; TH0=down_time_h; back_counter++; back=1;} //重載計數(shù)器,計數(shù)器加
else
{ back=0; back_counter=0; TR0=0;line_over=1; IE1=0; EX1=1; }
//若沒返回到一行,返回標志清零,計數(shù)器清0,關(guān)打點中斷,
}
else prt_dotline();
}
//===================================================================
void prt_dotline(void)
{unsigned char x,y;
if(up_or_down && ET0) //如果在針抬起狀態(tài)
{ TL0=down_time_l; //載入抬起時間地位
TH0=down_time_h; //高位
up_or_down=!up_or_down; //針狀態(tài)為打下
dot_done++; //一點行已打印過的點數(shù)++
if(dot_done<=(ch_per_head*24) ) EX1=0; //如果沒到144點,關(guān)行復位中斷
else { back=1; m_a=1; m_b=1; m_c=1; m_d=1;
plc++; //打完一行,行計數(shù)加
if(plc==12) //若打完12行
{ flash=1; //要求更新緩沖
if(p_over) {IE1=0; EX1=0; ET0=0;} //若已打完,關(guān)全部中斷
}
else if(plc==24) //若兩行都打完
{flash=2; plc=0; del_1=del_bak1; del_2=del_bak2;
if(p_over) //若已打完,關(guān)全部中斷
{ IE1=0; EX1=0; ET0=0;}
} //要求更新點緩沖
}
//若到了144點,關(guān)打點中斷,置點行打完標志,點行計數(shù)器++,從0--23點行往返
//若開始打新緩沖頁,允許更新緩沖
x=dot_count/(ch_per_head*6); //判斷是哪個針頭打
m_a=1; m_b=1; m_c=1; m_d=1;
switch (x)
{case 0: m_a=next_dota; //針打下已準備好的電緩沖
x=dot_count/6; //緩沖中第幾個字節(jié)
y=dot_count%6; //該字節(jié) 第幾位
if((prt_buf[plc].n[x]<<y)&0x80) next_dota=0; //準備下一個點
else next_dota=1;
break;
case 1: m_b=next_dotb; //針打下已準備好的電緩沖
x=dot_count/6; //緩沖中第幾個字節(jié)
y=dot_count%6; //該字節(jié) 第幾位
if((prt_buf[plc].n[x]<<y)&0x80) next_dotb=0; //準備下一個點
else next_dotb=1;
break;
case 2: m_c=next_dotc; //針打下已準備好的電緩沖
x=dot_count/6; //緩沖中第幾個字節(jié)
y=dot_count%6; //該字節(jié) 第幾位
if((prt_buf[plc].n[x]<<y)&0x80) next_dotc=0; //準備下一個點
else next_dotc=1;
break;
case 3: m_d=next_dotd; //針打下已準備好的電緩沖
x=dot_count/6; //緩沖中第幾個字節(jié)
y=dot_count%6; //該字節(jié) 第幾位
if((prt_buf[plc].n[x]<<y)&0x80) next_dotd=0; //準備下一個點
else next_dotd=1;
break;
}
}
else if((up_or_down==0) && ET0) //若針是打下的
{ TL0=up_time_l; TH0=up_time_h; //載入打下時間
// m_a=1; m_b=1; m_c=1; m_d=1; //針抬起
up_or_down=!up_or_down; //置針頭標志為抬起
dot_count+=(ch_per_head*6); //修改下一個取點位置
if(dot_count>=(ch_per_head*24-1)) dot_count=dot_count-(ch_per_head*24-1); //修改下一個點的位置
}
}
//=============================================
void rec_text(void) //interrupt 4
{unsigned char ch=0,k;
unsigned long int n=0;
busy=0; rlc=0; p_over=0; del_bak1=1; del_bak2=1;
while(rlc<max_rec_line ) //當緩沖沒滿4行
{while(ch<24) //當一行沒滿24字節(jié)
{if(RI==1) //當串口標志位
{k=SBUF; RI=0; n=0; if((rlc==max_rec_line -1)&&(ch==1)) busy=1; //收數(shù)據(jù),清標志位,當最后一行,變忙
if((k!=0x0d)&&(k!=0x0a)) //若不是回車
{rec_buf[rlc].n[ch]=k; ch++; //接收字符
if(k>=0xb0) //若有中文
{if(rlc==0) del_bak1=0; //抽行標志位
else if(rlc==1) del_bak2=0;}
} //若不是回車,寫入緩沖
else if(k==0x0d) //若是回車,這一行緩沖剩下的用空格0x00填補
{if((ch==0)&&((temp!=0x0d)&&(temp!=0x0a))) nop;
else
{while(ch<24) {rec_buf[rlc].n[ch]=' ';
if((rlc==max_rec_line -1)&&(ch==1)) busy=1; ch++;}
}
}
else if(k==0x0a&&temp!=0x0d)
{while(ch<24) {rec_buf[rlc].n[ch]=' '; if((rlc==max_rec_line -1)&&(ch==1)) busy=1; ch++;}
}
temp=k;
}
//if(rlc>0&&ch>0)
n++; if(n>15000)
{p_over=1; first_bag=1; busy=1; goto end;} //若不是第一行,并且沒有數(shù)據(jù)
} //退出
if(ch>=24) {rlc++; ch=0;}
}
end:
if(rlc== max_rec_line ||ch==0)
{ rlc--; }
else if((ch!=0)&&(rlc< max_rec_line ))
{ while(ch<24) {rec_buf[rlc].n[ch]=' '; ch++;} }
k=rlc;
for(;k<max_rec_line ;k--) rec_buf[k].mark=1;
busy=1;
}
//===============================================================================
void rec_pemeter(void)
{ unsigned char i=0;
busy=0;
while(RI==0) ;
i=SBUF;
if(i!=0x28) goto no_pemeter;
else ;
while(i<17)
{if(RI==1) {pemeter[i]=SBUF; RI=0; i++;}
}
insert_line_bak=pemeter[0];
no_pemeter:
first_bag=0;
}
//========================================================================
void explain(unsigned char hang)
{unsigned l,c,d;
unsigned long int add=0;
if(hang==0) l=0; //如果在打第一字行 預存字模定位到第二頁緩沖區(qū)
else if(hang==1) l=12; //如果在打第二字行 預存字模定位到第一頁緩沖區(qū)
else if(hang==2) l=0;
else if(hang==3) l=12;
for(d=0;d<12;d++) //取一個字行的點緩沖
{for(c=0;c<24;c++) //取一點行數(shù)據(jù)
{if(rec_buf[hang].n[c]<=0x7f)
{add=rec_buf[hang].n[c]*12;
prt_buf[d+l].n[c]=READ_SPI_DATA(add+d); } //如果字符為ASC,取第n行的模
else if(rec_buf[hang].n[c]>=0xb0) //如果為漢字
{add=((rec_buf[hang].n[c]-0xb0)*96)+(rec_buf[hang].n[c+1]-0xa0); //取本字節(jié)和下個字節(jié)的模,并拼成一個漢字,
add*=24; add+=0x600; //漢字第二個打印的模,為前一字節(jié)的低2位做高位,加后一字節(jié)右移2位
prt_buf[d+l].n[c]=READ_SPI_DATA(add+d*2); prt_buf[d+l].n[c+1]=READ_SPI_DATA(add+d*2+1);
prt_buf[d+l].n[c+1]=(prt_buf[d+l].n[c]<<6)+(prt_buf[d+l].n[c+1]>>2); c++;} //若為漢字,額外加數(shù)據(jù)指針
}
}
//for(d=0;d<12;d++) prt_buf[d+l].n[0]&=0x7f;
}
//==============================================
//===============================================================
void main_delay(unsigned int i)
{while(i-->0) nop;}
//===============================================================
void uart_init(void)
{SCON = 0x50; TMOD = 0x20;
TH1 = 0xFA; TL1 = 0xFA;
PCON &= 0x7f; TR1 = 1; ES=0;
}
//================================================================
void system_init(void)
{busy=1; //置忙
xdata_used;
motor=1; //關(guān)電機
m_a=1; m_b=1; m_c=1; m_d=1; //針抬起
EA=0; //關(guān)中斷
IP=0x06; //中斷優(yōu)先 int3,tr0
ES=0; TI=0; RI=0; //關(guān)串口中斷,清標志位
TR0=0; ET0=0; //關(guān)定時中斷,關(guān)定時器
EX1=0; IT1=1; //關(guān)行中斷,邊沿出發(fā)
}
//================================================================
void prt_init(void)
{
up_or_down=1; //1=up; 0=down
next_dota=1; //定義下一個要打的a點,
next_dotb=1; //定義下一個要打的b點,
next_dotc=1; //定義下一個要打的c點,
next_dotd=1; //定義下一個要打的d點,
line_over=0; //點行打完標志位
p_over=0; //打印結(jié)束位
back=0; //返回過程中標志位
first_bag=0; //第一包開始
del_1=0; //第一字行緩沖要刪行標志位
del_2=0; //第二字行緩沖要刪行標志位
del_bak1=0; //第一字行緩沖要刪行標志位預存
del_bak2=0; //第二字行緩沖要刪行標志位預存
line_over=0; //一行打完標志=0
rec_buf[0].mark=0; //接受行標志=0
rec_buf[1].mark=0; //接受行標志=0
dot_done=0; //清點打印完成數(shù)
dot_count=0; //清點計數(shù)
plc=0; //已打印行=0
insert_line_bak=0; //插入點行=0
insert_line=0;
motor=1;
IE1=0; //清行中斷標志位
EX1=0; //開行中斷
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -