⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是一个产品的开发项目(基本程序)。有按键计算
💻 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 + -