📄 p89lpc934_for_lm240128r.txt
字号:
/********************************************************************/
// LM240128R驱动程序
//资源分配: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++) while(*text_display { *text_display) lcd_text_display(uchar void **********LCD显示文本********** } lcd_cs="0;" lcd_rs="0;" lcd_wr="0;" 极限值为15us delay_3_3us(6); lcd_data="lcd_command;" lcd_data_num) lcd_data_send(uchar **********LCD写数据********** lcd_command) lcd_cmd_send(uchar **********LCD写命令********** {lcd_data_send(0x00);} for(lcd_clean_y="0;lcd_clean_y<128;lcd_clean_y++)" for(lcd_clean_x="0;lcd_clean_x<30;lcd_clean_x++)" lcd_cmd_send(0x70);lcd_cmd_send(0x00); lcd_cmd_send(0x60);lcd_cmd_send(0x00); lcd_clean_y; uchar lcd_clean_x; lcd_clean(void) **********LCD清屏********** 1倍字体大小 lcd_cmd_send(0xf1);lcd_cmd_send(0x0f); 自动解码,可以显示中文 lcd_cmd_send(0xf0);lcd_cmd_send(0xa0); 设置时钟信号周期(刷新率,数值越小刷新越快) lcd_cmd_send(0x90);lcd_cmd_send(0x06); 显示时候的基本设置 lcd_cmd_send(0x10);lcd_cmd_send(0x68); 光标高度,行距 lcd_cmd_send(0x11);lcd_cmd_send(0x10); 参数要求 lcd_cmd_send(0x81);lcd_cmd_send(0x40); 正常模式,文本,显示开,不闪烁,反白 lcd_cmd_send(0x00);lcd_cmd_send(0xcc); 设置显示视窗顶部位置 lcd_cmd_send(0x51);lcd_cmd_send(0x00); 设置显示视窗左边位置 lcd_cmd_send(0x41);lcd_cmd_send(0x00); 设置显示视窗底部位置 lcd_cmd_send(0x31);lcd_cmd_send(0x7f); 设置显示视窗右边位置 lcd_cmd_send(0x21);lcd_cmd_send(0x1d); 设置工作视窗顶部位置 lcd_cmd_send(0x50);lcd_cmd_send(0x00); 设置工作视窗左边位置 lcd_cmd_send(0x40);lcd_cmd_send(0x00); 设置工作视窗底部位置 lcd_cmd_send(0x30);lcd_cmd_send(0x7f); 设置工作视窗右边位置 lcd_cmd_send(0x20);lcd_cmd_send(0x1d); delay_ms(50); lcd_rst="0;" delay_ms(250); 复位 lcd_init(void) **********LCD初始化********** delay_3_3us(3); for(delay_ms_y="0;delay_ms_y<100;delay_ms_y++)" for(delay_ms_x="0;delay_ms_x<delay_ms_time;delay_ms_x++)" delay_ms_y; int unsigned delay_ms_x; delay_ms_time) delay_ms(unsigned **********ms软件延时********** {;}>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(":");
if(timea_m<10)
{lcd_num_display(0);}
lcd_num_display(timea_m);
lcd_text_display(":");
if(timea_s<10)
{lcd_num_display(0);}
lcd_num_display(timea_s);
lcd_text_display(" ");
}
}
/**********显示菜单信息**********/
void page1_cn(void)
{
//lcd_box_display(79,0,176,17,1);
lcd_cmd_send(0x60);lcd_cmd_send(0x08);
lcd_cmd_send(0x70);lcd_cmd_send(0x00);
lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
lcd_text_display("各节电池电压(V)");
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x10);
lcd_text_display("01号:");
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x20);
lcd_text_display("03号:");
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x30);
lcd_text_display("05号:");
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x40);
lcd_text_display("07号:");
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x50);
lcd_text_display("09号:");
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x60);
lcd_text_display("11号:");
lcd_cmd_send(0x60);lcd_cmd_send(0x00);
lcd_cmd_send(0x70);lcd_cmd_send(0x70);
lcd_text_display("13号:");
lcd_cmd_send(0x60);lcd_cmd_send(0x0f);
lcd_cmd_send(0x70);lcd_cmd_send(0x10);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -