📄 bmushang_1大.c
字号:
#include <STC89C58RD+.H>
#include <absacc.h>
//外设绝对地址
#define lcddat XBYTE[0xffe0] //液晶数据口LCD
#define lcdrow XBYTE[0xffe1] //液晶指定行地址口
#define lcdcol XBYTE[0xffe2] //LCD指定列地址口
#define lcdcon XBYTE[0xffe3] //LCD指定config口
#define keyprt XBYTE[0xffe4]
#define data8251_1 XBYTE[0xffe8]
#define code8251_1 XBYTE[0xffe9]
#define data8251_2 XBYTE[0xffec]
#define code8251_2 XBYTE[0xffed]
//键值
#define keyup 8 //13
#define keydwn 4 //14
#define keylft 9 //9
#define keyrgh 5 //10
#define keytrue 2 //7
#define keyesc 14 //4
//数字和字母的ASCII
#define m0 0x10
#define m1 0x11
#define m2 0x12
#define m3 0x13
#define m4 0x14
#define m5 0x15
#define m6 0x16
#define m7 0x17
#define m8 0x18
#define m9 0x19
#define ma 0x21
#define mb 0x22
#define mc 0x23
#define md 0x24
#define me 0x25
#define mf 0x26
#define mg 0x27
#define mh 0x28
#define mi 0x29
#define mj 0x2a
#define mk 0x2b
#define ml 0x2c
#define mm 0x2d
#define mn 0x2e
#define mo 0x4f //小写2f
#define mp 0x30
#define mq 0x31
#define mr 0x32
#define ms 0x33
#define mt 0x34
#define mu 0x35
#define mv 0x36
#define mw 0x37
#define mx 0x38
#define my 0x39
#define mz 0x3a
#define msub 0x0d
#define madd 0x0b
#define mpoint 0x0e
#define m 0x00
#define mlbra 0x08 //(
#define mrbra 0x09 //)
#define mdao 0x2f
//#define m^c db 2,5,2,3ch,42h,42h,42h,66h ;41
#define mslash 0x0f // /
#define mstar 0x0a
#define mexclamation 0x01 //!
#define mcolon 0x1a //:
#define mquest 0x1f
#define m0not 0x80
#define m1not 0x81
#define m2not 0x82
#define m3not 0x83
#define m4not 0x84
#define m5not 0x85
#define m6not 0x86
#define m7not 0x87
#define m8not 0x88
#define m9not 0x89
unsigned int lcdx; //液晶显示的地址
//数据地址
unsigned char group; //对应存储在EEPROM
unsigned char batmax[5]; //对应存储在EEPROM
unsigned char temmax[5]; //对应存储在EEPROM
//数据
xdata unsigned int dcdata[120]; //电池电压120个*2字节
xdata unsigned long dctotal[2]; //电池总电压暂时分为2组的总电压
xdata unsigned int tdata[120]; //温度120个*2字节
xdata unsigned char tsign[120]; //温度符号
xdata unsigned int datai[5]; //电流1个*2字节
xdata unsigned char isign[5]; //电流符号
xdata unsigned char inputkg[5];
xdata unsigned char outputkg[5];
xdata unsigned char com1error[5]; //与各下位机通信错误次数
bit delayflag;//延时的标记
xdata unsigned char delaytime;//延时的时间
unsigned char jvhao_a,jvhao_b,jvhao_a1,jvhao_b1;//POWERCOM通讯板所采用的局号
xdata unsigned char jvhao_com;
xdata unsigned int jvhao_temp[5];
//各类告警值
xdata unsigned char analogalarm[120]; //模拟量告警的标志
//1上限告警
//2下限告警
//0正常
//1组0~47为单体电压、48总电压、49电流、50温度1、温度2
//2组+60
xdata unsigned char oldanalogalarm[120];
xdata unsigned char alarmrecord[80]; //告警记录/可记录10条/掉电失去
xdata unsigned int dcsinglehighalarm; //单体电池高告警
xdata unsigned int dcsinglelowalarm; //单体电池低告警
xdata unsigned int dctotalhighalarm; //总电压高告警
xdata unsigned int dctotallowalarm; //总电压低告警
xdata unsigned int ihighalarm; //电流高告警
xdata unsigned int thighalarm; //温度高告警
unsigned char jvhao; //局号
xdata unsigned char shezhi[4]; //密码
xdata unsigned char wram[0x10]; // _at_ 0x1ff0在设置中暂存用
xdata unsigned char contrast; //液晶对比度
//cpu脚
sbit a16=P1^0; //=0选择628128的前64K
sbit cs1=P1^1;
sbit cs2=P1^2; //CS1与CS2共同选择MAX5422(数字电位器),1302(时钟),9366(串行EEPROM),频率
sbit sclk=P1^3;
sbit out9366=P1^4; //9366(串行EEPROM)输出
sbit comsel2=P1^5; //COMSEL0,COMSEL1,COMSEL2作为89C58RD+通信口的扩展用
sbit comsel1=P1^6;
sbit comsel0=P1^7;
//P3^0通信接受RXD
//P3^1通信发送TXD
sbit muldat=P3^2; //对应MAX5422(数字电位器)输入,1302(时钟)输入与输出,9366(串行EEPROM)输入,频率
//P3^3第1块8251中断
sbit bell=P3^4;
sbit lamp=P3^5;
//P3^6写
//sbit WR=P3^6;
//P3^7读
//sbit RD=P3^7;
sbit backlight=P4^0;
sbit ds18b20data=P4^1;
//P4^2键盘中断
//P4^3第2块8251中断
//本机通信口COM:连放电仪
unsigned char xdata combuf[0xff],compos,comnum,sendbuf[120];
bit comsendflag; //对POWERCOM_485发送命令时为1
//8251_1第1通信口COM1:连下位机
xdata unsigned char com1buf[0x210],com1pos,com1num;
xdata unsigned char com1No,com1backno;
xdata unsigned char com1command,com1backcommand;
xdata unsigned int com1backcontent1,com1backcontent2;
xdata unsigned char com1tim;
bit enter1flag,send1flag;
//8251_2第2通信口COM2:连计算机
xdata unsigned char com2buf[0xff],com2pos,com2num,com2tim;
xdata unsigned char ;
bit enter2flag; //收到字符置1
//时间
bit secondflag; //1秒到的标志
unsigned char intervaltim; //与下位机通信的间隔时间,与几台下位机有关
unsigned char timnum,tim_backlight,timkey,beltim,ttime; //miao
unsigned char key;
bit readkey,key_backlight;
xdata unsigned char firststep; //第7页(设置时间)显示时=0,第1阶段结束时,置1
bit secondstep; //第7页第1阶段结束时=0,第2阶段结束时,置1
unsigned char lcdpg,oldpg,selcur,cursel,checip,errnum;
//18b20错误标志
bit error18b20;
//convert or read temperature
bit conv_rdt;
unsigned char time1302[8]; //16进制,从低到高:秒,分,时,日,月,星期,年,控制
unsigned char wd[2]; //wd[0]符号,wd[1]数据
unsigned char p2No; //目前正测模拟量的编号No,
xdata unsigned char p26page; //告警记录屏幕的页号
unsigned char xdata temp[40]; //设置用
unsigned char xdata ptemp; //temp的第几个位置
xdata unsigned char temporary[11]; //除中断外,所有程序用的暂时的字节
// ------ Check the LCD Status for Read/Write one data.
void lcdsta(void)
{ unsigned char i,j;
for(i=0;i<0x90;i++)
{ j=lcdcon;
j=(j & 0x03);
if(j==3) break;
}
}
//------ 液晶无参数命令
void pr0(unsigned char i)
{ lcdsta();
lcdcon=i;
}
//------ 液晶1参数命令
void pr1(unsigned char i,j)
{ lcdsta();
lcddat=i;
lcdsta();
lcdcon=j;
}
//------ 液晶2参数命令
void pr2(unsigned int i,unsigned char j)
{ unsigned char k;
lcdsta();
k=(i & 0xff);
lcddat=k; //lcdax.hl.l;
lcdsta();
k=(i>>8);
lcddat=k; //lcdax.hl.h;
lcdsta();
lcdcon=j; //lcdbh;
}
// ------ Check the LCD Status for Write No.x data.
void lcdtew(void)
{ unsigned char i,j;
for(i=0;i<0xf0;i++)
{ j=lcdcon;
j=(j & 0x08);
if(j!=0) break;
}
}
// ------ Set the LCD Address(R/W,Text)
//Input: lcdx==the position of r/w.
// lcdl (Col. No., 0-29)
// lcdh (Row No., 0-07)
void lcdtad(unsigned int addr)
{ unsigned int i;
i=addr;
i=i>>8;
i=i*30;
i=i+(addr & 0xff);
i=i+0x0800;
pr2(i,0x24);
}
// ------ Set the LCD Address(R/W,图形)
//input: lcdx==the position of r/w.
// lcdh (Row No., 0-07)
// lcdl (Col. No., 0-30)
unsigned int lcdgad(unsigned int addr)
{ unsigned int x;
x=(addr>>8);
x=x*240;
x=x+(addr & 0xff);
x=x+0x09e0;
pr2(x,0x24);
return(x);
}
unsigned char code cgram[]={
0xc7,0xbb,0xb3,0xab,0x9b,0xbb,0xc7,0xff, //0
0xef,0xcf,0xef,0xef,0xef,0xef,0xc7,0xff, //1
0xc7,0xbb,0xfb,0xf7,0xef,0xdf,0x83,0xff, //2
0x83,0xf7,0xef,0xf7,0xfb,0xbb,0xc7,0xff, //3
0xf7,0xe7,0xd7,0xb7,0x83,0xf7,0xf7,0xff, //4
0x83,0xbf,0x87,0xfb,0xfb,0xbb,0xc7,0xff, //5
0xe7,0xdf,0xbf,0x87,0xbb,0xbb,0xc7,0xff, //6
0x83,0xfb,0xf7,0xf7,0xef,0xef,0xef,0xff, //7
0xc7,0xbb,0xbb,0xc7,0xbb,0xbb,0xc7,0xff, //8
0xc7,0xbb,0xbb,0xc3,0xfb,0xf7,0xcf,0xff, //9
0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00, //叉
0x00,0x02,0x04,0x44,0x28,0x28,0x10,0x00 }; //钩
// ----- Initialize LCD config
//显示方式:逻辑“异或”合成;(B2,B1,B0) 000 or, 001 xor, 011 and;B3=0 CGROM, B3=1 CGRAM
void lcdini(void)
{ //unsigned char i; //,j
unsigned int x,y;
for(x=0;x<480;x++)//LCD初始化成为白屏幕
{ //由于行高位不能自动+1,所以
if (x<256)
{ lcdcon=0;
lcdrow=x;
}
else
{ lcdcon=4;
lcdrow=x-256;
}
lcdcol=0;
for(y=0;y<640;y++) lcddat=2;
}
/* pr0(0x81);
//CGRAM偏置地址0
pr2(0,0x22);
//地址指针
pr2(0x0400,0x24);
// for(i=0;i<96;i++) {
// j=cgram[i];
// pr1(j,0xc0);
// }
//自动写
pr0(0xb0);
//cgram内10个阴0-9,每个8字节,另外加'叉'和'钩'
for(i=0;i<96;i++) {
lcdsta();
lcddat=cgram[i];
}
//自动写结束
pr0(0xb2);
pr0(0x81);
//CGRAM偏置地址0
pr2(0,0x22);
//地址指针
pr2(0x0400,0x24);
//自动写
pr0(0xb0);
//cgram内10个阴0-9,每个8字节,另外加'叉'和'钩'
for(i=0;i<96;i++) {
lcdsta();
lcddat=cgram[i];
}
//自动写结束
pr0(0xb2);
//文本区首地址
pr2(0x0800,0x40);
//设置文本区宽度,大液晶16行,乘以30(每行)
pr2(30,0x41);
//图形区首地址
pr2(0x09e0,0x42);
//图形区宽度(字节数/行)
pr2(30,0x43);
//光标形状8*8
pr0(0xa7);
//显示开关
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -