📄 lcm141-key.c
字号:
//Key variable
unsigned char KeyFlag=0,EditFlag=0,order_count=1,bit_count=0,key_temp=0,value=0;
//LCD variable
unsigned long int view=0;
unsigned long int view_cnt=0;
int buffer,addr_buffer;
int FLOW_RATE=0;
int FLOW_UNIT=1;
int UNSCALED_PULSE=0;
int TEMP_f=0;
int PRESS_f=0;
int DENSITY_UNIT=0;
char asc[8];//整型数数对应的8位ASCII码数组
char dis_up[4];//上排显示寄存器
char dis_down[6];//下排显示寄存器
const char addr_up[4]={0x0B,0x09,0x07,0x05};//上排右->左寄存器地址
const char addr_down[6]={0x1C,0x1A,0x18,0x16,0x14,0x12};//下排右->左寄存器地址
const char addr_rights15=0x0E;//温度,/m,/s,/d,/h,m3-1,t-1
const char addr_rights14=0x0D;//电池
const char addr_rights13=0x0C;//百分号
const char addr_rights31=0x1E;//pa,I-2,m3-2,kg-2,k,M,/,t-2
const char addr_rights17=0x10;//ERROR,WARNING,kg-1,I-1,5,4,3,*10
const char downseg[11]={0xFA,0x06,0xBC,0x9E,0x4E,0xD6,0xF6,0x8A,0xFE,0xDE,0x00};//0->9段码
const char upseg[11]={0xFA,0x06,0xBC,0x9E,0x4E,0xD6,0xF6,0x8A,0xFE,0xDE,0x00};//0->9段码
//LCD subprogram
void Display_Init(void);
void Write_Command(void);
void Write_Data(void);
void Write_act(void);
void FLOAT2ASCII(void);
void Display_up(void);
void Display_down(void);
void Clear_screen(void);
void Clear_up(void);
void Clear_down(void);
void Clear_left(void);
void Clear_right(void);
void Switching_Display(void);
void Switching_Display1(void);
void Flickering_Display(void);
//Key subprogram
void Key_Init(void);
void Key_act(void);
void msdelay(unsigned int delaytime);
/**********************LCD driver***********************************/
void Display_Init(void)
{
P2SEL&=~BIT5+BIT6+BIT7;
P2DIR|=BIT5+BIT6+BIT7;
P2OUT|=BIT5; // ~CS=1 reset
msdelay(100);
buffer=0x00;
Write_Command();
buffer=0x29; // 上电初始化命令专用模块
Write_Command();
buffer=0x14; // 定义内部振荡器工作
Write_Command();
buffer=0x01; // 开振荡器
Write_Command();
buffer=0x03; // 开显示器
Write_Command();
Clear_screen();
//addr_buffer=addr_left; // 显示Q标志
//buffer=0x08;
//Write_Data();
}
void Write_Command(void) // LCD写命令
{
P2OUT&=~BIT5; // ~CS=0
P2OUT|=BIT7; // DATA=1
Write_act();
P2OUT&=~BIT7; // DATA=0
Write_act();
P2OUT&=~BIT7; // DATA=0
Write_act();
for(i=0;i<8;i++)
{
if((buffer&0x80)==0x80)
P2OUT|=BIT7;
else P2OUT&=~BIT7;
Write_act();
buffer<<=1;
}
P2OUT&=~BIT7; // DATA=0
Write_act();
P2OUT|=(BIT5+BIT6+BIT7); // ~CS=1,~WR=1,DATA=1
}
void Write_act(void)
{
P2OUT&=~BIT6;
msdelay(10);
P2OUT|=BIT6;
msdelay(10);
}
void Write_Data(void) // LCD写数据程序
{
P2OUT&=~BIT5; // CS=0,使能液晶
P2OUT|=BIT7; /*1*/
Write_act();
P2OUT&=~BIT7; /*0*/
Write_act();
P2OUT|=BIT7; /*1*/
Write_act();
P2OUT&=~BIT7; /*0*/
Write_act();
addr_buffer<<=3; // 左移三位,低五位有效
for(i=0;i<5;i++)
{
if((addr_buffer&0x80)==0x80)
P2OUT|=BIT7;
else P2OUT&=~BIT7;
Write_act();
addr_buffer<<=1;
}
for(i=0;i<8;i++)
{
if((buffer&0x01==0x01))
P2OUT|=BIT7;
else P2OUT&=~BIT7;
Write_act();
buffer>>=1;
}
P2OUT|=(BIT5+BIT6+BIT7); // ~CS=1,~WR=1,DATA=1
}
void FLOAT2ASCII(void) //将整型数转化为用于显示的ASCII
{
unsigned long int view1;
unsigned long int view2;
unsigned long int view_temp;
view2=view;
view1=view_cnt;
////////////////////////////////////////////
for(i=0;i<6;i++) //上排
{
view_temp=view1/10;
asc[i]=view1-view_temp*10; //求余数
view1=view1/10;
}
for(i=0;i<6;i++)
{
dis_up[i]=asc[i];
}
i=5;
while((dis_up[i]==0)&(i>0))
{
dis_up[i]=10;
i--;
}
////////////////////////////////////////////
for(i=0;i<8;i++) //下排
{
view_temp=view2/10;
asc[i]=view2-view_temp*10; //求余数
view2=view2/10;
}
for(i=0;i<8;i++)
{
dis_down[i]=asc[i];
}
i=7;
while((dis_down[i]==0)&(i>3))
{
dis_down[i]=10;
i--;
}
}
////////////////////////////////////////////
void Display_up(void) //上排液晶显示程序
{
unsigned int t;
addr_buffer=addr_up[0]; //显示上排第0位
t=dis_up[0];
buffer=upseg[t];
Write_Data();
addr_buffer=addr_up[1]; //显示上排第1位
t=dis_up[1];
buffer=upseg[t];
Write_Data();
addr_buffer=addr_up[2]; //显示上排第2位
t=dis_up[2];
buffer=upseg[t];
Write_Data();
addr_buffer=addr_up[3]; //显示上排第3位
t=dis_up[3];
buffer=upseg[t];
Write_Data();
}
void Display_down(void) //下排液晶显示程序
{
unsigned int t;
addr_buffer=addr_down[0]; //显示下排第0位
t=dis_down[0];
buffer=downseg[t];
Write_Data();
addr_buffer=addr_down[1]; //显示下排第1位
t=dis_down[1];
buffer=downseg[t];
Write_Data();
addr_buffer=addr_down[2]; //显示下排第2位
t=dis_down[2];
buffer=downseg[t];
Write_Data();
addr_buffer=addr_down[3]; //显示下排第3位
t=dis_down[3];
buffer=downseg[t];
buffer|=0x10;
Write_Data();
addr_buffer=addr_down[4]; //显示下排第4位
t=dis_down[4];
buffer=downseg[t];
Write_Data();
addr_buffer=addr_down[5]; //显示下排第5位
t=dis_down[5];
buffer=downseg[t];
Write_Data();
}
void Clear_up(void)
{
for(i=0;i<4;i++) //上排下排数码清除
{
dis_up[i]=10;
}
Display_up();
}
void Clear_down(void)
{
for(i=0;i<6;i++) //上排下排数码清除
{
dis_down[i]=10;
}
Display_down();
}
void Clear_right(void)
{
addr_buffer=addr_rights15;
buffer=0x00;
Write_Data();
addr_buffer=addr_rights14;
buffer=0x00;
Write_Data();
addr_buffer=addr_rights13;
buffer=0x00;
Write_Data();
addr_buffer=addr_rights31;
buffer=0x00;
Write_Data();
addr_buffer=addr_rights17;
buffer=0x00;
Write_Data();
}
void Clear_screen(void)
{
for(i=0;i<6;i++) //上排下排数码清除
{
dis_up[i]=10;
}
for(i=0;i<8;i++)
{
dis_down[i]=10;
}
Display_up();
Display_down();
addr_buffer=addr_rights15;
buffer=0x00;
Write_Data();
addr_buffer=addr_rights14;
buffer=0x00;
Write_Data();
addr_buffer=addr_rights13;
buffer=0x00;
Write_Data();
addr_buffer=addr_rights31;
buffer=0x00;
Write_Data();
addr_buffer=addr_rights17;
buffer=0x00;
Write_Data();
}
void Switching_Display(void)
{
Display_Init();
if(FLOW_RATE==1)
{
addr_buffer=addr_rights13; //%
buffer=0x01;
Write_Data();
//view=(unsigned long int)(Density*1000); //仪表系数;
//view_cnt=3;
}
else if(FLOW_UNIT>0)
{
switch(FLOW_UNIT)
{
case 1: //m3/s
addr_buffer=addr_rights15;
buffer=0x30;
Write_Data();
//view=(unsigned long int)(f*1000);//频率;
//view_cnt=1;
break;
case 2:
addr_buffer=addr_rights15; //m3/m
buffer=0x50;
Write_Data();
//view=(unsigned long int)(Q*1000);//瞬时流量;
//view_cnt=2;
break;
case 3:
addr_buffer=addr_rights15; //m3/h
buffer=0x14;
Write_Data();
//view=(unsigned long int)(QL*1000);//累计流量;
//view_cnt=3;
break;
case 4:
addr_buffer=addr_rights15; //m3/d
buffer=0x18;
Write_Data();
//view=(unsigned long int)(Diameter*1000); //仪表口径;
//view_cnt=1;
break;
case 5:
addr_buffer=addr_rights17; //l
buffer=0x10;
Write_Data();
addr_buffer=addr_rights15; ///s
buffer=0x20;
Write_Data();
//view=(unsigned long int)(Meter_coeffient*1000); //仪表系数;
//view_cnt=2;
break;
case 6:
addr_buffer=addr_rights17; //l
buffer=0x10;
Write_Data();
addr_buffer=addr_rights15; //m
buffer=0x40;
Write_Data();
//view=(unsigned long int)(Density*1000); //仪表系数;
//view_cnt=3;
break;
case 7:
addr_buffer=addr_rights17; //l
buffer=0x10;
Write_Data();
addr_buffer=addr_rights15; //h
buffer=0x04;
Write_Data();
//view=(unsigned long int)(Density*1000); //仪表系数;
//view_cnt=3;
break;
case 8:
addr_buffer=addr_rights17; //l
buffer=0x10;
Write_Data();
addr_buffer=addr_rights15; //d
buffer=0x08;
Write_Data();
//view=(unsigned long int)(Density*1000); //仪表系数;
//view_cnt=3;
break;
case 9:
addr_buffer=addr_rights17; //kg
buffer=0x20;
Write_Data();
addr_buffer=addr_rights15; //s
buffer=0x20;
Write_Data();
//view=(unsigned long int)(Density*1000); //仪表系数;
//view_cnt=3;
break;
case 10:
addr_buffer=addr_rights17; //kg
buffer=0x20;
Write_Data();
addr_buffer=addr_rights15; //m
buffer=0x40;
Write_Data();
//view=(unsigned long int)(Density*1000); //仪表系数;
//view_cnt=3;
break;
case 11:
addr_buffer=addr_rights17; //kg
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -