📄 main.c
字号:
/*
字模位置算法: 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 //定义接受缓冲行数
#define xdata_used SCONF=0x02 //PWD=0x01
#define ch_per_head 5 //定义每个针打的字符数
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; //LED
sbit paper_over=P2^5; //无纸信号
sbit paper=P2^6; //
//=============================================================================
//unsigned char down_time_h=236; //针打下去延时的时间高位
//unsigned char down_time_l=165; //针打下去延时的时间低位
unsigned char down_time_h=239; //针打下去延时的时间高位
unsigned char down_time_l=210; //针打下去延时的时间低位
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_bak1;
bit del_bak2;
xdata struct pt
{
unsigned char mark;
unsigned char n[24];
};
xdata struct pt prt_buf[24]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,
0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
//定义24点行缓冲, 576 byte
xdata struct pt rec_buf[max_rec_line ]; //定义4行接受缓冲, 96 byte
unsigned char pemeter[18]={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; //行中断计数
unsigned char insert_line;
unsigned char insert_line_bak;
//==============================================================================
void main_delay(unsigned int); //主程序延时
void uart_init(void); //串口初始化
void system_init(void); //系统初始化
void prt_init(void); //打印机参数初始化
void time_arrange(void); //每个打印机自适应程序
void line_int(void); //行复位中断
void rec_pemeter(void); //接受参数
void rec_text(void); //接受字符
void dot_int(void); //打点中断
void prt_dotline(void); //打一个点行
void explain(unsigned char); //转换字模
//==============================================================================
extern unsigned char READ_SPI_DATA (unsigned long int); //读SPI
//==============================================================================
main()
{
system_init();
uart_init(); //串口初始化
again: //每次新的打印
prt_init();
first_bag=1; //是否第一包数据=1
while(first_bag)
rec_pemeter(); //接收参数
rec_text(); //等待接受第一包
insert_line_bak=2;//pemeter[4];
insert_line=insert_line_bak;
explain(0); //解释2字行字模
explain(1);
flash=0;
int_counter=0; //行中断计数=0
del_1=del_bak1;
del_2=del_bak2;
time_arrange(); //自适应程序
IE1=0; //外部中断1关
motor=0; //开电机
EA=1; //开中断
rst_det=1;
while(rst_det==1) rst_det=1;
main_delay(10);
while(rst_det==0) rst_det=1;
main_delay(10);
EX1=1;
while(1)
{nop;
nop;
if(flash==1) {flash=0; rec_text(); explain(0); } //若第一次要求更新,接受串口数据,解释到第一字行
if(flash==2) {flash=0; explain(1); //第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; busy=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 time_arrange(void)
{unsigned char a;
unsigned long int count,time_long;
float p;
motor=0;
main_delay(30000); //来回计时求平均数
a=0; time_long=0;
while(rst_det==1) ;
main_delay(10);
while(rst_det==0) rst_det=1;
main_delay(10);
while(rst_det==1) rst_det=1;
while(a<10)
{count=0;
do
{count++;rst_det=1;}
while(rst_det==0);
main_delay(10);
do
{count++;rst_det=1;}
while(rst_det==1);
main_delay(10);
if(count>2500) {a++; time_long+=count;}
//if(a>=10) break;
}
motor=1;
time_long/=10;
//time_long/=2;
/*if(time_long>=8500) time_long-=2500;
else if(time_long>=8000) time_long-=2200; //分段补偿
else if(time_long>=7500) time_long-=1800;
else if(time_long>=7000) time_long-=1500;
else if(time_long>=6000) time_long-=1300;
else if(time_long>=5000) time_long-=1100; */
// if(time_long>=10500) time_long+=11570;
// else if(time_long>=10000) time_long+=11580;
// else if(time_long>=9500) time_long+=11590;
// else if(time_long>=9000) time_long+=11610;
// 调整公式 y=0.524*x+690
/* p=time_long*0.56;
p+=690; */
p=time_long*0.54;
p+=700;
count=p;
time_long-=count;
time_long=time_long*6/ch_per_head ;
/*
if(time_long>=23000) time_long-=13000; //
else if(time_long>=17000) time_long-=10000;
else if(time_long>=16000) time_long-=9800; //
else if(time_long>=15000) time_long-=9800;
else if(time_long>=14000) time_long-=8400;
else if(time_long>=13000) time_long-=8100; //
else if(time_long>=11000) time_long-=7000; //
*/
time_long=0xffff-time_long;
down_time_l=time_long&0xff;
down_time_h=time_long>>8;
}
//========================================================
void line_int(void) interrupt 2 //打印
{
IE1=0; rst_det=1;
int_counter++;
EX1=0; TF0=0; ET0=1; //关自己(行中断)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -