📄 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; //清点打印完成数
dot_count=0; //清点计数
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; } //关打点计时,清行中断计数,从新打开自己的行中断
// 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) //如果是在打印头返回状态
{if(back_counter<35)
{ TL0=down_time_l; TH0=down_time_h; back_counter++; back=1;} //重载计数器,计数器加
else
{ back=0; back_counter=0; TR0=0;line_over=1; IE1=0; EX1=1; }
//若没返回到一行,返回标志清零,计数器清0,关打点中断,
}
else prt_dotline();
}
//===================================================================
void prt_dotline(void)
{unsigned char x,y;
if(up_or_down && ET0) //如果在针抬起状态
{ TL0=down_time_l; //载入抬起时间地位
TH0=down_time_h; //高位
up_or_down=!up_or_down; //针状态为打下
dot_done++; //一点行已打印过的点数++
if(dot_done<=(ch_per_head*24) ) EX1=0; //如果没到144点,关行复位中断
else { back=1; m_a=1; m_b=1; m_c=1; m_d=1;
plc++; //打完一行,行计数加
if(plc==12) //若打完12行
{ flash=1; //要求更新缓冲
if(p_over) {IE1=0; EX1=0; ET0=0;} //若已打完,关全部中断
}
else if(plc==24) //若两行都打完
{flash=2; plc=0; del_1=del_bak1; del_2=del_bak2;
if(p_over) //若已打完,关全部中断
{ IE1=0; EX1=0; ET0=0;}
} //要求更新点缓冲
}
//若到了144点,关打点中断,置点行打完标志,点行计数器++,从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; //缓冲中第几个字节
y=dot_count%6; //该字节 第几位
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; //缓冲中第几个字节
y=dot_count%6; //该字节 第几位
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; //缓冲中第几个字节
y=dot_count%6; //该字节 第几位
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; //缓冲中第几个字节
y=dot_count%6; //该字节 第几位
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字节
{if(RI==1) //当串口标志位
{k=SBUF; RI=0; n=0; if((rlc==max_rec_line -1)&&(ch==1)) busy=1; //收数据,清标志位,当最后一行,变忙
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;} //若不是第一行,并且没有数据
} //退出
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; //如果在打第一字行 预存字模定位到第二页缓冲区
else if(hang==1) l=12; //如果在打第二字行 预存字模定位到第一页缓冲区
else if(hang==2) l=0;
else if(hang==3) l=12;
for(d=0;d<12;d++) //取一个字行的点缓冲
{for(c=0;c<24;c++) //取一点行数据
{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); //取本字节和下个字节的模,并拼成一个汉字,
add*=24; add+=0x600; //汉字第二个打印的模,为前一字节的低2位做高位,加后一字节右移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++;} //若为汉字,额外加数据指针
}
}
//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; //关电机
m_a=1; m_b=1; m_c=1; m_d=1; //针抬起
EA=0; //关中断
IP=0x06; //中断优先 int3,tr0
ES=0; TI=0; RI=0; //关串口中断,清标志位
TR0=0; ET0=0; //关定时中断,关定时器
EX1=0; IT1=1; //关行中断,边沿出发
}
//================================================================
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; //打印结束位
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; //清点打印完成数
dot_count=0; //清点计数
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 + -