📄 main.c
字号:
#include <reg52.h>
#include "absacc.h"
#include <math.h>
#include<intrins.h>
#define mode 0x9b
#include "ziku.h"
#define uchar unsigned char
#define uint unsigned int
#define AP 0x2a
#define LENGTH 250 //波形区域宽度
#define WIDTH 200 //波形区域高度
sbit a0=P2^0;
xdata unsigned char PortA _at_ 0xc000;
xdata unsigned char PortB _at_ 0xc001;
xdata unsigned char PortC _at_ 0xc002;
xdata unsigned char CAddr _at_ 0xc003;
//sbit cs=P1^3;
sbit cs1=P2^5;
sbit cs2=P2^6;
sbit cs3=P2^7;
sbit rst=P1^4;
sbit wr=P3^6;
sbit rd=P3^7;
sbit alarm=P1^0;
/*****************************/
unsigned char bdata d[3];
uchar code sys[8]={0x30,0x87,0x07,0x27,0x7a,0xef,0x2a,0}; /*P1-P8*/
uchar code scr[10]={0,0,0xef,0x00,0x28,0xef,0x00,0x50,0,0}; /*P1-P10*/
uchar code arr[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar gprsflag=0;
uchar code at1[3]={'A','T',0X0D};
uchar code at2[10]={'A','T','+','C','M','G','F','=','1',0x0d};
uchar code at3[22]={'A','T','+','C','M','G','S','=','"','1','3',
'0','1','3','7','0','8','0','5','1','"',0x0d};
uchar code at4[14]={'w','a','t','e','r',' ','w','a','r','n','i','n','g','!'};
uchar yangda[3];
//函数定义
void outcode(uchar code_data);
void outdata(uchar data_data);
uchar indata(void);
void turnoff(void);
void turnon(void);
void initram(void);
void init(void);
void fixline(int y);
void fixline2(int x);
void WriteD(uchar x,uchar y);
void delay(uchar di);
void showchinese32(int addr,uchar *chin);
void drawtable();
void shownumber(int addr,uchar number);
void shownumber16(int addr,uchar number);
void warn0(uchar canghao[4],j);
void count(uchar canghao[],uchar*p);
void countgprs(uchar yangda[3],uchar canghao[],uchar*p);
void sendnum(void);
void xszc() ;
void warn3(uchar canghao[],uchar j);
void kaiji();
void outcode(uchar code_data)//输出指令代码
{// cs=0;
cs1=1;
cs2=0;
cs3=1;
a0=1;
rd=1;
P0=code_data;
wr=0;
wr=1;
//cs=1;
cs1=0;
cs2=0;
cs3=1;
}
void outdata(uchar data_data){//输出指令参数
a0=0;
// cs=0;
cs1=1;
cs2=0;
cs3=1 ;
P0=data_data;
wr=0;
wr=1;
//cs=1;
cs1=0;
cs2=0;
cs3=1;
}
uchar indata(void){//输出指令参数
uchar data_data;
a0=1;
// cs=0;
cs1=1;
cs2=0;
cs3=1 ;
P0=0xff;
wr=1;
rd=0;
data_data=P0;
rd=1;
// cs=1;
cs1=0;
cs2=0;
cs3=1;
return data_data;
}
void delay(uint di) //延时子程序
{ uint k;
for(;di!=0;di--)
{
for(k=0;k<1000;k++);
}
}
void WriteD(uchar x,uchar y) //write a dot on the 1nd layer
{
unsigned int address;
uchar addh,addl;
uchar m=0,n;
address=0x01f9+x/8+y*AP;
addh=address/256;
addl=address%256;
n=x%8;
outcode(0x46);
outdata(addl);
outdata(addh);
outcode(0x43);
m=indata();
m=m|arr[n];
outcode(0x46);
outdata(addl);
outdata(addh);
outcode(0x42);
outdata(m);
}
void turnoff(void){
outcode(0x58);//off screen
outdata(0x00);
}
void turnon(void){
outcode(0x59);//on screen
outdata(0x55);
}
void initram(void){//显示存储器清零
unsigned int i;
outcode(0x4c);
outcode(0x46);
outdata(0x00);
outdata(0x00);
outcode(0x42);//clear screen memory
for(i=0;i<=0x7800;i++){outdata(0x00);}//32767
}
void init(void){//初始化程序
int n;
outcode(0x40); /*SYSTEM SET 指令代码*/
for(n=0;n<8;n++)outdata(sys[n]); /*将参数P1-P8 写入*/
outcode(0x44); /*SCROLL 指令代码*/
for(n=0;n<10;n++)outdata(scr[n]); /*将参数P1-P10 写入*/
outcode(0x5a); /*HDOT SCR——P1 清零复位*/
outdata(0);
outcode(0x5b); /*OVLAY—*/
outdata(0x1c);
}
void fixline(int y) //在第二层画水平直线 0-240)
{
unsigned int address;
uchar addh,addl;
uchar i;
address=y;
addh=address/256;
addl=address%256;
outcode(0x46);
outdata(addl);
outdata(addh);
outcode(0x4c);
outcode(0x42);
outdata(0x1f);
for(i=0;i<39;i++)outdata(0xff);
}
void fixline2(int x) //x(1-40)
{
unsigned int address;
uchar addh,addl;
uchar i;
address=x;
for(i=0;i<160;i++)
{ addh=address/256;
addl=address%256;
outcode(0x46);
outdata(addl);
outdata(addh);
outcode(0x4c);
outcode(0x42);
outdata(0x18);
address+=42;
}
}
void initall(void){ //初始化
turnoff();
init();
turnon();
initram();
}
void showchinese32(int addr,uchar *chin)
//功能:在x,y位置处,显示字符码为chin
//x坐标寄存器(字节),y坐标寄存器(点行)
{
int temp1;
uchar hi,lo,*temp2;
uchar b,c=0;
//d=y;
temp2=chin;
temp1=addr;
outcode(0x4c);
for(b=0;b<32;b++){
//0x51f9,5218,2a18
hi=temp1/256;
lo=temp1%256;
outcode(0x46);
outdata(lo);
outdata(hi);
outcode(0x42);
outdata(temp2[c++]);
outdata(temp2[c++]);
outdata(temp2[c++]);
outdata(temp2[c++]);
temp1+=AP;// d=d+1;
}
}
void shownumber(int addr,uchar number)
//功能:在x,y位置处,显示字符码为chin
//x坐标寄存器(字节),y坐标寄存器(点行)
{
int temp1;
uchar hi,lo;
uchar b;
//d=y;
temp1=addr;
outcode(0x4c);
for(b=0;b<16;b++){
//0x51f9,5218,2a18
hi=temp1/256;
lo=temp1%256;
outcode(0x46);
outdata(lo);
outdata(hi);
outcode(0x42);
outdata(num[16*number+b]);
temp1+=AP;// d=d+1;
}
}
void shownumber16(int addr,uchar number16)
//功能:在x,y位置处,显示字符码为chin
//x坐标寄存器(字节),y坐标寄存器(点行)
{
int temp1,c=0;
uchar hi,lo;
uchar b;
//d=y;
c=64*number16;
temp1=addr;
outcode(0x4c);
for(b=0;b<32;b++){
//0x51f9,5218,2a18
hi=temp1/256;
lo=temp1%256;
outcode(0x46);
outdata(lo);
outdata(hi);
outcode(0x42);
outdata(num16[c++]);
outdata(num16[c++]);
temp1+=AP;// d=d+1;
}
}
void drawtable()
{ uchar i;
for(i=0;i<9;i++)
fixline2(2184+i*5);
for(i=0;i<5;i++)
fixline(2184+i*1680);
}
void warn3(uchar canghao[],uchar j)
{ uchar i,temp[2];
initram();
drawtable();
showchinese32(345,shui);
showchinese32(349,wei);
showchinese32(353,yi);
showchinese32(357,chang);
showchinese32(361,cang);
showchinese32(365,wei);
for(i=0;i<j;i++)
{ temp[0]=(canghao[i]-1)/8;
temp[1]=(canghao[i]-1)%8;
shownumber16(2353+1680*temp[0]+temp[1]*5,temp[0]);
shownumber16(2355+1680*temp[0]+temp[1]*5,temp[1]);
}
}
void xszc() //显示正常画面
{ initram();
showchinese32(1852,chuan);
showchinese32(1856,cang);
showchinese32(1860,jin);
showchinese32(1864,shui);
showchinese32(1868,jian);
showchinese32(1872,ce);
showchinese32(1876,xi);
showchinese32(1880,tong);
showchinese32(3872,shui);
showchinese32(3879,wei);
showchinese32(3886,zheng);
showchinese32(3893,chang);
shownumber16(6441,10);
shownumber16(6443,10);
shownumber16(6445,10);
shownumber16(6447,15);
shownumber16(6449,13);
shownumber16(6451,14);
shownumber16(6453,8);
shownumber16(6455,8);
shownumber16(6457,15);
shownumber16(6459,11);
shownumber16(6461,12);
}
void warn0(uchar canghao[],j)
{uint addr;
uchar i,temp;
addr=2524;
initram();
showchinese32(350,jing);
showchinese32(358,gao);
for (i=0;i<j;i++)
{ temp=canghao[i]/10;
shownumber16(addr,temp);
temp=canghao[i]%10;
shownumber16(addr+2,temp);
showchinese32(addr+4,hao);
showchinese32(addr+8,chuan);
showchinese32(addr+12,cang);
showchinese32(addr+16,shui);
showchinese32(addr+20,wei);
showchinese32(addr+24,yi);
showchinese32(addr+28,chang);
if(i==0)
addr+=1848;
else addr+=1680;
_nop_(); _nop_();
_nop_(); _nop_();
}
}
/********************************/
/*键盘扫描?*
/********************************/
uchar kbscan(void)
{uchar t,temp=0;
if((P1&0x0e)!=0x0e)
{delay(5);
if((P1&0x0e)!=0x0e)
{t=P1&0x0e;
switch (t)
{case 0x0c:temp=1;break;
case 0x0a:temp=2;break;
//case 0x06:temp=3;break;
default : break;
}
}
}
return(temp);
}
/***************************************************
rs232
****************************************************/
/****RS232初始化***************/
void init232(void)
{ TMOD=0x21;
PCON=0x80;
TH0=100;
TL0=50;
TH1=250;
TL1=250; //波特率为1200
//当TH1=244时为2400,当TH1=250时为4800,
//当TH1=253时为9600
TR1=1;
TR0=1;
ET0=1;
SCON=0x50;
}
/****RS232发送数据****/
void send232(uchar *p , uchar num)
{
uchar i;//,temp;,count=0;
EA=0;//关中断防止进入中断服务程序
for(i=0;i<num;i++)
{ SBUF= *(p+i) ; //发送数据
while(TI!=1);
TI=0;
}
EA=1;
}
/*********************************************/
void send(uchar num)
{ EA=0;
SBUF=num;
while(TI==0);
TI=0;
EA=1;
}
/******************************************
GPRS
******************************************/
void gprs(void) interrupt 1
{
TH0=10;
TL0=100;
switch(gprsflag++)
{case 0: send232(at1,3);break;
case 6: send232(at2,10);break;
case 20:send232(at3,22);break;
case 40:sendnum();gprsflag=0;EA=0; break;
//case 70:gprsflag=0;break;
default:break;
}
}
/********************************************/
void sendnum(void)
{uchar i, k,canghao[24],j,temp[2],t;
countgprs(yangda,canghao,&j);
send232(at4,14);
for(i=0;i<j;i++)
{ temp[0]=canghao[i]/10;
temp[1]=canghao[i]%10;
for(k=0;k<2;k++)
if(temp[k]!=0)
{t=temp[k]+0x30;
send(t);
}
t=' ';
send(t);
}
t=0x1a;
send(t);
}
/***********************************************/
void kaiji()
{
initram();
showchinese32(2026,huan);
showchinese32(2031,ying);
showchinese32(2036,shi);
showchinese32(2041,yong);
showchinese32(4039,qian);
showchinese32(4043,jing2);
showchinese32(4047,dian);
showchinese32(4051,zi);
showchinese32(4055,ji);
showchinese32(4059,shu);
shownumber16(6441,10);
shownumber16(6443,10);
shownumber16(6445,10);
shownumber16(6447,15);
shownumber16(6449,13);
shownumber16(6451,14);
shownumber16(6453,8);
shownumber16(6455,8);
shownumber16(6457,15);
shownumber16(6459,11);
shownumber16(6461,12);
delay(1000);
}
/**************************************************
计算舱号
***********************************************/
void count(uchar canghao[],uchar*p)
{uchar k,i,j;
j=0;
for(k=0;k<3;k++)
{for (i=0;i<8;i++)
{if ((d[k]>>i)&0x01)
canghao[j++]=i+1+8*k;
}
}
*p=j;
}
/*******************************************/
void countgprs(uchar yangda[3],uchar canghao[],uchar*p)
{uchar k,i,j;
j=0;
for(k=0;k<3;k++)
{for (i=0;i<8;i++)
{if ((yangda[k]>>i)&0x01)
canghao[j++]=i+1+8*k;
}
}
*p=j;
}
/**********************************************/
void main()
{ uchar k,j=0,f[3]={0} ;
uchar canghao[24]={0};
bit alarmflag0=0,alarmflag1=0;
init232();
alarm=0;
initall();
kaiji();
CAddr=mode ;
xszc();
while(1)
{ d[0]=PortC;d[1]=PortA;d[2]=0xff;
d[0]=d[0]^0xff;d[1]=d[1]^0xff; d[2]=d[2]^0xff;
if((d[0]==f[0])&&(d[1]==f[1])&&(d[2]==f[2]));
else
{
f[0]=d[0];f[1]=d[1];f[2]=d[2];
count(canghao,&j);
if(j==0) xszc();
else{
if(j<5) warn0(canghao,j);
else warn3(canghao,j);
yangda[0]=d[0];yangda[1]=d[1];yangda[2]=d[2];
EA=1;
}
}
if(alarmflag1==0)
{
if(j==0) alarmflag0=0,alarm=0;
if(j>0)
if(alarmflag0==0) alarm=1;
}
k=kbscan();
switch (k)
{case 1:alarmflag1=alarmflag1^1;alarm=~alarm;delay(200);break;
case 2: alarmflag0=1; alarm=0;break;
default : break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -