⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 back.txt

📁 这是驱动出租车开票打印机的程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
 /*
  字模位置算法:  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 + -