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