完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1 条评论
2个回答
|
|
楼主还是直接将文件晒一下吧 以前也有坛友遇到过类似的情况 其中有的是由于字符块的原因造成的
|
|
|
|
这是源程序: #include #include #include #include #include #include #include extern uchar DISPLAY_ILLUMINATION[]; extern unsigned char DISPLAY_HUMIDITY[]; void display_first() { diaplay_temperature(); sth1[2]=DISPLAY_TEMPERATURE[0]; sth1[3]=DISPLAY_TEMPERATURE[1]; sth1[4]=DISPLAY_TEMPERATURE[2]; sth1[5]=DISPLAY_TEMPERATURE[3]; display_humidity1(); sth2[3]=RH_T_TEMP[0]; sth2[4]=RH_T_TEMP[1]; LCD_DISPLAY(2,&sth2); display_illumination1(); sth3[6]=DISPLAY_ILLUMINATION[0]; sth3[7]=DISPLAY_ILLUMINATION[1]; sth3[8]=DISPLAY_ILLUMINATION[2]; sth3[9]=DISPLAY_ILLUMINATION[3]; sth3[10]=DISPLAY_ILLUMINATION[4]; LCD_DISPLAY(0,&sth0); LCD_DISPLAY(1,&sth1); LCD_DISPLAY(2,&sth2); LCD_DISPLAY(3,&sth3); } void main() { initial_12864(); LCD_DISPLAY(0,&sth0); LCD_DISPLAY(1,&sth1); LCD_DISPLAY(2,&sth2); LCD_DISPLAY(3,&sth3); read_eeprom(); while(1) { if(adjust==0) { display_first(); } keyboard(); } } #ifndef __E2PROM_h__ #define __E2PROM_h__ #define RdCommand 0x01 //定义ISP的操作命令 #define PrgCommand 0x02 #define EraseCommand 0x03 #define error 0 #define ok 1 #define WaitTime 0x01 //定义CPU的等待时间 sfr ISP_DATA=0xe2; //寄存器申明 sfr ISP_ADDRH=0xe3; sfr ISP_ADDRL=0xe4; sfr ISP_CMD=0xe5; sfr ISP_TRIG=0xe6; sfr ISP_CONTR=0xe7; char settempH,settempL;//设置温度的上限值、下限值 char setwetH,setwetL; //设置湿度值 //char setlightH,setlightL; //设置照度 /**************打开 ISP,IAP 功能 ********* */ void ISP_IAP_enable(void) { //EA = 0; //关中断 ISP_CONTR = ISP_CONTR & 0x18; // 0001,1000 ISP_CONTR = ISP_CONTR | WaitTime; // 写入硬件延时 ISP_CONTR = ISP_CONTR | 0x80; // ISPEN=1 } /************** 关闭 ISP,IAP 功能 *************** */ void ISP_IAP_disable(void) { ISP_CONTR = ISP_CONTR & 0x7f; // ISPEN = 0 ISP_TRIG = 0x00; //EA = 1; // 开中断 } /*****************公用的触发代码********* */ void ISPgoon(void) { ISP_IAP_enable(); //打开 ISP,IAP 功能 ISP_TRIG = 0x46; //触发ISP_IAP命令字节1 ISP_TRIG = 0xb9; //触发ISP_IAP命令字节2 _nop_(); } /**********字节读 *********** */ unsigned char byte_read(unsigned int byte_addr) { //EA = 0; ISP_ADDRH = (unsigned char)(byte_addr >> 8); // 地址赋值 ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; //清除低3位 ISP_CMD = ISP_CMD | RdCommand; // 写入读命令 ISPgoon(); //触发执行 ISP_IAP_disable(); // 关闭ISP,IAP功能 //EA = 1; return (ISP_DATA); // 返回读到的数据 } /************ 扇区擦除*********** */ void SectorErase(unsigned int sector_addr) { unsigned int iSectorAddr; iSectorAddr = (sector_addr & 0xfe00); // 取扇区地址 ISP_ADDRH = (unsigned char)(iSectorAddr >> 8); ISP_ADDRL = 0x00; ISP_CMD = ISP_CMD & 0xf8; //清空低3位 ISP_CMD = ISP_CMD | EraseCommand; //擦除命令3 ISPgoon(); //触发执行 ISP_IAP_disable(); //关闭ISP,IAP功能 } /********** 字节写 ******* */ void byte_write(unsigned int byte_addr, unsigned char original_data) { //EA = 0; SectorErase(byte_addr); ISP_ADDRH = (unsigned char)(byte_addr >> 8); // 取地址 ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; // 清低3位 ISP_CMD = ISP_CMD | PrgCommand; //写命令2 ISP_DATA = original_data; //写入数据准备 ISPgoon(); //触发执行 ISP_IAP_disable(); //关闭IAP功能 //EA =1; } /**********把数据保存到单片机内部eeprom中**************/ void write_eeprom() //保存数据 { SectorErase(0x8000); byte_write(0x8001, settempH); byte_write(0x8002, settempL); byte_write(0x8003, setwetH); byte_write(0x8004, setwetL); } /******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom() //读出保存数据 { settempH = byte_read(0x8001); settempL = byte_read(0x8002); setwetH = byte_read(0x8003); setwetL = byte_read(0x8004); } #endif //已用端口:P2.5,P2.6,P2.7,P3.2,P3.4,P0 #ifndef __LCD12864_h__ #define __LCD12864_h__ #include #include #define uchar unsigned char #define uint unsigned int #define LCD_DATA P0 ***it LCD_RS=P2^6; ***it LCD_RW=P2^5; ***it LCD_EN=P2^7; ***it LCD_PSB=P3^2; ***it LCD_RES=P3^4; /***********延时xms************* void delay_xms(uint a) { uint i,j; for(i=a;i>0;i--) for(j=110;j>0;j--); } ******************************/ //******************************* /**************延时1ms***********/ void delay1ms() { unsigned char i,j; for(i=0;i<4;i++) for(j=0;j<33;j++);//(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 } /***********延时xms**************************/ void delay_xms(uchar n) { unsigned char i; for(i=0;i } /***************************************************** /*********判忙*****************/ bit check_busy() { bit busy; LCD_RS=0; LCD_RW=1; LCD_EN=1; delay_xms(2); busy=(bit)(LCD_DATA&0X80); LCD_EN=0; return busy; } //等待LCD空闲 void wait() { while(check_busy()); } //****************************** /*************写指令************/ void write_cmd(uchar cmd) { wait(); LCD_RS=0; LCD_RW=0; LCD_EN=0; delay_xms(2); LCD_DATA=cmd; LCD_EN=1; delay_xms(2); LCD_EN=0; } //******************************* /*************写数据***************/ void write_data(uchar dat) { wait(); LCD_RS=1; LCD_RW=0; LCD_EN=0; delay_xms(5); LCD_EN=1; LCD_DATA=dat; delay_xms(10); LCD_EN=0; } //************************************* /***********LCD_12864初始化*************/ void initial_12864() { delay_xms(40); LCD_PSB=1; delay_xms(1); LCD_RES=0; delay_xms(1); LCD_RES=(1); write_cmd(0x30);//基本指令 delay_xms(10); write_cmd(0x0c);//开显示,关光标 delay_xms(10); write_cmd(0x01);//清屏 delay_xms(10); } //************************************** /***********字符串写入地址**************/ void LCD_POS(uchar X) { uchar pos; if(X==0) {X=0x80;} if(X==1) {X=0x90;} if(X==2) {X=0x88;} if(X==3) {X=0x98;} pos=X; write_cmd(pos); } //***************************************** /***************字符串写入显示**************/ unsigned char LCD_DISPLAY(uchar x, uchar *DATA) { int i=0; LCD_POS(x); while(DATA[i]!=' |