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

📄 led1

📁 客户液晶屏静态扫描驱动
💻
字号:
/*-----------------------------------
  收款机数字显示器驱动程序(通信部分)
  -----------------------------------*/
/*数字led显示程序模块,通常显示0。00,只有在营业过程中改变输入的数字及小计,单价,余额指示灯*/
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#include <stdio.h>

#define  uchar  unsigned char
#define  uint   unsigned int
#define  ulong  unsigned long

#define   TTHH0    -1800/256    /*  1500  */
#define   TTLL0    -1800%256

/*--------  命令句柄定义 --------*/
#define OpenLED     0xa1  /* 打开LED显示 0.00 */
#define CloseLED    0xa2  /* 关闭LED显示   */
#define WriteLED    0xa3  /* 接收LED显示缓冲区数据  */
#define TestLED     0xa4  /* 全显8888或顺序地显示每一段位*/
#define LEDbeep     0xa5

/* 以上各命令在正确接收与处理后返回Finish句柄数据长度为0,否则返
   回ERROR或其它不同状态.其中的数据格式请根据LED需显示内容,长度 
   自行设计   */

#define  Error       0xff
#define  OK          0x0
#define  Finish      0x70

#define   WaitTI    while(TI==0);TI=0
#define   WaitRI    while(RI==0);RI=0

#define   Beep     P3_7
#define   SL1      P3_2
#define   SL2      P3_3
#define   SL3      P3_4
#define   SL4      P3_5

sbit   P1_0=P1^0;
sbit   P1_1=P1^1;
sbit   P1_2=P1^2;
sbit   P1_3=P1^3;
sbit   P1_4=P1^4;
sbit   P1_5=P1^5;
sbit   P1_6=P1^6;
sbit   P1_7=P1^7;

sbit   P3_0=P3^0;
sbit   P3_1=P3^1;
sbit   P3_2=P3^2;
sbit   P3_3=P3^3;
sbit   P3_4=P3^4;
sbit   P3_5=P3^5;
sbit   P3_6=P3^6;
sbit   P3_7=P3^7;

sbit TA   = 0xc7;
sbit RWT  = 0xbf;
sbit EWT  = 0x89;
sbit WTR  = 0x91;
sbit EXBS = 0xdd;

/******************数据结构定义*****************************************/

uchar  ComBuf[20];
uchar  DisBuf[20];

uchar  data Order,Len,ledn;
uint  data Counter;
uchar data uc0;
uchar bdata p3d;
sbit p3d0=p3d^0;
sbit p3d1=p3d^1;
sbit p3d2=p3d^2;
sbit p3d3=p3d^3;
sbit p3d4=p3d^4;
sbit p3d5=p3d^5;

void Receive(void);

/****************************************
 --------- 定时器1中断服务程序 ----------
 *****************************************/
void TimeCount1(void) interrupt 3 using 0
{
  _nop_();
}                      

/*****************************
 ---- 定时器0中断服务程序 ----
 *****************************/
void TimeCount0(void)  interrupt 1 using 1
{
		   TH0=TTHH0;
		   TL0=TTLL0;
     p3d=ledn;
     P3_2=p3d0;
     P3_3=p3d1;
     P3_4=p3d2;
     P3_5=p3d3;
		   P1=DisBuf[ledn];
		   ledn++;
     if(ledn==12){ledn=15;}
		   if(ledn>15){ledn=0;}
}
/**********************
 ----- 外部中断0  -----
/**********************/
void External0(void) interrupt 0 using 2
{
   _nop_();
}

/**************************
 ------  外部中断1  -------
 **************************/
void External1(void) interrupt 2 using 3
{
    _nop_();
}

/* 从串行口接收一字节数据  */
uchar RcvDataBy232(void)
{  
     Counter=0;
     do
     {
         Counter++;
         if(Counter>0x2ff)/* 若有一段时间收不到数据则退出  */
         {
            uc0=0xff;
            RI=0;
            return 0;
         }
   }while(RI==0);
   uc0=SBUF;
   RI=0;
   return 1;
}
//=====================================================
void InitSBUF(void)     /* 初始化串行口实现点对点通信 */
{
   IE=0;
   TMOD=0x21;
   TL1=0xfd;            /* 9600时TH1,TL1=0xfd,1200时TH1,TL1=0XE8 */
   TH1=0xfd;

   TH0=TTHH0;
   TL0=TTLL0;
   PCON=0x0;
   SCON=0x50;
   TR0=1;
   ET0=1;
   IP=0;
   PS=1;
   TR1=1;  
   RI=0;    TI=0;

}

/*命令格式:
包头(1,0xAA) + 命令(1) + 机器号(1) + 长度(1) + 数据 + Checksum(1)*/
void ssio(void) interrupt 4 using 3
{
    ES=0;
    ET0=0;
    Receive();
    ES=1;  ET0=1;
    RI=0;  TI=0; 
}
//=============================
void sbuwork(uchar d)     //*发送一数据:c*
{  
   uchar c;
   SBUF=d;             //*发送数据*
   WaitTI;             //*等待一帧发送完毕*
   for(c=0;c<=0x05;c++);
   return;
}
//=============================
/*接收,Order为全局变量,数据放在Un.ComBuf联合体中 */
void Receive(void)
{
     uchar i;//,c
     if(RcvDataBy232()==0) goto AA;
     if(uc0!=0x1b){goto AA;}
     if(RcvDataBy232()==0) goto AA;
     if(uc0!=0x10){goto AA;}
     if(RcvDataBy232()==0) goto AA;
     Order=uc0;         /* 接收命令句柄  */
     if(RcvDataBy232()==0) goto AA;
     if(uc0!=0x00){goto AA;}
     if(RcvDataBy232()==0) goto AA;
     if(uc0<=5){goto AA;}
     Len=uc0-5;
     for(i=0;i<Len;i++)//&&i<15
     {
         if(RcvDataBy232()==0) goto AA;
         ComBuf[i]=uc0;
     }
     if(RcvDataBy232()==0) goto AA;
     if(RcvDataBy232()==0) goto AA;
     sbuwork(0x4f);
     sbuwork(0x4b);
     goto AB;
AA:  Len=0xff;
     sbuwork(0x45);
     sbuwork(0x52);
     sbuwork(0x00);
     sbuwork(0x04);
AB:
     sbuwork(0x00);
     sbuwork(0x00);
     return;

}
//===================================
//void delay(uint z)
//{
//    uchar i;
//    while(z-->0){
//       for(i=0;i<100;i++)  _nop_();
///    }
//}
//=====================================
void main(void)
{
     bit b;
     uchar count;
     uchar i,p;
     uchar d;
     uchar code TAB[26]={       //共阴极
              0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,//0,1,2,3,4,5,6,7,8,9,
              0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,//0.,1.,2.,3.,4.,5.,6.,7.,8.,9.
              0xBF,0xfd,0X00,0XFF,0X3F,0X7F  //-,合计,8., ,-.,.
             };
     ledn=0;
     Beep=1;
     InitSBUF();
     EA=1;
     for(i=0;i<20;i++) ComBuf[i]=0x00;
     for(i=0;i<15;i++) DisBuf[i]=23;
     DisBuf[0]=0;
     DisBuf[1]=0;
     DisBuf[2]=0;
     DisBuf[4]=25;
     count=0;
     Len=0xff;
     while(1)         /* 通过查询方式接收来自主板的显示请求 */
     {
         ES=1;
         EA=1;
         count++;
         if(count>0x0f)
         {
            count=0;
            p3d=ledn;
							     P3_2=p3d0;
							     P3_3=p3d1;
							     P3_4=p3d2;
							     P3_5=p3d3;
									   P1=TAB[DisBuf[ledn]];
									   ledn++;
							     if(ledn==12){ledn=15;}
									   if(ledn>15){ledn=0;}
         }

        // if(RI==1){length=Receive();}
         if(Len>0x00&&Len<0x15)  /* 分类处理不同的命令  */
         {    
             for(i=0;i<20;i++) DisBuf[i]=23;
             ES=0;
             i=Len;p=0;b=0;
AA:
             if(ComBuf[i]>=0x30&&ComBuf[i]<=0x39)   //数字
             {
                if(b==0){d=ComBuf[i]-0x30;}
                else
                {
                   d=ComBuf[i]-0x30+10;
                   if(p==2||p==6||p==10){b=1;}
                   else{b=0;}
                }
                DisBuf[p]=d;
                p++;
             }
             else if(ComBuf[i]==0x2e){b=1;}   //.
             else if(ComBuf[i]==0x2d)         //-
             {
                DisBuf[p]=0xbf;
                p++;
             }
             else {goto AB;}
             if(i==0||p>12){goto AB;}
             i--;
             goto AA; 
AB:
             if(Order==0x00)  //单价
             {DisBuf[15]=0xfe;}
             if(Order==0x01)  //合计
             {DisBuf[15]=0xfd;}
             if(Order==0x02)  //找零
             {DisBuf[15]=0xfb;}
             for(i=0;i<20;i++) ComBuf[i]=0x00;
             Len=0xff;
         }
        
      }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -