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

📄 main.c

📁 基于Keil uVision3开发平台
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************/
//                        LM240128R驱动程序                      
//编写:李科                                                          
//时间:2007年12月18日                                                
//修改:2007年12月20日                                                
//资源分配:P89LPC934  7.373M内晶振                                         
//                                                                    
//P0.0--P0.7:为液晶D0--D7口
//                           
//P1.0--P1.7:预留                      
//                                                                                                     
//P2.0--P2.1:接LM240128R液晶/WR  /RD端                         
//P2.2--P2.3: 预留
//P2.4--P2.7: 接LM240128R液晶 /RST  BUSY  /RS  /CS 端  

//receive_num[0]、receive_num[1]:0中1英
//receive_num[2]、receive_num[3]:显示页码
//receive_num[4]、receive_num[5]:1号电池电压,先发低位
//receive_num[6]、receive_num[7]:2号电池电压,先发低位
//receive_num[8]、receive_num[9]:3号电池电压,先发低位
//receive_num[10]、receive_num[11]:4号电池电压,先发低位
//receive_num[12]、receive_num[13]:5号电池电压,先发低位
//receive_num[14]、receive_num[15]:6号电池电压,先发低位
//receive_num[16]、receive_num[17]:7号电池电压,先发低位
//receive_num[18]、receive_num[19]:8号电池电压,先发低位
//receive_num[20]、receive_num[21]:9号电池电压,先发低位
//receive_num[22]、receive_num[23]:10号电池电压,先发低位
//receive_num[24]、receive_num[25]:11号电池电压,先发低位
//receive_num[26]、receive_num[27]:12号电池电压,先发低位
//receive_num[28]、receive_num[29]:13号电池电压,先发低位
//receive_num[30]、receive_num[31]:14号电池电压,先发低位
//receive_num[32]、receive_num[33]:1号电池温度,先发低位
//receive_num[34]、receive_num[35]:2号电池温度,先发低位
//receive_num[36]、receive_num[37]:充电电流,先发低位
//receive_num[38]、receive_num[39]:错误代码 0表示正常

              
/********************************************************************/
#include <reg932.h>
//#include <intrins.h>

/**********端口宏定义**********/
#define uchar  unsigned char
///////////////////////////////
/*  LM240128R液晶端口宏定义  */
///////////////////////////////
#define lcd_data  P0 //设置8位数据输入口
sbit lcd_wr=P2^0;	 //设置写控制口
sbit lcd_rd=P2^1;    //设置读控制口
sbit lcd_cs=P2^7;  	 //设置片选控制口
sbit lcd_rs=P2^6;	 //设置命令数据选择控制口
sbit lcd_rst=P2^4;	 //设置复位控制口


/***********函数申明***********/
void port_init(void);
void delay_3_3us(unsigned int delay_us_time);
void delay_ms(unsigned int delay_ms_time);
void lcd_cmd_send(uchar lcd_command);
void lcd_data_send(uchar lcd_data_num);
void lcd_clean(void);
void lcd_text_display(uchar *text_display);
void lcd_num_display(long int num_display);
void lcd_float_display(float float_display);
void lcd_init(void);
void rtc_init();
void page1_cn(void);
void page1_en(void);
void page2_cn(void);
void page2_en(void);
void time_display(void);

/***********全局变量***********/
unsigned int timea0=0;     //时间显示变量
uchar timea_s=0,timea_m=0,timea_h=0;
uchar language=0;	                //语言标志:0中文 1英文
uchar page=0;                       //显示页面
uchar uart_temp=0;                  //串口接收变量
uchar receive_num[40]; 		        //串口缓冲区
uchar num_flag=0;             	   	//缓冲区位置标志
uchar flag0=0;
unsigned int num_m;			        //显示变量
float num_x;						//显示变量
unsigned int xtime=0;               //循环变量

/**********端口初始化**********/
void port_init(void)
{
  P0M1=0x00;//为液晶D0--D7口
  P0M2=0x00;

  P1M1=0x00;//双向I/O口
  P1M2=0x00;

  P2M1=0x00;//P2^0--/WR  P2^1--/RD  P2^4--/RST  P2^6--/RS  P2^7--/CS  为准双向口
  P2M2=0x00;   
  
  P3M1=0x00;//双向I/O口
  P3M2=0x00;
}

/**********3.3us软件延时**********/
void delay_3_3us(unsigned int delay_us_time)
{
 unsigned int delay_us_x;
 for(delay_us_x=0;delay_us_x<delay_us_time;delay_us_x++)
  {;}
}

/**********ms软件延时**********/
void delay_ms(unsigned int delay_ms_time)
{
 unsigned int delay_ms_x;
 unsigned int delay_ms_y;
 for(delay_ms_x=0;delay_ms_x<delay_ms_time;delay_ms_x++)
  {
   for(delay_ms_y=0;delay_ms_y<100;delay_ms_y++)
    {
	 delay_3_3us(3);
	}
  }
}

