📄 仪放_液晶.c
字号:
/*该程序是仪表放大器的数码管显示程序,
键盘功能如下:
1 2 3 4 5 6 7 8
9 0 + - set
#include <AT89X51.H>
static unsigned char dis_flag;
static unsigned char disbuffer[4];
static unsigned char xdata jianpan _at_ 0xa100;
static unsigned int step;
static unsigned char *pointer_buf;
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define DELAY 5
#define SCM XBYTE[0xa300]
#define SDA XBYTE[0xa301]
#define MCM XBYTE[0xa200]
#define MDA XBYTE[0xa201]
/***************************************************/
/*调用方式:void OutMI(uchar i)
/*函数说明:发指令i到主窗口
/*程序内函数,私有
/***************************************************/
void OutMI(uchar i)
{
uchar d;
d=DELAY;
while(d)d--;
MCM=i;
}
/***************************************************/
/*调用方式:void OutMD(uchar i)
/*函数说明:发数据i到主窗口
/*程序内函数,私有
/***************************************************/
void OutMD(uchar i)
{
uchar d=DELAY;
while(d)d--;
MDA=i;
}
/***************************************************/
/*调用方式:void OutSI(uchar i)
/*函数说明:发指令i到从窗口
/*程序内函数,私有
/***************************************************/
void OutSI(uchar i)
{
uchar d=DELAY;
while(d)d--;
SCM=i;
}
/***************************************************/
/*调用方式:void OutSD(uchar i)
/*函数说明:发数据i到从窗口。(内函数,私有,用户不直接调用)
/***************************************************/
void OutSD(uchar i)
{
uchar d=DELAY;
while(d)d--;
SDA=i;
}
/***************************************************/
/*调用方式:void LcdIni(void)
/*函数说明:12232点阵液晶初始化,开机后仅调用一次。
/***************************************************/
void LcdIni(void)
{
OutMI(0XE2);OutSI(0XE2);//复位
OutMI(0XAE);OutSI(0XAE);//POWER SAVE
OutMI(0XA4);OutSI(0XA4);//动态驱动
OutMI(0XA9);OutSI(0XA9);//1/32占空比
OutMI(0XA0);OutSI(0XA0);//时钟线输出
OutMI(0XEE);OutSI(0XEE);//写模式
OutMI(0X00);OutMI(0XC0);
OutSI(0X00);OutSI(0XC0);
OutMI(0XAF);OutSI(0XAF);
}
/***************************************************/
/*调用方式:void SetPage(uchar page0,uchar page1)
/*函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)
/***************************************************/
void SetPage(uchar page0,uchar page1)
{
OutMI(0xB8|page1);OutSI(0xB8|page0);
}
/***************************************************/
/*调用方式:void SetAddress(uchar address0,uchar address1)
/*函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
/***************************************************/
void SetAddress(uchar address0,uchar address1)
{
OutMI(address1&0x7F);OutSI(address0&0x7F);
}
/***************************************************/
/*调用方式:void PutCharS(uchar ch)
/*函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
/***************************************************/
void PutCharS(uchar ch)
{
OutSD(ch);
}
/***************************************************/
/*调用方式:void PutCharM(uchar ch)
/*函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
/***************************************************/
void PutCharM(uchar ch)
{
OutMD(ch);
}
/***************************************************/
/*uchar Inva(uchar) 1000 -> 0001
/*二进制数倒置
/***************************************************/
uchar Inva(uchar b)
{
uchar v1=0,v2=0;
uchar j1=0x80,j2=0x01;
char i;
for(i=7;i>=1;i=i-2)
{
v1=((b<<i)&j1)|v1;
v2=((b>>i)&j2)|v2;
j1=j1>>1;
j2=j2<<1;
}
return(v1|v2);
}
/***************************************************/
/*void DrawDw(char Xl,uchar width,uchar *bmp)
/***************************************************/
void DrawDw(char Xl,uchar width,uchar *bmp)
{
uchar addr,i=0;
bit window=0;
char x;
for(x=Xl;x>Xl-width;x--)
{
if (x<0) {window=1;addr=61+x;}
else addr=x;
SetPage(1,1);
SetAddress(addr,addr);
if (window) PutCharM(bmp[i]);
else PutCharS(bmp[i]);//画上层
i++;
SetPage(0,0);
SetAddress(addr,addr);
if (window) PutCharM(bmp[i]);
else PutCharS(bmp[i]);//画下层
i++;
}
}
/***************************************************/
/*void DrawUp(char Xl,uchar width,uchar *bmp)
/***************************************************/
void DrawUp(char Xl,uchar width,uchar *bmp)
{
uchar addr,i=0;
char x;
bit window=0;
for(x=Xl;x>Xl-width;x--)
{
if (x<0) {window=1;addr=61+x;}
else addr=x;
SetPage(2,2);
SetAddress(addr,addr);
if (window) PutCharM(Inva(bmp[i]));
else PutCharS(Inva(bmp[i]));//画上层
i++;
SetPage(3,3);
SetAddress(addr,addr);
if (window) PutCharM(Inva(bmp[i]));
else PutCharS(Inva(bmp[i]));//画下层
i++;
}
}
/***************************************************/
/*调用方式:void clrscr(void)
/*函数说明:清屏
/***************************************************/
void clrscr(void)
{
uchar i;
uchar page;
for (page=0;page<4;page++)
{
SetPage(page,page);
SetAddress(0,0);
for (i=0;i<61;i++){PutCharS(0);PutCharM(0);}
}
}
/***************************************************/
/* void OutCmd(uint addr,uchar m)
/*
/***************************************************/
//void OutCmd(uint addr,uchar m)
//{
// uchar i=DELAY;
// while(i--);
// XBYTE[addr]=m;
//}
/*************************************************/
/* */
/* */
/* 字模区 */
/* */
/*************************************************/
uchar code Start[]={
/*-- 文字: 放 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x10,0x1F,0x92,0x72,0x13,0x11,0x02,0x1C,0xF3,0x50,0x10,0x11,0x1E,0x10,0x00,
0x02,0x0C,0xF0,0x02,0x01,0xFE,0x00,0x02,0x04,0x08,0xD0,0x70,0x8C,0x06,0x04,0x00,
/*-- 文字: 大 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x04,0x04,0x04,0x04,0x04,0x04,0x05,0xFE,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
0x00,0x01,0x02,0x04,0x08,0x30,0xC0,0x00,0x80,0x60,0x10,0x0C,0x06,0x03,0x02,0x00,
/*-- 文字: 倍 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x04,0x08,0x3F,0xC0,0x21,0x31,0x2F,0xA5,0x61,0x23,0x3D,0x29,0x21,0x21,0x00,
0x00,0x00,0x00,0xFE,0x00,0x00,0x7E,0x44,0x44,0x44,0x44,0x44,0x7E,0x00,0x00,0x00,
/*-- 文字: 数 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x49,0x2A,0x1C,0xFF,0x1C,0x2A,0x4A,0x01,0x0F,0xF8,0x48,0x08,0x0F,0x08,0x00,
0x42,0x42,0x54,0x74,0xC8,0x58,0x64,0x40,0x02,0x04,0xC8,0x30,0xCC,0x06,0x04,0x00,
/*-- 文字: : --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
uchar code num[]={
/*-- 文字: 0 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xF0,0x08,0x04,0x04,0x08,0xF0,0x00,
/*-- 文字: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x08,0x08,0x1F,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,
/*-- 文字: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x0E,0x10,0x10,0x10,0x11,0x0E,0x00,0x00,0x0C,0x14,0x24,0x44,0x84,0x0C,0x00,
/*-- 文字: 3 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x0C,0x10,0x11,0x11,0x12,0x0C,0x00,0x00,0x18,0x04,0x04,0x04,0x88,0x70,0x00,
/*-- 文字: 4 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x03,0x04,0x08,0x1F,0x00,0x00,0x00,0xE0,0x20,0x24,0x24,0xFC,0x24,0x00,
/*-- 文字: 5 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x1F,0x10,0x11,0x11,0x10,0x10,0x00,0x00,0x98,0x84,0x04,0x04,0x88,0x70,0x00,
/*-- 文字: 6 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x07,0x08,0x11,0x11,0x18,0x00,0x00,0x00,0xF0,0x88,0x04,0x04,0x88,0x70,0x00,
/*-- 文字: 7 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x1C,0x10,0x10,0x13,0x1C,0x10,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,
/*-- 文字: 8 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x0E,0x11,0x10,0x10,0x11,0x0E,0x00,0x00,0x38,0x44,0x84,0x84,0x44,0x38,0x00,
/*-- 文字: 9 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0x00,0x8C,0x44,0x44,0x88,0xF0,0x00,
};
void down_display()
{
DrawDw(-8,8,num+disbuffer[0]*16);
DrawDw(0,8,num+disbuffer[1]*16);
DrawDw(8,8,num+disbuffer[2]*16);
DrawDw(16,8,num+disbuffer[3]*16);
}
/*************************************/
void delay(unsigned char x)
{
unsigned char i,j;
for(i=0;i<x;i++)
for(j=0;j<=1;j++)
{;};
}
/*************************************/
unsigned char get_key_num(void)
{
static unsigned char buff;
static unsigned char keynum;
keynum=0;
P1_6=0;
P1_7=1;
buff=jianpan; /**/
if(buff!=255)
{
keynum=buff;
delay(12);
P1_6=0;
P1_7=1;
buff=jianpan; /**/
if(buff==keynum)
{
do{buff=jianpan;}while(buff!=0xff); /**/
keynum=255-keynum;
goto aaa;
};
};
P1_6=1;
P1_7=0;
buff=jianpan; /**/
if(buff!=255)
{
keynum=buff;
delay(12);
P1_6=1;
P1_7=0;
buff=jianpan; /**/
if(buff==keynum)
{
do{buff=jianpan;}while(buff!=0xff); /**/
keynum=255-keynum+5;
goto aaa;
}
else
return 'e';
};
aaa:switch(keynum)
{ case 1:return 1;break;
case 2:return 2;break;
case 4:return 3;break;
case 8:return 4;break;
case 16:return 5;break;
case 32:return 6;break;
case 64:return 7;break;
case 128:return 8;break;
case 6:return 9;break;
case 7:return 0;break;
case 9:return '.';break;
case 13:return '+';break;
case 21:return '-';break;
case 37:return 'e';break;
case 69:return 'e';break;
case 133:return 's';break;
default: return 'e';
};
}
/*****************************************/
void step_increase()
{
if(disbuffer[3]==1)
disbuffer[3]=0;
if(disbuffer[0]>=9)
{
disbuffer[0]=0;
if(disbuffer[1]>=9)
{
disbuffer[1]=0;
if(disbuffer[2]>=9)
{
disbuffer[2]=0;
disbuffer[3]=1;
}
else
disbuffer[2]++;
}
else
disbuffer[1]++;
}
else disbuffer[0]++;
}
/*****************************************/
void step_decrease()
{
if(disbuffer[0]==0)
{
disbuffer[0]=9;
if(disbuffer[1]==0)
{
disbuffer[1]=9;
if(disbuffer[2]==0)
{disbuffer[2]=9;
disbuffer[3]=0;}
else
disbuffer[2]--;
}
else
disbuffer[1]--;
}
else disbuffer[0]--;
}
/******************************************/
void reset()
{
unsigned int x;
pointer_buf=disbuffer;
step=disbuffer[0]+10*disbuffer[1]+100*disbuffer[2]+1000*disbuffer[3];
if(step>=0&&step<10)
{
x=4095*step/10;
P0_0=x^0;
P0_1=x^1;
P0_2=x^2;
P0_3=x^3;
P0_4=x^4;
P0_5=x^5;
P0_6=x^6;
P0_7=x^7;
P1_0=1;
delay(10);
P1=0x00;
P0_0=x^8;
P0_1=x^9;
P0_2=x^10;
P0_3=x^11;
P0_4=1; /*此处是用第二个373的第四个管脚来控制1倍的量程*/
P0_5=0;
P0_6=0; /*如果此处发生中断,可能出错*/
P0_7=0;
P1_1=1;
delay(10);
P1=0x00;
}
else if(step>=10&&step<100)
{
x=4095*step/100;
P0_0=x^0;
P0_1=x^1;
P0_2=x^2;
P0_3=x^3;
P0_4=x^4;
P0_5=x^5;
P0_6=x^6;
P0_7=x^7;
P1_0=1;
delay(10);
P1=0x00;
P0_0=x^8;
P0_1=x^9;
P0_2=x^10;
P0_3=x^11;
P0_4=0; /*此处是用第二个373的第五个管脚来控制1倍的量程*/
P0_5=1;
P0_6=0; /*如果此处发生中断,可能出错*/
P0_7=0;
P1_1=1;
delay(10);
P1=0x00;
}
else if(step>=100&&step<=1000)
{
x=4095*step/1000;
P0_0=x^0;
P0_1=x^1;
P0_2=x^2;
P0_3=x^3;
P0_4=x^4;
P0_5=x^5;
P0_6=x^6;
P0_7=x^7;
P1_0=1;
delay(10);
P1=0x00;
P0_0=x^8;
P0_1=x^9;
P0_2=x^10;
P0_3=x^11;
P0_4=1; /*此处是用第二个373的第六个管脚来控制1倍的量程*/
P0_5=0;
P0_6=0; /*如果此处发生中断,可能出错*/
P0_7=0;
P1_1=1;
delay(10);
P1=0x00;
}
delay(255);
}
/*****************************************/
void set_num()
{
unsigned char j,m;
disbuffer[0]=0;
disbuffer[1]=0;
disbuffer[2]=0;
disbuffer[3]=0;
pointer_buf=disbuffer+2;
m=0;
while(1)
{
j=get_key_num();
if(j>=0&&j<=9)
{
m++;
if(m>3)
{
goto aaa;
}
else
{
*pointer_buf=j;
down_display();
pointer_buf--;
}
}
else if(j=='s')
{
down_display();
reset();
return;
}
}
aaa:
while(1)
{
j=get_key_num();
if(j=='s')
{down_display();reset();return;}
}
}
/****************************************
void timer0_isr(void) interrupt 1 using 1
{
TR0=0;
TH0=0xf0;
TL0=0x5f;
down_display();
TR0=1;
} */
/*****************************************/
void main()
{
static unsigned char i;
P1=0x00;
LcdIni(); //初始显示
clrscr();
DrawUp(64,80,Start);
DrawDw(16,32,Start+160);
pointer_buf=disbuffer;
while(1)
{
i=get_key_num();
if(i=='s')
{
set_num();}
else if(i=='+')
{step_increase();
down_display();
reset();
}
else if(i=='-')
{step_decrease();
down_display();
reset();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -