📄 main.c
字号:
/********************************************************************/
// 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 + -