/**********LCD初始化**********/
void lcd_init(void)
{
 lcd_rst=0;                              //复位
 delay_ms(250);                          
 lcd_rst=1;
 delay_ms(50);
 
 lcd_cmd_send(0x20);lcd_cmd_send(0x1d);  //设置工作视窗右边位置
 lcd_cmd_send(0x30);lcd_cmd_send(0x7f);  //设置工作视窗底部位置
 lcd_cmd_send(0x40);lcd_cmd_send(0x00);  //设置工作视窗左边位置
 lcd_cmd_send(0x50);lcd_cmd_send(0x00);  //设置工作视窗顶部位置
 
 lcd_cmd_send(0x21);lcd_cmd_send(0x1d);  //设置显示视窗右边位置
 lcd_cmd_send(0x31);lcd_cmd_send(0x7f);  //设置显示视窗底部位置
 lcd_cmd_send(0x41);lcd_cmd_send(0x00);  //设置显示视窗左边位置
 lcd_cmd_send(0x51);lcd_cmd_send(0x00);  //设置显示视窗顶部位置
 
 lcd_cmd_send(0x00);lcd_cmd_send(0xcc);  //正常模式,文本,显示开,不闪烁,反白
 lcd_cmd_send(0x81);lcd_cmd_send(0x40);  //参数要求
 lcd_cmd_send(0x11);lcd_cmd_send(0x10);  //光标高度,行距
 lcd_cmd_send(0x10);lcd_cmd_send(0x68);  //显示时候的基本设置
 lcd_cmd_send(0x90);lcd_cmd_send(0x06);  //设置时钟信号周期(刷新率,数值越小刷新越快)
 lcd_cmd_send(0xf0);lcd_cmd_send(0xa0);  //自动解码,可以显示中文
 lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);  //1倍字体大小
}

/**********LCD清屏**********/
void lcd_clean(void)
{
 uchar lcd_clean_x;
 uchar lcd_clean_y;
 lcd_cmd_send(0x60);lcd_cmd_send(0x00);
 lcd_cmd_send(0x70);lcd_cmd_send(0x00);
 for(lcd_clean_x=0;lcd_clean_x<30;lcd_clean_x++)
  {
   for(lcd_clean_y=0;lcd_clean_y<128;lcd_clean_y++)
   {lcd_data_send(0x00);}
  }
}

/**********LCD写命令**********/
void lcd_cmd_send(uchar lcd_command)
{
 lcd_data=lcd_command;
 lcd_cs=0;
 lcd_rs=0;
 lcd_wr=0;
 delay_3_3us(6);//极限值为15us
 lcd_wr=1;
 lcd_rs=1;
 lcd_cs=1;
}

/**********LCD写数据**********/
void lcd_data_send(uchar lcd_data_num)
{
 lcd_data=lcd_data_num;
 lcd_cs=0;
 lcd_rs=1;
 lcd_wr=0;
 delay_3_3us(6);//极限值为15us
 lcd_wr=1;
 lcd_rs=0;
 lcd_cs=1;
}

/**********LCD显示文本**********/
void lcd_text_display(uchar *text_display)
{
 while(*text_display>0)
  {
   lcd_data_send(*text_display);
   text_display++;
  }
}

/**********LCD显示变量**********/
void lcd_num_display(long int num_display)
{
 uchar a,b,c,d,e,f,g;
 if(num_display<0)        //显示“-”号
  {
   lcd_text_display("-");
   num_display*=-1;
  }
 a=num_display/1000000;
 b=num_display%1000000/100000;
 c=num_display%100000/10000;
 d=num_display%10000/1000;
 e=num_display%1000/100;
 f=num_display%100/10;
 g=num_display%10;
 
 if(num_display>=1000000)
  {lcd_data_send(a+48);}
 if(num_display>=100000)
  {lcd_data_send(b+48);}
 if(num_display>=10000)
  {lcd_data_send(c+48);}
 if(num_display>=1000)
  {lcd_data_send(d+48);}
 if(num_display>=100) 
  {lcd_data_send(e+48);}
 if(num_display>=10) 
  {lcd_data_send(f+48);}
 lcd_data_send(g+48); 
}

/**********LCD显示浮点数**********/
void lcd_float_display(float float_display)
{
  long int first_num=0;
  float last_num=0;
  uchar a,b,c,d;
  if(float_display<0)
   {
    lcd_text_display("-");
    float_display*=-1;
   }
  first_num=float_display;          //取出整数部分
  lcd_num_display(first_num);       //显示整数部分
  lcd_text_display(".");            //显示小数点
  last_num=float_display-first_num; //取出小数部分
  first_num=last_num*10000;
  a=first_num/1000;
  b=first_num%1000/100;
  c=first_num%100/10;
  d=first_num%10;
  lcd_data_send(a+48);
  if(first_num%1000!=0)  //十分位后还有非0数,显示百分位
   {lcd_data_send(b+48);}
  if(first_num%100!=0)   //百分位后还有非0数,显示千分位
   {lcd_data_send(c+48);}
  if(first_num%10!=0)    //千分位后还有非0数,显示万分位
   {lcd_data_send(d+48);}
  
}


/**********RTC定时器初始化**********/
void rtc_init(void) 
{ 
 IEN0=0x40;  //使能RTC中断
 WDCON=0xe0; //关闭看门狗中断
 RTCH=0xE0;  //7.3728MHz下,1s中断1次时,RTC的定时值 
 RTCL=0xFF;  
 RTCCON=0x63;//开启RTC模块,时钟为内部RC振荡时钟 
}

void rtc_isr(void) interrupt 10
{ 
 RTCCON&=0x63;       //清除RTC中断标志位  
 if(++timea_s>=60)
  {
   timea_s=0;
   if(++timea_m>=60)
    {
     timea_m=0;
     timea_h++;
    }
  }
}  

/**********显示测试时间**********/
void time_display(void)
{
 if(timea0!=timea_s)
 {
  timea0=timea_s;
  lcd_cmd_send(0x60);lcd_cmd_send(0x10);
  lcd_cmd_send(0x70);lcd_cmd_send(0x60);
  if(timea_h<10)
   {lcd_num_display(0);}
  lcd_num_display(timea_h);
  lcd_text_display(":");

⌨️ 快捷键说明

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