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

📄 led.c

📁 客户液晶屏静态扫描驱动
💻 C
字号:
/*-----------------------------------
  收款机数字显示器驱动程序(通信部分)
  -----------------------------------*/
/*数字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;
bit   bdata fini,FLASH;

void  Receive(void);

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., ,-.,.
             };
/****************************************
 --------- 定时器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_();
}

/* 从串行口接收一字节数据  */
void RcvDataBy232(void)
{  
     Counter=0;
     do
     {
         Counter++;
         if(Counter>0x2ff)/* 若有一段时间收不到数据则退出  */
         {
            uc0=0xff;
            goto endri;
         }
   }while(RI==0);
   uc0=SBUF;
endri:   RI=0;
}
//=====================================================
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; 
}

/*接收,Order为全局变量,数据放在Un.ComBuf联合体中 */
void Receive(void)
{
     uchar i;//,c
     RcvDataBy232();
     ComBuf[0]=uc0;
     RcvDataBy232();
     ComBuf[1]=uc0;
     RcvDataBy232();
     ComBuf[2]=uc0;
     Order=uc0;         /* 接收命令句柄  */
     RcvDataBy232();
     ComBuf[3]=uc0;
     RcvDataBy232(); /* 接收数据长度  */
     ComBuf[4]=uc0;
     Len=uc0;
     for(i=5;i<Len;i++)//&&i<15
     {
        RcvDataBy232();       /* 接收数据  */
        ComBuf[i]=uc0;
     }
     RcvDataBy232();  //crc
     RcvDataBy232();
     fini=1;
     SBUF=0x4f;
     WaitTI;
     SBUF=0x4b;
     WaitTI;
     SBUF=0x00;
     WaitTI;
     SBUF=0x05;
     WaitTI;
     SBUF=0x00;
     WaitTI;
     SBUF=0x00;
     WaitTI;
}
//===================================
//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,n;
     uchar d;
     ledn=0;
     Beep=1;
     fini=0;
     InitSBUF();
     EA=1;
     for(i=0;i<20;i++) ComBuf[i]=0x00;
     for(i=0;i<15;i++) DisBuf[i]=0XFF;
     DisBuf[0]=TAB[0];
     DisBuf[1]=TAB[0];
     DisBuf[2]=TAB[0];
     DisBuf[3]=TAB[25];
     FLASH=0;
     count=0;
     while(1)         /* 通过查询方式接收来自主板的显示请求 */
     {
         ES=0;
         EA=0;
         count++;
         if(count>0x1f)
         {
            count=0;
            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;}
         }
         if(RI==1){Receive();}
         if(fini==1)  /* 分类处理不同的命令  */
         {    
             for(i=0;i<20;i++) DisBuf[i]=0xff;
             ES=0;
             i=Len-1;p=0;b=0;
AA:
             if(ComBuf[i]>=0x30&&ComBuf[i]<=0x39)   //数字
             {
                if(b==0){d=ComBuf[i]-0x30;}
                else
                {
                   if(p==2||p==6||p==10){d=ComBuf[i]-0x30;}
                   else{d=ComBuf[i]-0x30+10;b=0;}
                }
                DisBuf[p]=TAB[d];
                p++;
             }
             else if(ComBuf[i]==0x2e)
             {

                if(p==3||p==7)
                {
                   for(n=0;n<11;n++)
                   {
                      DisBuf[11-n]=DisBuf[10-n];
                   }
                   DisBuf[0]=0xff;
                   p++;
                }
                b=1;
                if(p==11){b=0;}
             }   //.
             else if(ComBuf[i]==0x2d)         //-
             {
                if(b==0) DisBuf[p]=0xbf;
                else DisBuf[p]=TAB[24];
                b=0;
                p++;
             }
             else {goto AB;}
             if(i<5||p>12){goto AB;}
             i--;
             goto AA; 
AB:          if(b==1)
             {
                DisBuf[p]=TAB[25]; 
             }
             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;
             fini=0;
         }
         
//         ES=1;
      }
}

⌨️ 快捷键说明

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