#include <reg52.h>
#include "absacc.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0 /*定义LCD模块数据端口*/
#define kaiguan_code XBYTE[0xBFFF] /*定义拨码开关的地址*/
#define Busy 0x80
#define IN1 XBYTE[0x7ff8] /*设置AD0809的通道0地址*/
#define IN2 XBYTE[0x7ff9]
#define IN3 XBYTE[0x7ffa]
#define IN4 XBYTE[0x7ffb]
#define IN5 XBYTE[0x7ffc]
#define IN6 XBYTE[0x7ffd]
#define IN7 XBYTE[0x7ffe]
#define IN8 XBYTE[0x7fff]
sbit RS=P2^3; /*定义LCD模块控制引脚*/
sbit RW=P2^4;
sbit E=P2^0;
sbit RD_0809=P3^7; //低电平有效
sbit WR_0809=P3^6; //低电平有效
sbit EOC=P3^2; //低电平有效
sbit ad_busy=P3^2; /*AD0809的EOC状态*/
sbit CS_0809=P2^7;
sbit CS_BOMAKG=P2^6;
sbit AD_busy=P3^2; /*AD0809的EOC状态*/
sbit LED1=P2^1;
sbit LED2=P2^2;
bit timeset_flag=0;
bit receive_PCflag=0;
bit end_flag=0;
code char wel[]="welcome :):)";
code char welcome[]="JiLin DaYuan Elec";
code char localID[]="ID:00 ";
code char ascii[16]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70}; //0-f ascii
idata uchar i_1,i_2,i_3,i_4,i_5,i_6,i_7,i_8;
idata uchar sa[60]=0;
uint nian=2008;
uchar yue=10;
uchar ri=1;
uchar shi=12;
uchar fen=58;
uchar miao=59;
uchar n1,n2,n3,n4;
uchar times=0;
uchar key=0;
uchar Ti=0;
void dlms(void);
uchar kbscan(void);
uchar key_value();
void key_handle();
void displayGB();
/**************************************************************************/
/*code struct screen
{
unsigned int x,y;
unsigned char Data1[20];
}; */
/*************************************************************************/
//函数名称:Delay5ms
//函数功能:短延时
/*************************************************************************/
void Delay5Ms(void)
{
uint i=200;
while(i--);
}
/*************************************************************************/
//函数名称:Delay25ms
//函数功能:长延时
/*************************************************************************/
void Delay25Ms(void)
{
uchar i=5;
uint j;
while(i--)
{
j=200;
while(j--);
}
}
void Delay1s(void)
{
uint j=200;
for(j=200;j>0;j--)
Delay5Ms();
}
/*************************************************************************/
//函数名称:WaitForEnable
//函数功能:在正常读写操作者之前检测LCD模块的忙状态
//其他说明:DB7=0:LCD控制器空闲;DB7=1:LCD控制器忙
/*************************************************************************/
void WaitForEnable(void)
{
DataPort=0xff;
RS=0;RW=1; //RS=1,数据寄存器,0:指令寄存器
_nop_();
E=1;
_nop_();_nop_();
while(DataPort & Busy);
E=0;
}
/*************************************************************************/
//函数名称:LcdWriteCommand
//函数功能:向LCD模块写入命令字符CMD;
//入口参数:CMD Attribc
//其他说明:若Attribc=1检测忙信号,若Attribc=0不检测忙信号
/*************************************************************************/
void LcdWriteCommand(uchar CMD,uchar Attribc)
{
if(Attribc) WaitForEnable();
RS=0;RW=0; _nop_();
DataPort=CMD;_nop_();
E=1;_nop_();_nop_();E=0;
}
/*************************************************************************/
//函数名称:LcdWriteData
//函数功能:向LCD模块写入数据
//入口参数:dataW
/*************************************************************************/
void LcdWriteData(char dataW)
{
WaitForEnable();
RS=1;
RW=0;
_nop_();
DataPort=dataW;
_nop_();
E=1;
_nop_();_nop_();
E=0;
}
/*************************************************************************/
//函数名称:LcdReset
//函数功能:LCD模块初始化
/*************************************************************************/
void LcdReset(void)
{
Delay5Ms();Delay5Ms();Delay5Ms();
LcdWriteCommand(0x38,1); //8位,4行,5×7
Delay5Ms();
LcdWriteCommand(0x01,1); // 清屏
Delay5Ms();
LcdWriteCommand(0x02,1);
LcdWriteCommand(0x06,1); //光标不移位
Delay5Ms();
LcdWriteCommand(0x0c,1); //开显示,光标关,字符不闪烁
Delay5Ms();
LcdWriteCommand(0x14,1); //光标不移位
Delay5Ms();
LcdWriteCommand(0x38,1);
Delay5Ms();
}
/*************************************************************************/
//函数名称:xy_ddram_addr
//函数功能:设置LCD上字符显示的位置
//入口参数:x(行) y(列)
/*************************************************************************/
void xy_ddram_addr(uchar x, uchar y)
{
uchar addr;
if(x==0) addr=y;
else if(x==1) addr=64+y;
else if(x==2) addr=20+y;
else if(x==3) addr=84+y;
LcdWriteCommand(addr+128,0); //设置DDRAM的指针
}
/************************************************************************/
//函数名称:display_one_char
//函数功能:在LCD上显示一个字符
//入口参数:x(行) y(列) num
//调用函数:xy_ddram_addr LcdWriteData
/************************************************************************/
void display_one_char(uchar x,uchar y,uchar num)
{
xy_ddram_addr(x, y);
Delay5Ms();
LcdWriteData(num);
Delay5Ms();
}
/***********************************************************************/
//函数名称:display_string
//函数功能:显示一行字符串
//调用函数:display_one_char
/***********************************************************************/
void display_string(uchar x,uchar y,uchar *p)
{
uchar i;
uchar len=0;
while((p[len]>31&&p[len]<128))
{len++;}
for(i=0;i<len;i++)
{
display_one_char(x,y,p[i]);
y++;
}
}
//--------------------------键盘程序------------------------------------//
/************************************************************************/
//函数名称:dlms
//函数功能:键盘10ms延时
/************************************************************************/
void dlms(void)
{
uchar i;
for(i=200;i>0;i--){}
}
/************************************************************************/
//函数名称:kbscan
//函数功能:键盘扫描
//出口参数:键码
/************************************************************************/
uchar kbscan(void)
{
uchar scode,recode;
P1=0xf8;
if((P1&0xf8)!=0xf8)
{
dlms();
if((P1&0xf8)!=0xf8)
{
scode=0xfe;
while((scode&0x08)!=0)
{
P1=scode;
if((P1&0xf8)!=0xf8)
{
recode=(P1&0xf0)|0x0f;
return ((~scode)+(~recode));
}
else
scode=(scode<<1)|0x01;
}
}
}
return(0);
}
/************************************************************************/
//函数名称:key_value
//函数功能:键值转换
//调用函数:kbscan
//出口参数:key
/************************************************************************/
//键值转换
uchar key_value()
{
uchar key,k;
k=kbscan();
switch(k)
{
case 0x41:key=0;break;
case 0x21:key=1;break;
case 0x11:key=2;break;
case 0x01:key=3;break;
case 0x42:key=4;break;
case 0x22:key=5;break;
case 0x12:key=6;break;
case 0x02:key=7;break;
case 0x44:key=8;break;
case 0x24:key=9;break;
case 0x14:key=10;break;
case 0x04:key=11;break;
default:key=12;
}
return key;
}
/***********************************************************************/
//函数名称:key_scan
//函数功能:处理按键抬起
//调用函数:key_value
//出口参数:s_key
/**********************************************************************/
unsigned char key_scan(void)
{
unsigned char s_key,temp;
s_key=key_value();
if(s_key!=12)
{
temp=s_key;
while(temp==s_key)
for(;temp!=12;)temp=key_value();
return(s_key);
}
}
/************************************************************************/
//函数名称:keyM
//出口参数:temp
//函数功能:可以键入多值
/************************************************************************/
int keyM()
{
int temp=0;
unsigned char key=0;
while(1)
{
key=key_scan();
if(key!=12)
if(11==key)break;
else temp