📄 lcd128645.c
字号:
send_i(0x1); //清除所有显示
send_i(0x34); //扩展指令操作
send_i(0x30); //基本指令操作
}
//------------------------------------------
//查表函数,显示LOGO信息,
void qushu1(int counts,const unsigned char *ps)
{
int i; //定义循环变量
for(i=counts;i>0;i--) //循环counts次
{
send_d(*ps); //查表取数并调用显示一个字节数据函数送显示
delay(); delay(); delay(); delay(); delay(); //延长一定时间,确保能看到数据一个个的显示出来
ps++; //取下一个数据
}
}
//------------------------------------------
//查表函数,显示LOGO信息,
void qushu11(int counts,const unsigned char *ps)
{
int i; //定义循环变量
for(i=counts;i>0;i--) //循环counts次
{
send_d(*ps); //查表取数并调用显示一个字节数据函数送显示
//delay(); //延长一定时间,确保能看到数据一个个的显示出来
ps++; //取下一个数据
}
}
//-------------------------------------------
//显示一字节数据函数
void send_d(unsigned char x)
{
chk_busy(); //检测LCD是否工作繁忙
rs=1; //设置该字节数据是显示数据
rw=0; //设置该次操作为写
PORTD=x; //送数据口PORTD
e=1; //使能
nop();
nop();
nop();
e=0; //禁止
}
//--------------------------------------------
//送一字节命令代码函数
void send_i(unsigned char x)
{
chk_busy(); //检测LCD是否工作繁忙
rs=0; //设置该字节数据为控制命令
rw=0; //设置此次操作为写
PORTD=x; //送数据口PORTD
e=1; //使能
nop();
nop();
nop();
e=0; //禁止
}
void write_xy_d(unsigned char x, unsigned char d)
{
send_i(x);
send_d(d);
}
//-------------------------------------------
//检测LCD是否工作繁忙
void chk_busy()
{
busy=1; //先置位繁忙标志位
TRISD=0XFF; //更改通信为输入
rs=0; //设置该字节数据为命令代码
rw=1; //设置此次操作为读
while(busy)
{
nop();
nop();
nop();
e=1; //使能
nop();
nop();
nop();
if(!RD7) busy=0; //检测LCD是否工作繁忙
nop();
nop();
nop();
e=0; //禁止
}
e=0; //禁止
TRISD=0X00; //恢复通信为输出
}
/*
void adinitial()
{
ADCON0=0X49;
ADCON1=0X80;
PIE1=0X00;
PIE2=0X00;
ADIE=1;
PEIE=1;
TRISA1=1;
}
void interrupt adint(void)
{
ADIF=0;
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH;
uinttouchar(adresult.y1);
delay();
}
*/
//-------------------------------------------
//延时函数
void delay()
{
int i;
for(i=0;i<5535;i++)
{;}
}
//-------------------------------------------
//延时函数1
void delay1()
{
int i;
for(i=0;i<10;i++)
{
delay(); //调用延时函数
}
}
//------------------------------------------------
//按键扫描程序
void scan_key()
{
ADCON1=0X82; //设置A口为普通I/O口
TRISB=0X0F; //设置B口低4位为输入
TRISD=0X00; //设置D口全部为输出
PORTA=0XFF;
PORTD=0XFF; //先关闭所有显示
//TRISB=0X0F; //设置B口低4位为输入
result_key=0x5; //初始化按键扫描结果,无按键按下时的结果
if(RB0==0) //判断B0是否按下
{
delay1();
if (RB0==0) result_key=0x1;
if (RB0==0) k1=0x1;
}
if(RB1==0) //判断B1是否按下
{
delay1();
if(RB1==0) result_key=0x2;
if(RB1==0) k2=0x2;
}
if(RB2==0) //判断B2是否按下
{
delay1();
if(RB2==0) result_key=0x3;
if(RB2==0) k3=0x3;
}
if(RB3==0) //判断B3是否按下
{
delay1();
if(RB3==0) result_key=0x4;
if(RB3==0) k4=0x4;
}
}
//-------------------------------------------------
//结果显示程序
void display_key(int x)
{
switch(x) //根据X值的不同,跳转到相应的部分处理
{
case 0x1:
menu_main(); delay_key(); break; //B0 主菜单
case 0x2:
menu_down(); delay_key(); break; //B1 确定 按键
case 0x3:
menu_up(); delay_key(); break; //B2 移动 按键
case 0x4:
menu_close();delay_key(); break; //B3 取消 按键
default: break;
}
}
//------------------------------------------------------------------
//延时程序 键盘扫描
void delay_key() //延时程序
{
int i; //定义整形变量
for(i=0x100;i--;); //延时
}
//-------------------------------------------------------------------
void menu_main() //菜单 按键
{
show3();
write_xy_d(0x90,0x10); //第二行,>
}
//-------------------------------------------------------------------
void menu_down() //确定 按键
{
if (k1==0x1) //进入 菜单
if (k2==0x2) //确定 按键
{
if (cnt==0x0) TF_CHECK(); //指向> 通风压力设置
if (cnt==0x1) CN_CHECK(); //指向> 舱内压力设置
}
}
//-------------------------------------------------------------------
void menu_up() //移动 按键
{
if (k1==0x1) //进入菜单
if (k3==0x3) //移动键
{
if (cnt==0x1) //MENU: 下
{
write_xy_d(0x90,0x20); //清除第二行的 >
write_xy_d(0x88,0x10); //设置显示位置:第三行//> 舱内压力设置
}
if (cnt==0x0) //MENU: 下
{
write_xy_d(0x90,0x10); //设置显示位置:第二行//> 通风压力设置
write_xy_d(0x88,0x20); //清除第三行的 >
}
cnt++;
if (cnt>1) cnt=0;
}
}
//-------------------------------------------------------------------
void menu_close() //退出按键
{
result_key=0x0;
k1=0;
k2=0;
k3=0;
k4=0;
cnt=0;
//break;
}
//-------------------------------------------------------------------
void TF_CHECK() //通风压力检测
{
init_e();
ee_data_write[0]=n1;
ee_data_write[1]=j2;
write();
delay_e();
menu_close();
init(); //调用I/O口设置函数
lcd_init(); //调用LCD初始化函数
clear_p(); //调用清屏函数
}
//-------------------------------------------------------------------
void CN_CHECK() //舱内通风压力检测
{
init_e();
ee_data_write[0]=j1;
ee_data_write[1]=n2;
write();
delay_e();
menu_close();
init(); //调用I/O口设置函数
lcd_init(); //调用LCD初始化函数
clear_p(); //调用清屏函数
}
void init_e()
{
STATUS=0X0;
PORTD=0XFF;
ADCON1=0X02;
TRISC=0XFF;
//TRISA=0X00;
//TRISB=0X03;
//TRISD=0X00;
SSPADD=0X9;
SSPSTAT=0X80;
SSPCON=0X38;
}
void write()
{
int i;
i2c_idle();
SEN=1;
while(!SSPIF);
SSPIF=0;
SSPBUF=0XA0;
wrtacktest();
while(STAT_BF);
SSPBUF=address1;
wrtacktest();
while(STAT_BF);
for(i=0;i<2;i++)
{
SSPBUF=ee_data_write[i];
wrtacktest();
}
PEN=1;
nop();
SSPIF=0;
delay();
delay();
//PORTD=0XA4;
//PORTA=0X3E;
}
void read()
{
static volatile unsigned int i;
i2c_idle();
SSPIF=0;
SEN=1;
while(!SSPIF);
SSPIF=0;
SSPBUF=0XA0;
wrtacktest();
SSPBUF=address1;
wrtacktest();
i2c_idle();
SSPIF=0;
RSEN=1;
while(!SSPIF);
SSPIF=0;
SSPBUF=0XA1;
wrtacktest();
for(i=0;i<2;i++)
{
RCEN=1;
while(!SSPIF);
ee_date[i]=SSPBUF;
while(!SSPIF);
SSPIF=0;
if(i>=1)
{
ACKDT=1;
}
else
{
ACKDT=0;
}
ACKEN=1;
while(!SSPIF);
SSPIF=0;
}
PEN=1;
while(!SSPIF);
SSPIF=0;
}
void wrtacktest()
{
while(!SSPIF);
SSPIF=0;
}
void i2c_idle()
{
while(STAT_RW);
ZERO=0;
while(ZERO)
{
SSPCON2&0x1f;
}
}
void display_e()
{
int i;
i=ee_date[0]&0x0f;
PORTD=TABNUM[0];
delay();
i=ee_date[1]&0x0f;
PORTD=TABNUM[1];
delay();
}
void delay_e()
{
int i;
for(i=0;i<100;i++)
{;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -