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