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