📄 mypro.c
字号:
ET0 = 0; //关定时器0中断
EX0 = 0; //关外部中断0
EX1 = 0; //关外部中断1
IT0 = 0; //外部中断0低电平触发,故障报警
IT1 = 1; //外部中断1下降沿触发,1mA电流到
PX1 = 1; //中断优先级顺序:外部中断0(故障)→外部中断1(1mA到)→定时器0(时间电量)
PX0 = 1;
TMOD = 0x01; //定时器0定时方式1
TH0 = 0xdc; //定时器0置初值
TL0 = 0x00;
TR0 = 1; //启动定时器0
lcd_init() ; //液晶屏初始化,清屏
diyiping(); //产品信息显示
do //等待确定键被按下
{key=namekey();} //扫描键盘,确定键被按下进入主菜单,否则等待
while(key!=7);
lcd_init() ; //清屏
dierping(); //主菜单
while(1);
}
void delay1ms(uint ui) /* 延时函数,晶振为11.0592m*/
{
uint i,z,j;
for ( j=0; j< ui; j++)
for ( i=0; i < 2 ; i++ )
for ( z=0; z <100; z++);
}
/*************************************************************************
液晶屏初始化,清屏等底层程序
1、忙判别——lcd_busy(void);2、设置xy——set_xy(uchar x,uchar y)
3、写显示数据——lw(uchar x,uchar y,uchar dd);4、显示初始化——lcd_init()
*************************************************************************/
/*忙判别*/
void lcd_busy(void)
{
di=0;rw=1;P0=0xff;
while (1)
{
en=1;
if (P0<0x80) break;
en=0;
}
en=0;
}
/*设置xy*/
void set_xy(uchar x,uchar y)
{ y=y%192;
if (y<64)
{
cs1=0;
cs2=1;
cs3=1;
}
else if(y<128)
{
cs1=1;
cs2=0;
cs3=1;
}
else
{
cs1=1;
cs2=1;
cs3=0;
}
lcd_busy();
di=0;
rw=0;
P0=0xb8|x; //设置页地址
en=1;
en=0;
lcd_busy();
di=0;
rw=0;
y=y%64;
P0=0x40|y; //设置列地址
en=1;
en=0;
P0=0xff;
}
/*写显示数据*/
void lw(uchar x,uchar y,uchar dd)
{
set_xy(x,y);
lcd_busy();
di=1;
rw=0;
P0=dd;
en=1;
en=0;
P0=0xff;
}
/*显示初始化*/
void lcd_init()
{
uchar x,y;
en=0;
di=0;
rw=0;
cs1=1;
cs2=1;
cs3=1;
cs1=0; //开左屏显示
P0=0x3f;
en=1;
en=0;
cs1=1; //开中屏显示
cs2=0;
cs3=1;
en=1;
P0=0x3f;
en=0;
cs1=1; //开右屏显示
cs2=1;
cs3=0;
en=1;
P0=0x3f;
en=0;
cs1=0; //设置左半屏起始行为0行
cs2=1;
cs3=1;
lcd_busy();
di=0;
rw=0;
P0=0xc0;
en=1;
en=0;
cs1=1; //设置中屏起始行为0行
cs2=0;
cs3=1;
lcd_busy();
di=0;
rw=0;
P0=0xc0;
en=1;
en=0;
cs1=1; //设置右半屏起始行为0行
cs2=1;
cs3=0;
lcd_busy();
di=0;
rw=0;
P0=0xc0;
en=1;
en=0;
for (x=0;x<8;x++) //全屏清零
{
for (y=0;y<192;y++)
lw(x,y,0x00);
}
}
/****************************************************************************************
显示底层程序:显示16*16点阵汉字、8*16点阵字符、8*8小字符、16*8点阵图形
***********************************************************************************/
//显示汉字,fb==1:反白显示,16*16点阵
void dh(uchar x,uchar y,uchar n,uchar fb)
{
uchar i,bb,dd;
for (bb=0;bb<2;bb++)
{
for (i=0;i<16;i++)
{
dd=hz[i+16*bb+n*32];
if (fb)
dd=~dd;
lw(x,y,dd);
y=y++;
}
x=x++;
y=y-16;
}
}
//显示字符,fb==1:反白显示,8*16点阵
void df(unsigned char x,unsigned char y,unsigned char n,unsigned char fb)
{
unsigned char i,bb,dd;
for (bb=0;bb<2;bb++)
{
for (i=0;i<8;i++)
{
dd=zf[i+8*bb+n*16];
if (fb)
dd=~dd;
lw(x,y,dd);
y=y++;
}
x=x++;
y=y-8;
}
}
//8*8点阵显示,fb==1:反白显示
void dxz(uchar x,uchar y,uchar n,uchar fb)
{
unsigned char i,bb,dd;
for (bb=0;bb<1;bb++)
{
for (i=0;i<8;i++)
{
dd=xz[i+8*bb+n*8];
if (fb)
dd=~dd;
lw(x,y,dd);
y=y++;
}
x=x++;
y=y-8;
}
}
//16*8 电池图形点阵,fb==1:反白显示
void dtx(uchar x,uchar y,uchar n,uchar fb)
{
unsigned char i,bb,dd;
for (bb=0;bb<1;bb++)
{
for (i=0;i<16;i++)
{
dd=tu[i+16*bb+n*16];
if (fb)
dd=~dd;
lw(x,y,dd);
y=y++;
}
x=x++;
y=y-8;
}
}
//第一屏,产品厂家信息:欢迎使用氧化锌避雷器测试仪扬州市科发电气有限公司
void diyiping()
{
dh(0,52,0,0);
dh(0,76,1,0);
dh(0,100,2,0);
dh(0,124,3,0);
dh(3,24,4,0);
dh(3,40,5,0);
dh(3,56,6,0);
dh(3,72,7,0);
dh(3,88,8,0);
dh(3,104,9,0);
dh(3,120,10,0);
dh(3,136,11,0);
dh(3,152,12,0);
dh(6,8,13,0);
dh(6,24,14,0);
dh(6,40,15,0);
dh(6,56,16,0);
dh(6,72,17,0);
dh(6,88,18,0);
dh(6,104,19,0);
dh(6,120,20,0);
dh(6,136,21,0);
dh(6,152,22,0);
dh(6,168,23,0);
}
//读键值
uchar namekey(void)
{
uchar SW;
uchar KK ;
bit flag;
flag=IRcvByte(0x40,&SW);//读pcf8574数据
if ( (SW&0xff)!=0xff) //如果无键按下,则返回键值0
{
delay1ms (10) ; //按键延时10ms
flag=IRcvByte(0x40,&SW);//读pcf8574数据
if ( (SW&0xff)!=0xff) //如果判断无键,则为误抖动,返回0
{
KK = SW;
do( flag=IRcvByte(0x40,&SW));//读pcf8574数据
while ( (SW&0xff)!=0xff); //等键释放
KK = KK & 0xff ;
switch(KK)
{
case 0xfe:return(1);break; //上
case 0xfd:return(2);break; //下
case 0xfb:return(3);break; //右
case 0xf7:return(4);break; //返回
case 0xef:return(5);break; //存储
case 0xdf:return(6);break; //打印
case 0xbf:return(7);break; //确定
}
}
}
return (0);
}
// 第二屏,主菜单显示
void dierping() //主菜单
{
uchar key = 0;
EA=1; //开定时器0中断
ET0=1;
battery(); //显示电池电量
time(); //显示实时时间
dh(2,52,10,1); //反白显示,“测试”
dh(2,68,32,1);
dh(2,84,32,1);
dh(2,100,32,1);
dh(2,108,32,1);
dh(2,124,11,1);
dh(4,52,24,0); //历史数据
dh(4,76,25,0);
dh(4,100,26,0);
dh(4,124,27,0);
dh(6,52,28,0); //时钟设置
dh(6,76,29,0);
dh(6,100,30,0);
dh(6,124,31,0);
//扫描键盘,判断下一步操作
smkey:
do //等待有键被按下
{
key=namekey();
}
while(!key); //key=0,表示无键按下,继续扫描键盘
key_chuli_1(key); //有键被按下,转键盘处理1
goto smkey;
}
//主菜单下读取键值1(上)、2(下)、7(确定键)
void key_chuli_1(uchar key) //按键处理1,键值为3、4、5、6均不起作用
{
switch(key)
{
case 1: if( KeyCount > 0 )
KeyCount--;
else
KeyCount = 2;
program_1(); break; //光标上移
case 2: if( KeyCount < 2 )
KeyCount++;
else
KeyCount = 0;
program_1();
break; //光标下移
case 7:program_7(); break; //确定
}
}
//主菜单上下键处理程序
void program_1()
{
lcd_init() ; //清上一屏
ET0=1; //开定时器0,显示时间、电量
battery(); //显示电池电量
time(); //显示实时时间
if ( KeyCount == 0 )
{
//反白显示,测试
dh(2,52,10,1);
dh(2,68,32,1);
dh(2,84,32,1);
dh(2,100,32,1);
dh(2,108,32,1);
dh(2,124,11,1);
dh(4,52,24,0); //历史数据
dh(4,68,32,0);
dh(4,76,25,0);
dh(4,92,32,0);
dh(4,100,26,0);
dh(4,116,32,0);
dh(4,124,27,0);
dh(6,52,28,0); //时钟设置
dh(6,68,32,0);
dh(6,76,29,0);
dh(6,92,32,0);
dh(6,100,30,0);
dh(6,116,32,0);
dh(6,124,31,0);
}
if ( KeyCount == 1 )
{
dh(4,52,24,1); //反显历史数据
dh(4,68,32,1);
dh(4,76,25,1);
dh(4,92,32,1);
dh(4,100,26,1);
dh(4,116,32,1);
dh(4,124,27,1);
// 测试
dh(2,52,10,0);
dh(2,68,32,0);
dh(2,84,32,0);
dh(2,100,32,0);
dh(2,108,32,0);
dh(2,124,11,0);
dh(6,52,28,0); //时钟设置
dh(6,68,32,0);
dh(6,76,29,0);
dh(6,92,32,0);
dh(6,100,30,0);
dh(6,116,32,0);
dh(6,124,31,0);
}
if ( KeyCount == 2 )
{
dh(6,52,28,1); //反显时钟设置
dh(6,68,32,1);
dh(6,76,29,1);
dh(6,92,32,1);
dh(6,100,30,1);
dh(6,116,32,1);
dh(6,124,31,1);
dh(4,52,24,0); //历史数据
dh(4,68,32,0);
dh(4,76,25,0);
dh(4,92,32,0);
dh(4,100,26,0);
dh(4,116,32,0);
dh(4,124,27,0);
// 测试
dh(2,52,10,0);
dh(2,68,32,0);
dh(2,84,32,0);
dh(2,100,32,0);
dh(2,108,32,0);
dh(2,124,11,0);
}
}
//主菜单下按确定键处理程序
void program_7()
{
switch(KeyCount)
{
case 0: test(); break;//启动进入测试程序
case 1: history(); break;//进入历史查询
case 2:
Dis_settime(); //进入时钟设置
time_mod(); //修改时间函数
break;
}
}
void Dis_settime() //进入时钟设置
{
lcd_init() ; //清上一屏
ET0=0; //关定时器0,不显示时间、电量
dh(0,52,28,0); //显示"时 钟 设 置"标题
dh(0,68,32,0);
dh(0,76,29,0);
dh(0,92,32,0);
dh(0,100,30,0);
dh(0,116,32,0);
dh(0,124,31,0);
disset(); //显示设定前初始值
}
//显示设定前初始值
void disset()
{
df(4,16,year10,1); //设置年、月、日、时、分
df(4,24,year1,0);
dh(4,32,39,0);
df(4,48,month10,0);
df(4,56,month1,0);
dh(4,64,40,0);
df(4,80,day10,0);
df(4,88,day1,0);
dh(4,96,41,0);
df(4,112,hour10,0);
df(4,120,hour1,0);
dh(4,128,42,0);
df(4,144,minute10,0);
df(4,152,minute1,0);
dh(4,160,43,0);
}
void time_mod() //修改时间函数
{
uchar KeyPosition = 0; //该数据值 保存着要修改的 数值信息,光标起始位置在0列
uchar keytmp= 0;
utime[0] = year10;
utime[1] = year1;
utime[2] = month10;
utime[3] = month1;
utime[4] = day10;
utime[5] = day1;
utime[6] = hour10;
utime[7] = hour1;
utime[8] = minute10;
utime[9] = minute1;
while (1)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -