?? 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 + -