📄 main.c
字号:
//***********************************************************
//*标题:自制板实验 - ZZ004_12864LCD(带汉字库)程序优化
//*硬件:自制板
//*文件:ZZ004.c
//*日期:2005-12-29
//*版本:1.0
//*作者:lluct
//*邮箱:lluct@hotmail.com
//*********************************************************
//*描述:
//* 显示画面和汉字
//*
//*********************************************************
//*【版权】 lluct, GPL
//*【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!
//*********************************************************
#include "p89v51rx2.h"
#include <intrins.h>
//-----------------------------------------------
sbit KEYADD = P1^7; //按键"+"
#define _ADD_ 0x0080
sbit KEYRIGHT = P1^6; //按键"右"
#define _RIGHT_ 0x0040
sbit KEYLEFT = P1^5; //按键"左"
#define _LEFT_ 0x0020
sbit KEYDOWN = P1^4; //按键"下"
#define _DOWN_ 0x0010
sbit KEYUP = P1^3; //按键"上"
#define _UP_ 0x0008
sbit KEYMODE = P1^2; //按键"MODE"
#define _MODE_ 0x0004
sbit KEYYB = P1^1; //按键"预备"
#define _YB_ 0x0002
sbit KEYONOFF = P1^0; //按键"开/关"
#define _ONOFF_ 0x0001
sbit START = P2^2; //电机平台"启/停"控制
#define _START_ 0x0400
sbit KEYMINUS = P2^0; //按键"-"
#define _MINUS_ 0x0100
sbit LS = P2^1; //限位控制
#define _LS_ 0x0200
sbit Pluse = P2^4; //电机脉冲
sbit Direction = P2^5; //电机方向
typedef union tt{
unsigned int u16;
unsigned char u8[2];//u8[0] is H
}_KEY;
_KEY key_new, key_old;
extern void IIC_RdFromROM(unsigned char ad_main,unsigned char *rddata,unsigned char addh,unsigned char addl,unsigned char num);
extern void IIC_WrToROM(unsigned char ad_main,unsigned char *wrdata,unsigned char addh,unsigned char addl,unsigned char num);
extern void lcdInit (void);//初始化LCD子程序
extern void lcdClear (void);//清除LCD屏幕子程序
extern void lcdWriteCommand (unsigned char Command);//写入控制命令到LCD子程序//输入参数:控制命令
extern void lcdWriteData (unsigned char Data);//写入显示数据到LCD子程序//输入参数:显示数据
extern void checkLcdBusy (void);//检测LCD忙碌子程序
extern void displayPhoto (unsigned char *bmp);//全屏显示图形子程序//输入参数:图形数据
extern void wrPosition (void);//坐标写入子程序
extern void dispString (unsigned char X, Y, speed, unsigned char *msg);//显示字符串子程序//输入参数:X=行(0-3), Y=列(0-7), speed=显示速度(毫秒), msg=字符数据
extern void delaySec (unsigned char sec);//延时(秒)子程序//输入参数:秒数
unsigned int scan_key(void);
extern serial_initial();
extern tim0_initial();
extern F_YB_();
extern void char_in_String_10(unsigned char _data, unsigned char y,signed char *msg,signed char sign);
void F_pag0 (void);
void F_pag1 (void);
void F_pag2 (void);
void F_pag3 (void);
void F_pag4 (void);
void F_pag5 (void);
//===============================================
unsigned int _key;
// "预备距离 49.8mm ";
unsigned char xdata sdyl[17] ="设定压力 N";
unsigned char xdata sdsj[17] ="设定时间 S";
unsigned char xdata ybsd[17] ="预备速度 mm";
unsigned char xdata sds2[17] ="设定压力 mm/S";
unsigned char xdata jysj[17] ="加压时间 S";
unsigned char xdata gzsj[17] ="工作时间 S";
unsigned char xdata jmsj[17] ="精磨时间 S";
unsigned char xdata jmyl[17] ="精磨压力 N";
unsigned char xdata sdsd[17] ="手动速度 mm/S";
unsigned char xdata wtsd[17] ="微调速度 mm/S";
unsigned char xdata wtjl[17] ="微调距离 mm";
unsigned char xdata ybjl[17] ="预备距离 mm";
unsigned char code kong[17] =" ";
unsigned char idata v_pag[3] =" ";
static unsigned char idata S_=0,S;
unsigned char idata v_pag10_=34; //设定压力
unsigned char idata v_pag11_=90; //设定压力
unsigned char idata v_pag20_=49; //预备速度
unsigned char idata v_pag21_=49;
unsigned char idata v_pag22_=30;
unsigned char idata v_pag23_=90;//工作时间
unsigned char idata v_pag30_=49;//精磨时间
unsigned char idata v_pag31_=49;
unsigned char idata v_pag32_=30;
unsigned char idata v_pag33_=90;//微调速度
unsigned char idata v_pag40_=90;//微调距离
unsigned char idata v_pag41_=90;//预备距离
unsigned char xdata wtdata[12];
unsigned char xdata rddata[12];
//一圈3mm
//一圈360度
//16个脉冲0.9度 6400个脉冲360度
extern void Set__moto( unsigned long Step_,unsigned char Direct);
/*
void F_00to50(void)
{//按键"预备" 按下;
//Set__moto (0x19,0);//到1*0x1900位置
Set__moto (10*0x1900,0);
}
void F_50to51(void)
{//按键"预备" 按下后;按键"开/关" 第一次按下;
Set__moto (21*0x1900,0);//开磨;到10*0x1900位置
}
void F_51to00(void)
{//按键"预备" 按下后;按键"开/关" 第二次按下;要执行的程序代码
Set__moto (0,1);//回到0位置
}*/
extern unsigned long _Step;
extern unsigned long old_Step;
void main (void)
{
lcdInit ();
F_pag0();//lcd显示
tim0_initial();//初始化定时器
Set__moto (0,1);///void Set__moto( unsigned long Step,unsigned char Direct){
IIC_RdFromROM(0xa0,rddata,0x00,0x00,12); //读取24Cxxx内容,
F_YB_();
if((rddata[0]!=0)&&(rddata[0]!=255))v_pag10_=rddata[0];
if((rddata[1]!=0)&&(rddata[1]!=255))v_pag11_=rddata[1];
if((rddata[2]!=0)&&(rddata[2]!=255))v_pag20_=rddata[2];
if((rddata[3]!=0)&&(rddata[3]!=255))v_pag21_=rddata[3];
if((rddata[4]!=0)&&(rddata[4]!=255))v_pag22_=rddata[4];
if((rddata[5]!=0)&&(rddata[5]!=255))v_pag23_=rddata[5];
if((rddata[6]!=0)&&(rddata[6]!=255))v_pag30_=rddata[6];
if((rddata[7]!=0)&&(rddata[7]!=255))v_pag31_=rddata[7];
if((rddata[8]!=0)&&(rddata[8]!=255))v_pag32_=rddata[8];
if((rddata[9]!=0)&&(rddata[9]!=255))v_pag33_=rddata[9];
if((rddata[10]!=0)&&(rddata[10]!=255))v_pag40_=rddata[10];
if((rddata[11]!=0)&&(rddata[11]!=255))v_pag41_=rddata[11];
while(1)//循环
{
_key = scan_key();
switch(_key)
{
case _MODE_ : //按键"MODE"
if(S_==0x00){S_=0x10;}//Enter
else {
wtdata[0]=v_pag10_;
wtdata[1]=v_pag11_;
wtdata[2]=v_pag20_;
wtdata[3]=v_pag21_;
wtdata[4]=v_pag22_;
wtdata[5]=v_pag23_;
wtdata[6]=v_pag30_;
wtdata[7]=v_pag31_;
wtdata[8]=v_pag32_;
wtdata[9]=v_pag33_;
wtdata[10]=v_pag40_;
wtdata[11]=v_pag41_;
IIC_WrToROM(0xa0,wtdata,0x00,0x00,12);/*保存数据*/
S_=0x00;}//End v_pag10_++;
break;
case _ADD_ : //按键"+"
if(S_==1) { if( ++v_pag10_>99)v_pag10_=0; }
else if(S_==2){ if( ++v_pag11_>99)v_pag11_=0; }
else if(S_==3){ if( ++v_pag20_>99)v_pag20_=0; }
else if(S_==4){ if( ++v_pag21_>99)v_pag21_=0; }
else if(S_==5){ if( ++v_pag22_>99)v_pag22_=0; }
else if(S_==6){ if( ++v_pag23_>99)v_pag23_=0; }
else if(S_==7){ if( ++v_pag30_>99)v_pag30_=0; }
else if(S_==8){ if( ++v_pag31_>99)v_pag31_=0; }
else if(S_==9){ if( ++v_pag32_>99)v_pag32_=0; }
else if(S_==10){ if( ++v_pag33_>99)v_pag33_=0; }
else if(S_==11){ if( ++v_pag40_>99)v_pag40_=0; }
else if(S_==12){ if( ++v_pag41_>99)v_pag41_=0; }
break;
case _MINUS_: //按键"-"
if(S_==1) { if( --v_pag10_>99)v_pag10_=99; }
else if(S_==2){ if( --v_pag11_>99)v_pag11_=99; }
else if(S_==3){ if( --v_pag20_>99)v_pag20_=99; }
else if(S_==4){ if( --v_pag21_>99)v_pag21_=99; }
else if(S_==5){ if( --v_pag22_>99)v_pag22_=99; }
else if(S_==6){ if( --v_pag23_>99)v_pag23_=99; }
else if(S_==7){ if( --v_pag30_>99)v_pag30_=99; }
else if(S_==8){ if( --v_pag31_>99)v_pag31_=99; }
else if(S_==9){ if( --v_pag32_>99)v_pag32_=99; }
else if(S_==10){ if( --v_pag33_>99)v_pag33_=99; }
else if(S_==11){ if( --v_pag40_>99)v_pag40_=99; }
else if(S_==12){ if( --v_pag41_>99)v_pag41_=99; }
break;
case _DOWN_: //按键"下
if(++S_>12)S_=1;
break;
case _UP_ : //按键"上
if(--S_==0)S_=12;
break;
case _RIGHT_: //按键"右"
break;
case _LEFT_ : //按键"左"
break;
case _YB_ : //按键"预备"
if( S_==0x00)
{
S_=0x50; //状态是"预备"
Set__moto (0xfa00,0);
}
break;
case _ONOFF_: //按键"开/关"
if(S_==0x50 )
{
S_=0x51; //状态是"工作"
Set__moto (0x1f400,0);
}
else if(S_==0x51 )
{
S_=0x00;//状态是"开始"
Set__moto (0,1);//回到0位置
}
break;
}
if(_key)
{
switch(S_)
{
case 0: F_pag0();
break;
case 1:
case 2: if(S_ ==1)
char_in_String_10(v_pag10_,12, sdyl,1);//设定压力
else char_in_String_10(v_pag10_,12, sdyl,0);
if(S_ ==2)
char_in_String_10(v_pag11_,12, sdsj,1);//设定时间
else char_in_String_10(v_pag11_,12, sdsj,0);
dispString (0, 0, 1, sdyl);
dispString (1, 0, 1, sdsj);
dispString (2, 0, 1, kong);
dispString (3, 0, 1, kong);
delaySec(1);
break;
case 3:
case 4:
case 5:
case 6:
if(S_ ==3)
char_in_String_10(v_pag20_,12, ybsd,1);//预备速度
else char_in_String_10(v_pag20_,12, ybsd,0);
if(S_ ==4)
char_in_String_10(v_pag21_,12, sds2,1);//设定压力
else char_in_String_10(v_pag21_,12, sds2,0);
if(S_ ==5)
char_in_String_10(v_pag22_,12, jysj,1);//加压时间
else char_in_String_10(v_pag22_,12, jysj,0);
if(S_ ==6)
char_in_String_10(v_pag23_,12, sdsj,1);//工作时间
else char_in_String_10(v_pag23_,12, sdsj,0);
dispString (0, 0, 1, ybsd);
dispString (1, 0, 1, sds2);
dispString (2, 0, 1, jysj);
dispString (3, 0, 1, sdsj);
delaySec(1);
break;
case 7:
case 8:
case 9:
case 10:
if(S_ ==7)
char_in_String_10(v_pag30_,12, jmsj,1);//精磨时间
else char_in_String_10(v_pag30_,12, jmsj,0);
if(S_ ==8)
char_in_String_10(v_pag31_,12, jmyl,1);//精磨压力
else char_in_String_10(v_pag31_,12, jmyl,0);
if(S_ ==9)
char_in_String_10(v_pag32_,12, sdsd,1);//手动速度
else char_in_String_10(v_pag32_,12, sdsd,0);
if(S_ ==10)
char_in_String_10(v_pag33_,12, wtsd,1);//微调速度
else char_in_String_10(v_pag33_,12, wtsd,0);
dispString (0, 0, 1, jmsj);//精磨时间
dispString (1, 0, 1, jmyl);//精磨压力
dispString (2, 0, 1, sdsd);//手动速度
dispString (3, 0, 1, wtsd);//微调速度
delaySec(1);//F_pag3();
break;//精磨时间
case 11:
case 12:
if(S_ ==11)
char_in_String_10(v_pag40_,12, wtjl,1);//微调距离
else char_in_String_10(v_pag40_,12, wtjl,0);
if(S_ ==12)
char_in_String_10(v_pag41_,12, ybjl,1);//预备距离
else char_in_String_10(v_pag41_,12, ybjl,0);
dispString (0, 0, 1, wtjl);//微调距离
dispString (1, 0, 1, ybjl);//预备距离
dispString (2, 0, 1, kong);
dispString (3, 0, 1, kong);
delaySec(1);//F_pag4();
break;//微调距离
case 0x50: F_pag4();break;//工作...
case 0x51: F_pag5();break;//工作...
}
S=S_;
}
}
}
//===============================================
void F_pag0 (void)
{
//lcdClear();//输入参数:X=行(0-3), Y=列(0-7), speed=显示等待(毫秒), msg=显示数据
dispString (0, 0, 1, " ");
dispString (1, 0, 1, " MPZ-1T ");
dispString (2, 0, 1, " 自动金相磨抛 ");
dispString (3, 0, 1, " ");
//delaySec(1);
}
void F_pag4 (void)
{
//lcdClear();//输入参数:X=行(0-3), Y=列(0-7), speed=显示等待(毫秒), msg=显示数据
dispString (0, 0, 1, kong);
dispString (1, 0, 1, " 准备... ");
dispString (2, 0, 1, kong);
dispString (3, 0, 1, kong);
}
void F_pag5 (void)
{
lcdClear();//输入参数:X=行(0-3), Y=列(0-7), speed=显示等待(毫秒), msg=显示数据
dispString (0, 0, 1, kong);
dispString (1, 0, 1, " 工作... ");
dispString (2, 0, 1, kong);
dispString (3, 0, 1, kong);
}
unsigned int scan_key(void){
static unsigned char key_S=1;//允许按键处理标志
key_new.u8[0] = P2 & 0x89;
key_new.u8[1] = P1;
if(key_new.u16 != 0)//有按键按下
{
if(key_S==1) //允许按键处理
key_S=0; //按键恢复前将不再处理标志
else //按键已处理
key_new.u16=0;//按键数据清零;不要重复处理
}
else //无按键按下
{
key_S=1; //准备接受按键
}
return (key_new.u16 ) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -