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

📄 12864_main.c

📁 用单片机实现LCD显示字符和图形
💻 C
字号:
//--------------------------------------------------------------
//--管脚的分配关系:
//****************P27------LCD__RS------第4脚,并行的数据命令选择信号
//****************P26------LCD__RW------ 第5脚,并行的读写选择信号
//****************P25------LCD__E ------ 第6脚,并行的使能信号
//****************P24------LCD__PSB ---- 第15脚,并行接口选择信号
//****************P23------LCD__RST ---- 第17脚,复位信号
//****************P1^6-----I2C_SDA------ eeprom data line
//****************P1^7-----I2C_SDA------ eeprom clock line
/*2009年1月13日,eeprom 的时序完全好,不可修改	程序已经优化
*********************************************************************************
*********************************************************************************
*********************************************************************************
********************************************************************************/

#include "reg52.h"
#include "declare.h"
#include "stdio.h" //-----该函数中有把整数和字符连接在一起的函数
#include "key.h"

#include "communicate.h"
//----------------------------------------------------库函数定义
unsigned char xdata str1[20];
unsigned char xdata str2[20];
unsigned char xdata str3[20];
unsigned char xdata str4[20];
char set[]="设置";
char clr_set[] ="    ";
char  key_flag=0;	   					//是否向eeprom里面写数据的判断条件
extern char  select_t=0;	  					//键盘功能选择

//extern  unsigned int xdata RxBuf[30];
unsigned char total_t[4]={2,50,2,50};
unsigned char prodata[4]={0,0,0,0};
unsigned int bai[4]={0,0,0,0};
unsigned int shi[4]={0,0,0,0};
unsigned char cnt=20;//--------------------定时器计数-----------------
unsigned char a=0;
unsigned char send_flag=1;
 //unsigned char ok1[]='S';			// use for test
//--------------------------------------------------------------------
//char count=0;
//extern uchar receive[6]={0};
void T0Initial();//------------------------T0定时初始化中断函数
void velocity_show(); //-----------------------显示设置参数
void read_eeprom();
void write_eeprom();
extern void process_data();
void evaluate();
//--------------------------------------------------------------------

sbit key_set=P1^2;
sbit key_add=P1^0;
sbit key_dec=P1^1;
sbit key_ok=P1^3;     //-----------------------确定按键,同时也是串口发送数据标志

void main()
  {
	//char j;
//********************************************************************
	init_timer1();						//串口初始化
 	LCD_init();                         //lcd初始化
  	LCD_write_char( 0x01, 0 );          //LCD清屏
	delay_nms(100);

 	PHOTO_DISP(TU_TAB1);                //-------显示图形我的电脑 
	delay_nms(1000);                     //延迟--------一段时间
  LCD_write_char( 0x01, 0 );          //清屏
	delay_nms(100);
    PHOTO_DISP(BIRD);                   //显示图形--自己画的
	delay_nms(1300);
 	LCD_write_char( 0x01, 0 );          //清屏


	T0Initial(); //--------------------------初始化T0-----------------
    

	  while(1)
		{
			Key_read ();			 //键盘扫描
			process_data();
			
			if(key_ok==0)			 //---确定
				{	
					select_t=0;		 //----擦掉显示					
					//write_eeprom();	 //写进eeprom
					//TI=1;			 //----发送数据	
					send_flag=1;	 
				}
				
			switch(select_t)
    	{
        case 1:
                LCD_write_string(6,0,set);
                LCD_write_string(6,1,clr_set);
                LCD_write_string(14,0,clr_set);
                LCD_write_string(14,1,clr_set);
                break;
        case 2:
                LCD_write_string(6,1,set);
                LCD_write_string(6,0,clr_set);
                LCD_write_string(14,0,clr_set);
                LCD_write_string(14,1,clr_set);
                break;
        case 3:
                LCD_write_string(14,0,set);
                LCD_write_string(6,0,clr_set);
                LCD_write_string(6,1,clr_set);
                LCD_write_string(14,1,clr_set);
                break;
        case 4:
                LCD_write_string(14,1,set);
                LCD_write_string(6,0,clr_set);
                LCD_write_string(14,0,clr_set);
                LCD_write_string(6,1,clr_set);
                break;
        case 0:
				LCD_write_string(6,0,clr_set);
				LCD_write_string(6,1,clr_set);
                LCD_write_string(14,0,clr_set);
                LCD_write_string(14,1,clr_set);
                break;
	    default:
				break;
    	} 
//------------------------------------
           velocity_show();            //LCD show function
//---------------------------------------------------------------------------------
		}	
}

//----------------LCD SHOW FUNCTION--------------------------------

void velocity_show()  
{
		//---Warning !!the data type of readI2C is  very important ,
		//----otherwise showing result is wrong, such as ,1 is like to be 256
//		int i,j;
//		i=
		process_data();
		sprintf(str1,"数据N1=%d%dms",(RxBuf[0]-0x30),(RxBuf[1]-0x30));	//串口传递的是ASCALL码,需要转换
//		sprintf(str2,"t2延时=%d%dms",bai[1],shi[1]);
		sprintf(str2,"数据N2=%d%dms",(RxBuf[2]-0x30),(RxBuf[3]-0x30));
//		sprintf(str3,"t3进棉=%d%dms",bai[2],shi[2]);
		sprintf(str3,"数据N3=%d%dms",(RxBuf[4]-0x30),(RxBuf[5]-0x30));
//    	sprintf(str4,"t4延时=%d%dms",bai[3],shi[3]);


		sprintf(str4,"数据N4=%d%dms",(RxBuf[6]-0x30),(RxBuf[7]-0x30));

		LCD_write_string(0,0,str1);
		LCD_write_string(0,1,str2);
		LCD_write_string(0,2,str3);
		LCD_write_string(0,3,str4);
}
//---------------处理数据子函数-----------------------------------
extern void process_data()
{
		unsigned char i;

		for(i=0;i<4;i++)
			{
				//prodata[i]=(int)readI2c(i);
				prodata[i]=total_t[i];
		 		bai[i]=prodata[i]/10;
		 		shi[i]=prodata[i]%10;
			}		
}


//----------------键盘程序----------------------------------
///---------------P1.0做加法-------------------
//----------------P1.1做减法-------------------
//----------------P1.2用求余的方法来选择T1,T2,T3,T4----------*/
 void  Key_read ()
	{
	P1=0XFF;
	//delay_nms(10);
	if(key_set==0)	  //------------选择T判断条件-----
	{
	//LCD_write_string(14,1,set);

	select_t++;
	delay_nms(10);
	if(select_t>4)	 select_t=1;

	}
//-------t1,t2,3,t4,递增条件P1=0XFE----------------------------------


	if((key_add==0)&&(select_t==1))   
	 	{/*
		LCD_write_string(6,1,clr_set);
		LCD_write_string(14,0,clr_set);
		LCD_write_string(14,1,clr_set);
		delay_nus(5);*/
//		LCD_write_string(6,0,set);
		//delay_nus(5);
//		total_t[0]++;
		RxBuf[0]++;


		//readI2c(0)++;
		key_flag=1;		
		 }
	else if ((key_add==0)&&(select_t==2)) 
		{/*
		LCD_write_string(6,0,clr_set);
		LCD_write_string(14,0,clr_set);
		LCD_write_string(14,1,clr_set);
		delay_nus(5);*/
//		LCD_write_string(6,1,set);
		//delay_nus(5);
//		total_t[1]=50;
		RxBuf[2]++;

		key_flag=1;
		 }
	else if ((key_add==0)&&(select_t==3)) 
		{/*
		LCD_write_string(6,0,clr_set);
		LCD_write_string(6,1,clr_set);
		LCD_write_string(14,1,clr_set);
		delay_nus(5);*/
//		LCD_write_string(14,0,set);
		//delay_nus(5);
//		total_t[2]++;
		RxBuf[4]++;
		key_flag=1;
		 }
	else if ((key_add==0)&&(select_t==4)) 
		{ /*
		LCD_write_string(6,0,clr_set);
		LCD_write_string(14,0,clr_set);
		LCD_write_string(6,1,clr_set);		
		delay_nus(5);*/
//		LCD_write_string(14,1,set);
		//delay_nus(5);
//		total_t[3]=50;

		RxBuf[6]++;
		key_flag=1;
		 }
//-------t1,t2,3,t4,递减条件P1=0XFE----------------------------------
	if((key_dec==0)&&(select_t==1))   
	 	{/*
		LCD_write_string(6,1,clr_set);
		LCD_write_string(14,0,clr_set);
		LCD_write_string(14,1,clr_set);
		delay_nus(5); */
//		LCD_write_string(6,0,set);
		//delay_nus(5);
//		total_t[0]--;
		RxBuf[0]--;
		key_flag=1;
		 }
	else if ((key_dec==0)&&(select_t==2)) 
		{ /*
		LCD_write_string(6,0,clr_set);
		LCD_write_string(14,0,clr_set);
		LCD_write_string(14,1,clr_set);
		delay_nus(5);*/
//		LCD_write_string(6,1,set);
		//delay_nus(5);
//		total_t[1]=50;
		RxBuf[2]--;
		key_flag=1;
		 }
	else if ((key_dec==0)&&(select_t%5==3)) 
		{ /*
		LCD_write_string(6,0,clr_set);
		LCD_write_string(6,1,clr_set);
		LCD_write_string(14,1,clr_set);
		delay_nus(5);*/
//		LCD_write_string(14,0,set);
		//delay_nus(5);
//		total_t[2]--;
		RxBuf[4]--;
		key_flag=1;
		 }
	else if ((key_dec==0)&&(select_t%5==4)) 
		{ /*
		LCD_write_string(6,0,clr_set);
		LCD_write_string(14,0,clr_set);
		LCD_write_string(6,1,clr_set);		
		delay_nus(5);  */
//		LCD_write_string(14,1,set);
		//delay_nus(5);
//		total_t[3]=50;
		RxBuf[6]--;
		key_flag=1;
		 }
	} 

//------------------------T0定时器初始化函数-----------------------------
void T0Initial ()
{
	TMOD |= 0x01;
	 TH0=0x3c;
	 TL0=0xb0;
	 IE |= 0x82;
	 TR0=1;
}

//-------------------------T0定时中断服务子函数---------------------------
void to_int() interrupt 1 using 0
{
     TH0=0x3c;
 	 TL0=0xb0;
	 cnt--;
	 
	 if(cnt==0)
	    {
 //		   cnt=20;            //--1s
          cnt=100; 			  //--每5秒发送一次数据
		   if(send_flag==1)
		   {
		  	 TI=1;			 //----发送数据
		  	 a++;
//-----------------------------------------------------------------------------------
		   	if(a>10)		 //----发送数据的次数,根据实际情况修改
//------------------------------------------------------------------------------------
		 	  {
		 	  	a=0;
/*				TI=0;                --如果需要发送有限次,可在此处修改
				send_flag=0;
*/
		 	  }
		   }
		
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -