📄 back.txt
字号:
/*
字模位置算法: ASCII_add=(ASCII*12)
汉字=( (高位-0xb0)*96+(低位) )*24+0x600
*/
#include <SM89516.h>
#include <intrins.h>
#include <absacc.h>
#define nop _nop_()
#define max_rec_line 2 //定义接受缓冲行数
sbit m_a=P1^0; //四个针
sbit m_b=P1^1;
sbit m_c=P1^2;
sbit m_d=P1^3;
sbit motor=P1^7; //电机
sbit rst_det=P3^3; //行复位信号
sbit time_det=P3^2; //点复位信号
sbit busy=P3^5; //忙信号
sbit led=P2^4;
sbit paper_over=P2^5;
sbit paper=P2^6;
void main_delay(unsigned int); //主程序延时
//void d5(void); //针打的时间
//void d3(void); //针抬的时间
//void s_sent(unsigned char); //串口发送(未用)
void uart_init(void); //串口初始化
void time_arrange(void); //每个打印机自适应程序
void line_int(void); //行复位中断
void rec_int(void); //接受字符
void dot_int(void); //打点中断
void explain(unsigned char); //转换字模
extern unsigned char READ_SPI_DATA (unsigned long int); //读SPI
extern void WRITE_SPI_DATA (unsigned long int ,unsigned char );
extern void wren(void);
//7200---238*165 ---4442
//8508---234*120 ---5551
unsigned char down_time_h=236; //针打下去延时的时间高位
unsigned char down_time_l=165; //针打下去延时的时间低位
unsigned char up_time_h=255; //针打下去延时的时间高位
unsigned char up_time_l=220; //针打下去延时的时间低位
bit up_or_down; //1=up; 0=down
bit next_dota; //定义下一个要打的a点,
bit next_dotb; //定义下一个要打的b点,
bit next_dotc; //定义下一个要打的c点,
bit next_dotd; //定义下一个要打的d点,
bit line_over; //点行打完标志位
bit p_over; //打印结束位
bit explain_en; //允许解释字模并更新缓冲区
bit back;
bit first_bag=0;
bit del_1;
bit del_2;
bit del_temp1;
bit del_temp2;
xdata struct pt
{
unsigned char mark;
unsigned char n[24];
};
xdata struct pt prt_buf[24]; //定义24点行缓冲, 576 byte
xdata struct pt rec_buf[max_rec_line ]; //定义4行接受缓冲, 96 byte
unsigned char pemeter[16]={0}; //参数,在打印前传
unsigned char rlc; //rec_line_count 接收字节行计数器 0--3
unsigned char rbc; //rec_byte_count 接收字节计数器 0--23
unsigned char plc=0; //print_dotline_count 打印点行计数器 0-23
unsigned char dot_count; //打印点计数器 0--143
unsigned char dot_done; //已打印点计数器 0--143
unsigned char back_counter; //头返回时计数器
unsigned char flash; //需更新第几行
unsigned char temp; //上一次接受的串口数据
unsigned char int_counter; //行中断计数
main()
{
unsigned char b,d,c;
unsigned long int y,add;
unsigned int r;
busy=1; //置忙
SCONF=0x02; //使用xdata 89516用
//PWD=0x01; //77e58用
uart_init(); //串口初始化
nop;
m_a=1; m_b=1; m_c=1; m_d=1; //针抬起
EA=0; //关中断
IP=0x06; //中断优先
ES=0; //关串口中断
IT1=1; //边沿出发
RI=0; //清接受标志位
TR0=0; //关定时器
ET0=0; //关定时中断
EX1=0; //关行中断
motor=1; //关电机
line_over=0; //一行打完标志=0
plc=0; //已打印行=0
explain_en=1; //允许解释位=1;
rec_buf[0].mark=0; //接受行标志=0
rec_buf[1].mark=0; //接受行标志=0
again:
dot_done=0; //清点打印完成数
dot_count=0; //清点计数
up_or_down=1; //打印头为抬起
line_over=0; //一行打完标志
back=0; //返回状态为0
plc=0;
IE1=0; //清行中断标志位
EX1=0; //开行中断
plc=0; //已打印行=0
first_bag=1; //是否第一包数据=1
while(first_bag)
rec_int(); //等待接受第一包
explain(0); //解释2字行字模
explain(1);
int_counter=0; //行中断计数=0
del_1=del_temp1;
del_2=del_temp2;
time_arrange(); //自适应程序
motor=0; //开电机
IE1=0;
EA=1; //开中断
rst_det=1;
while(rst_det==1) rst_det=1;
main_delay(1);
while(rst_det==0) rst_det=1;
main_delay(1);
//IE1=0;
EX1=1;
while(1)
{nop;
nop;
if(flash==1) {rec_int(); explain(0); flash=0;} //若第一次要求更新,接受串口数据,解释到第一字行
if(flash==2) { explain(1); flash=0; //第2次要求更新,解释第2字行,并且检查是否打印完
if(p_over)
{IE1=0; EX1=0; m_a=1; m_b=1; m_c=1; m_d=1;
main_delay(60000);
main_delay(60000); main_delay(60000);
motor=1; goto again;}
} //若打完推出
//if(line_over==1) //控制行复位信号开始
//{while(rst_det==1) {nop;nop;nop;nop;nop;}
// while(rst_det==0) {nop;nop;nop;nop;nop;}
// line_over=0; EX1=1;
// }
}
motor=1;
nop;
}
void line_int(void) interrupt 2 //打印
{
IE1=0;
int_counter++;
EX1=0; TF0=0; ET0=1; //关自己(行中断)
TL0=up_time_l; //载入抬起时间
TH0=up_time_h;
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;}
next_dota=1; next_dotb=1; next_dotc=1; next_dotd=1;
TR0=1;
}
//==============================================
void dot_int(void) interrupt 1 //T0 //点中断
{unsigned x,y,u;
if(back==1) //如果是在打印头返回状态
{if(back_counter<30)
{ 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 if(up_or_down && ET0) //如果在针抬起状态
{ TL0=down_time_l; //载入抬起时间地位
TH0=down_time_h; //高位
up_or_down=!up_or_down; //针状态为打下
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;}
dot_done++; //一点行已打印过的点数++
if(dot_done<=144) 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_temp1; del_2=del_temp2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -