📄 jbdisp.c
字号:
#include <jbDisp.h>
void ConvertCode(void)
{
byte i;
byte bTemp;
byte code *pDispCode;
for(i=0;i<20;i++){
pDispCode=DISP_CODE_ADDR;
bTemp=0;
while(1){
if(pDispCode>DISP_CODE_END)
break;
if(aLargeBuf[i]==*pDispCode){ //查字符表
aLargeBuf[i]=*(++pDispCode);
break;
}
else
pDispCode+=2;
}
}
}
void DispOut(void)
{
byte i;
SDA=SPACE;
SDelay();
SCL=SPACE;
SDelay();
I2CWrite(0x70);
I2CWrite(0xe0);
I2CWrite(0x00);
for(i=0;i<20;i++)
I2CWrite(aLargeBuf[i]); // Display Large Lcd
SCL=MARK;
SDelay();
SDA=MARK;
SDelay();
SDA=SPACE;
SDelay();
SCL=SPACE;
SDelay();
I2CWrite(0x72);
I2CWrite(0xe0);
I2CWrite(0x00);
for(i=0;i<5;i++)
I2CWrite(aSmallBuf[i]); // Display Small Lcd
SCL=MARK;
SDelay();
SDA=MARK;
SDelay();
}
void I2CWrite(byte todisp)
{
bDispBuf=todisp;
EA=0;
SDA=bDispBuf7;
SCL=MARK;
SDelay();
SCL=SPACE;
SDelay();
SDA=bDispBuf6;
SCL=MARK;
SDelay();
SCL=SPACE;
SDelay();
SDA=bDispBuf5;
SCL=MARK;
SDelay();
SCL=SPACE;
SDelay();
SDA=bDispBuf4;
SCL=MARK;
SDelay();
SCL=SPACE;
SDelay();
SDA=bDispBuf3;
SCL=MARK;
SDelay();
SCL=SPACE;
SDelay();
SDA=bDispBuf2;
SCL=MARK;
SDelay();
SCL=SPACE;
SDelay();
SDA=bDispBuf1;
SCL=MARK;
SDelay();
SCL=SPACE;
SDelay();
SDA=bDispBuf0;
SDelay();
SCL=MARK;
SDelay();
SCL=SPACE;
SDA=MARK;
SDelay();
SCL=MARK;
SDelay();
SDelay();
SCL=SPACE;
SDA=SPACE;
SDelay();
EA=1;
}
void SDelay(void) /* short delay,time about 6us */
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void DispInit(void)
{
SCL=MARK; /* stop condition */
SDelay();
SDA=MARK;
SDelay();
SDA=SPACE; /* start condition */
SDelay();
SCL=SPACE;
SDelay();
I2CWrite(0x70); /* slave address set */
I2CWrite(0xc8); /* set Large Lcd drive mode:mux(32 rows) M1M0=00
Display status: Normal E1E0=00;
System type: PCF8578 mixed mode T=1 */
I2CWrite(0x70); /* set display start bank is bank0 */
SCL=MARK; /* stop condition */
SDelay();
SDA=MARK;
SDelay();
SDA=SPACE; /* start condition */
SDelay();
SCL=SPACE;
SDelay();
I2CWrite(0x72); /* slave address set */
I2CWrite(0xc9); /* set Small Lcd drive mode:mux(32 rows) M1M0=00
Display status: Normal E1E0=00;
System type: PCF8578 mixed mode T=1 */
I2CWrite(0xf8);
I2CWrite(0x70); /* set display start bank is bank0 */
SCL=MARK; /* stop condition */
SDelay();
SDA=MARK;
SDelay();
} /* End function: DispInit() */
/********************************************************
*
* Function Name: DispClr()
* Function: Clear display
*
********************************************************/
void DispClr(void)
{
memset(aLargeBuf,'\0',20);
memset(aSmallBuf,'\0',5);
DispOut();
} /* End DispClr() */
/*********************************************************
*
* 函 数: DispNumber()
* 功 能: 在大、小显示器上显示电话号码及数据
* bType=1 点亮大显示器
* bType=0 点亮小显示器
*
*********************************************************/
void DispNum(bool fType)
{
byte i;
byte xdata aTemp[8];
byte xdata aTempSmall[5];
Page(5);
if(fType){
for(i=0;i<8;i++)
aTemp[i]=aLargeBuf[i]&0x08; // 记录大显示器上各标志位
memset(aLargeBuf,0,11);
if(pReadNumber>=10){
for(i=0;i<11;i++){
if((aNumBuf[pReadNumber-10+i]&0x0f)==0x0c)
break;
aLargeBuf[i]=aLCDSegment[(aNumBuf[pReadNumber-10+i]&0x0f)];
}
}
else{
for(i=0;i<=pReadNumber;i++){
if((aNumBuf[i]&0x0f)==0x0c)
break;
aLargeBuf[i]=aLCDSegment[aNumBuf[i]&0x0f];
}
}
for(i=0;i<8;i++)
aLargeBuf[i]|=aTemp[i]; // 恢复各标志位
}
else{
for(i=0;i<5;i++)
aTempSmall[i]=aSmallBuf[i]&0x08; // 记录小显示器上各标志位
memset(aSmallBuf,'\0',5);
if(pReadNumber>=4){ // Small Lcd
for(i=0;i<5;i++){
if((aNumBuf[pReadNumber-4+i]&0x0f)==0x0c)
break;
aSmallBuf[i]=aLCDSegment[(aNumBuf[pReadNumber-4+i]&0x0f)];
}
}
else{
for(i=0;i<=pReadNumber;i++)
aSmallBuf[i]=aLCDSegment[aNumBuf[i]&0x0f];
}
for(i=0;i<5;i++)
aSmallBuf[i]|=aTempSmall[i]; //记录大显示器上各标志位
}
DispOut();
}
/***********************************************************
*
* Function Name: DispTime()
* Function: 显示通话时间
* Input:
*
***********************************************************/
void DispTime(uint Time)
{
uint Hour;
byte aTemp[4],i;
for(i=0;i<4;i++)
aTemp[i]=aLargeBuf[i+11]&0x08;
Hour=Time/3600;
switch(Hour){
case 0:
aLargeBuf[6]&=0xf7;
aLargeBuf[7]&=0xf7;
aLargeBuf[5]&=0xf7;
aLargeBuf[4]&=0xf7;
break;
case 1:
aLargeBuf[6]|=0x08;
aLargeBuf[7]|=0x08;
aLargeBuf[5]&=0xf7;
aLargeBuf[4]&=0xf7;
break;
case 2:
aLargeBuf[6]|=0x08;
aLargeBuf[5]|=0x08;
aLargeBuf[4]|=0x08;
aLargeBuf[7]&=0xf7;
break;
case 3:
aLargeBuf[6]|=0x08;
aLargeBuf[5]|=0x08;
aLargeBuf[7]|=0x08;
aLargeBuf[4]&=0xf7;
break;
default:
break;
}
if(Hour!=0)
Hour=Time%3600;
else
Hour=Time;
aLargeBuf[14]=aLCDSegment[(Hour/60)/10];
aLargeBuf[13]=aLCDSegment[(Hour/60)%10];
aLargeBuf[12]=aLCDSegment[(Hour%60)/10];
aLargeBuf[11]=aLCDSegment[(Hour%60)%10];
for(i=0;i<4;i++)
aLargeBuf[i+11]|=aTemp[i];
DispOut();
}
/*****************************************************************
*
* Function Name: DispCharge()
* Function: 在大、小显示器上显示话费,
* Input: 话费及显示缓冲区地址
* Line=0 大显示器最顶上一行
* Line=1 大显示器最底下一行
* Line=2 小显示器
* Line=3 大显示器最顶上一行前头,用来显示通话次数
* //Line=4 大显示器最顶上一行后头,用来显示通讯命令
*
*
******************************************************************/
byte code DispAddrCode[10]={6,7,8,9,10,19,18,17,16,15};
void DispCharge(ulint bValue,byte bLine)
{
byte i,k=1,aTemp[5];
byte xdata aTerm[2];
aTerm[0]=aSmallBuf[0]&0x08;
aTerm[1]=aSmallBuf[1]&0x08;
memset(aTemp,'\0',5);
if(bValue>=10000){
k++;
aTemp[0]=aLCDSegment[(bValue/10000)%10];
}
if(bValue>=1000){
k++;
aTemp[1]=aLCDSegment[(bValue/1000)%10];
}
if(bValue>=100){
k++;
aTemp[2]=aLCDSegment[(bValue/100)%10];
}
if(bValue>=10){
k++;
aTemp[3]=aLCDSegment[(bValue/10)%10];
}
aTemp[4]=aLCDSegment[bValue%10];
if(bLine==3){
for(i=0;i<k;i++)
aLargeBuf[i]=aTemp[5-k+i];
return;
}
else{
if(k==1){ //小数点前加0
aTemp[3]=aTemp[2]=aLCDSegment[0];
}
if(k==2)
aTemp[2]=aLCDSegment[0];
for(i=0;i<5;i++){
if(bLine==2)
aSmallBuf[i]=aTemp[i]; //点亮小显示器
else
aLargeBuf[DispAddrCode[5*bLine+i]]=aTemp[i]; //点亮大显示器
}
}
if(bLine==0)
aLargeBuf[8]|=0x08;
if(bLine==1){
aLargeBuf[17]|=0x08; //显示小数点
aLargeBuf[0]|=0x08; //显示人民币符号
}
if(bLine==2){
aSmallBuf[0]|=aTerm[0];
aSmallBuf[1]|=aTerm[1];
aSmallBuf[2]|=0x08;
}
if(bValue>=100000){ //显示话费最高位
switch(bLine){
case 0:
aLargeBuf[5]=aLCDSegment[(bValue/100000)%10];
break;
case 1:
aLargeBuf[19]|=0x08;
break;
case 2:
aSmallBuf[3]|=0x08;
break;
case 3:
break;
}
}
DispOut();
}
/******************************************************
*
* Function Name: DispSymbol()
* Function: 显示各种符号。如:挂机、摘机、闪烁及锁机标志
* Input: 显示符号代码值
*
*
*******************************************************/
void DispSymbol(byte SymbolCode)
{
switch(SymbolCode){
case LARGE_PHONE:
aLargeBuf[1]|=0x08;
aLargeBuf[2]&=0xf7;
break;
case LARGE_UNPHONE:
aLargeBuf[1]&=0xf7;
break;
case LARGE_HOOK:
aLargeBuf[1]&=0xf7;
aLargeBuf[2]|=0x08;
break;
case LARGE_UNHOOK:
aLargeBuf[2]&=0xf7;
break;
case LARGE_FLASH:
aLargeBuf[3]|=0x08;
break;
case LARGE_UNFLASH:
aLargeBuf[3]&=0xf7;
break;
case LARGE_LOCK:
aLargeBuf[12]|=0x08;
break;
case LARGE_UNLOCK:
aLargeBuf[12]&=0xf7;
break;
case LARGE_HALFPRICE:
aSmallBuf[0]|=0x08;
aSmallBuf[1]&=0xf7;
aLargeBuf[13]|=0x08;
aLargeBuf[14]&=0xf7;
break;
case LARGE_ALLPRICE:
aSmallBuf[1]|=0x08;
aSmallBuf[0]&=0xf7;
aLargeBuf[14]|=0x08;
aLargeBuf[13]&=0xf7;
break;
case LARGE_COMM:
aLargeBuf[18]|=0x08;
break;
case LARGE_UNCOMM:
aLargeBuf[18]&=0xf7;
break;
case SMALL_COMM:
aSmallBuf[3]|=0x08;
break;
case SMALL_UNCOMM:
aSmallBuf[3]&=0xf7;
break;
case SMALL_HALFPRICE:
aSmallBuf[1]|=0x08;
aSmallBuf[0]&=0xf7;
break;
case SMALL_ALLPRICE:
aSmallBuf[0]|=0x08;
aSmallBuf[1]&=0xf7;
break;
default:
break;
}
DispOut();
}
void DispErrorCode(void)
{
byte i;
memset(aLargeBuf,0,20);
memset(aSmallBuf,0,5);
aLargeBuf[0]=0xf1;//E r r o r
aLargeBuf[1]=0x60;
aLargeBuf[2]=0x60;
aLargeBuf[3]=0xe4;
aLargeBuf[4]=0x60;
aLargeBuf[5]=0x20;
aLargeBuf[6]=aLCDSegment[bErrorCode>>4];
aLargeBuf[7]=aLCDSegment[bErrorCode&0x0f];
if(!fWorkMode){
for(i=3;i<6;i++)
aLargeBuf[i]=aLargeBuf[i+2];
aLargeBuf[6]=aLargeBuf[7]=0;
}
DispOut();
DelaySecond(3);
}
void DispCmd(byte bCode)
{
if(bStatusWord==S_SERVICE){
if((bCode&0xf0)!=0)
aLargeBuf[9]=aLCDSegment[bCode>>4];
else
aLargeBuf[9]=0;
aLargeBuf[10]=aLCDSegment[bCode&0x0f];
}
else{
if((bCode&0xf0)!=0)
aLargeBuf[12]=aLCDSegment[bCode>>4];
else
aLargeBuf[12]=0;
aLargeBuf[11]=aLCDSegment[bCode&0x0f];
}
DispOut();
}
void DispOK(byte bSpeakTime)
{
byte i;
aLargeBuf[0]='o';
aLargeBuf[1]='K';
memset(&aLargeBuf[2],0,18);
memset(aSmallBuf,0,5);
ConvertCode();
DispOut();
for(i=0;i<bSpeakTime;i++){
cbDelay5MS=8;
fDelay5MS=0;
Speaker(20);
while(!fDelay5MS)PCON=0x81;
cbDelay5MS=160;
fDelay5MS=0;
while(!fDelay5MS)PCON=0x81;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -