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

📄 main.c

📁 这是驱动出租车开票打印机的程序
💻 C
📖 第 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        //定义接受缓冲行数
#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 + -