⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 znk030305.c

📁 avr C语言例程,用于温湿度采样控制,LCD控制
💻 C
📖 第 1 页 / 共 2 页
字号:
		delay_us(10);
		SCLK = 0;
	}


	IO_DATA_DDR = IN;
	k++;
	delay_us(1);

	for (i=0;i<bytecnt;i++) {
		tmp = 0;
		for(j=0;j<8;j++) {
			mybit = IO_DATA_PIN;  //下降沿
			k++;
			    
			ch = mybit;
			ch = ch<<j;
			tmp |= ch;
			
			SCLK = 1;
			k++;
			k++;      
  		        delay_us(10);
  		        
			SCLK = 0;
			delay_us(10);
		}
                data[i] = tmp;
	}

RST(0);
}





//0---9:  '0'---'9'
//a    :  '+'
//b    :  '-'
//c    :  '.'
//d
//e
//f
unsigned char AsciiToBCD(unsigned char *asc)
{
	unsigned char ch,ch1,value;

	if ( asc[1]>='0' && asc[1]<='9' )	ch = asc[1]-'0'; //低位
    else if ( asc[1] == '+' )           ch = 0xa;
	else if ( asc[1] == '-' )           ch = 0xb;
	else if ( asc[1] == '.' )           ch = 0xc;
	else                                ch = 0xd;

	//ch1 = asc[0]-'0'; //高位  
	if ( asc[0]>='0' && asc[0]<='9' )	ch1 = asc[0]-'0'; //高位
    else if ( asc[0] == '+' )           ch1 = 0xa;
	else if ( asc[0] == '-' )           ch1 = 0xb;
	else if ( asc[0] == '.' )           ch1 = 0xc;
	else                                ch1 = 0xd;
	
    value = ch1<<4;
    value += ch;
    return value;
}

void BCDToAscii(unsigned char bcd,char *asc)
{
	unsigned char ch;

	ch = bcd&0xf0;
	ch >>=4;
	if ( ch>=0 && ch<=9 ) asc[0] = ch+'0';
	else if ( ch==0xa )   asc[0] = '+';
	else if ( ch==0xb )   asc[0] = '-';
	else if ( ch==0xc )   asc[0] = '.';
	else                  asc[0] = '?';
	
	ch = bcd&0x0f;
	if ( ch>=0 && ch<=9 ) asc[1] = ch+'0';
	else if ( ch==0xa )   asc[1] = '+';
	else if ( ch==0xb )   asc[1] = '-';
	else if ( ch==0xc )   asc[1] = '.';
	else                  asc[1] = '?';
}


void SetTime(char *datetime)
{
	//yyyymmddhh24misi;
	unsigned char arr[20];

	arr[0] = 0xbe; //命令码
	//BCD码
	arr[1] = AsciiToBCD(&datetime[12]); //秒
	arr[2] = AsciiToBCD(&datetime[10]);//分
	arr[3] = AsciiToBCD(&datetime[8]);//时,24
	arr[4] = AsciiToBCD(&datetime[6]);//日期
	arr[5] = AsciiToBCD(&datetime[4]);//月
	arr[6] = 0x07;//星期日
	arr[7] = AsciiToBCD(&datetime[2]);//年,两位
	arr[8] = 0x00;//写保护

    HT1380_SendByte(9,arr);
}
unsigned char clockstate=0;
int GetTime(char *datetime)
{
	//yyyymmddhh24misi;
	unsigned char arr[20];
	//static unsigned char first=0;
	int i;
	

        HT1380_RecvByte(0xbf,8,arr);

	datetime[0]='2';
	datetime[1]='0';
	BCDToAscii(arr[6],&datetime[2]); //年
	BCDToAscii(arr[4],&datetime[4]); //月
	BCDToAscii(arr[3],&datetime[6]); //日期
	BCDToAscii(arr[2],&datetime[8]); //时
	BCDToAscii(arr[1],&datetime[10]); //分
	BCDToAscii(arr[0],&datetime[12]); //秒
	datetime[14] = '\0';

	for (i=0;i<14;i++) {
		if ( datetime[i]<'0' || datetime[i]>'9' ) break;
	}
	if ( i >= 14 ) {
		clockstate = 0;
		return 0;
	}
	else {  //用定时器的值
		sprintf(str,"%d",t.year);
		strcpy(datetime,str);
		sprintf(str,"%d",t.month);
		if ( t.month < 10 ) {
			datetime[4] = '0';
			datetime[5] = str[0];
		}  else {
			datetime[4] = str[0];		
			datetime[5] = str[1];
		}
		sprintf(str,"%d",t.date);
		if (  t.date < 10 ) {
			datetime[6] = '0';
			datetime[7] = str[0];
		} else {
			datetime[6] = str[0];
			datetime[7] = str[1];
		}
		sprintf(str,"%d",t.hour);
		if (  t.hour < 10 ) {
			datetime[8] = '0';
			datetime[9] = str[0];
		} else {
			datetime[8] = str[0];
			datetime[9] = str[1];
		}       
		sprintf(str,"%d",t.minute);
		if (  t.minute < 10 ) {
			datetime[10] = '0';
			datetime[11] = str[0];
		} else {
			datetime[10] = str[0];
			datetime[11] = str[1];
		}
		sprintf(str,"%d",t.second);
		if (  t.second < 10 ) {
			datetime[12] = '0';
			datetime[13] = str[0];
		} else {
			datetime[12] = str[0];
			datetime[13] = str[1];
		}
		datetime[14] = '\0';

		/*if ( clockstate == 0 ) {
			sprintf(tmpstr,"clock error");
			SendAlarm(ERROR_CLOCK,SERIOUS_ALARM,tmpstr);
			clockstate = 1;
		} */

		return 0;
	}
//	sprintf(str,"arr:%x %x %x %x %x %x",arr[6],arr[4],arr[3],arr[2],arr[1],arr[0]);
//	myputs(str);
}
//**************************************************************************//
//**************************************************************************// 
//----------------------------------LCD显示---------------------------------//
/*------------------延时子程序-----------------------------*/
delay(int t)
{
int i,j;
   for(i=0;i<t;i++)
     for(j=0;j<10;j++);

}
void _E(unsigned char x)  //LCD的E信号,用PORTF.3控制,由于PORTF不能位操作,所以要对整个PORTF口操作
{
	if (x == 0) PORTF &= 0xF7; //PORTF.3置0
	else PORTF |= 0x08;       //PORTF.3置1
} 
/*------------------写命令到LCD------------------------------*/
void write_com(unsigned char c)
{

unsigned char in;
_E(0);//
di=0;
rw=0;

lcd_data=c;  //写好命令至LCD
delay(1);
_E(1);
delay(1);
_E(0);
delay(1);
} 
/*-------------------写数据到LCD----------------------------*/

void write_data(unsigned char d)
{

unsigned char in;
_E(0);
di=1;
rw=0;
//delay_ms(1);
lcd_data=d;  //写命令至LCD
delay(1);
_E(1);
delay(1);
_E(0);
delay(1);
}  
/*------------------清屏---------------*/
void clr_scr()
{  int j,k;
write_com(0xc0);          //start page
write_com(0xb8);          //start line
write_com(0x40);          //start col
csa=1;
csb=1;
 for(k=0;k<9;k++)
 {
  write_com(0xb8+k);
  for(j=0;j<64;j++)
  {
   write_com(0x40+j);
   write_data(0x00);
  }

 }
} 
/*------------------初始化LCD清屏--------------------------*/
void init_lcd()
{  int k,i=1;
   
   //delay_ms(1);
   csa=0;       //注意初始化时CS的选择
   csb=1;
   
   write_com(0x3F);
   write_com(0xc0);
   clr_scr();
   csa=1;       //注意初始化时CS的选择
   csb=0;
   write_com(0x3F);
   write_com(0xc0);
   clr_scr();
}
/*---------------------显示汉字----------------------------*/
//一个汉字占用的空间是16*16 ,一行对应8个点,一列对应1个点,所以一个汉字占用2行,16列
//pag是开始行数,col是开始列数,hzk[]是字库数组,n是要显示的字在字库数组里的序号


void hz_disp(char pag,char col,char n,char hzk[]) 

{
 char j=0;
   write_com(0x40+col);
   write_com(0xb8+pag);
   for(j=0;j<16;j++){
   write_data(hzk[j+32*n]);
   }
   write_com(0x40+col);
   write_com(0xb8+pag+1);
   for(j=16;j<32;j++){
   write_data(hzk[j+32*n]);
   }
}
/*---------------------显示字母和数字以及符号----------------------------*/
//一个字母和数字以及符号占用的空间是8*16 ,一行对应8个点,一列对应1个点,所以一个字母占用2行,8列
//pag是开始行数,col是开始列数,hzk[]是字库数组,n是要显示的字在字库数组里的序号
void hz_disp1(char pag,char col,char n,char hzk[])
{
char j=0;
   write_com(0x40+col);
   write_com(0xb8+pag);
   for(j=0;j<8;j++){
   write_data(hzk[j+16*n]);
   }
   write_com(0x40+col);
   write_com(0xb8+pag+1);
   for(j=8;j<16;j++){
   write_data(hzk[j+16*n]);
   }
}

float t_C,rh_lin,rh_true; 
/*-----------------显示例程---------------------------------*/
//LCD是128*64,分为2屏,每屏是64*64 
//            -------------------
//            |  节能控|制系统  |
//            |  time: |xx:xx:xx|
//            |        |        |
//            |        |        |
//            |  第1屏 | 第2屏  | 
//            -------------------
disp_hz_1()
{
   float xshu;

   csa=1; //第1屏显示
   csb=0;  
   
   hz_disp(0,16,0,cod1);//0 1行,16~31列,显示“节”字
   hz_disp(0,32,1,cod1);//0 1行,32~47列,显示“能”字
   hz_disp(0,48,2,cod1);//0 1行,48~63列,显示“控”字
   csa=0; //第2屏显示
   csb=1;
   hz_disp(0,0,3,cod1);//0 1行,0~15列,显示“制”字
   hz_disp(0,16,4,cod1);//0 1行,16~31列,显示“系”字
   hz_disp(0,32,5,cod1);//0 1行,32~47列,显示“统“字
   
   
   csa=1; //第1屏显示
   csb=0; 
   
   hz_disp1(2,16,3,cod4); //2 3行,16~23列,显示“t“字
   hz_disp1(2,24,8,cod3); //2 3行,24~31列,显示“i“字
   hz_disp1(2,32,12,cod3);//2 3行, 32~39列,显示“m“字
   hz_disp1(2,40,4,cod3); //2 3行,40~47列,显示“e“字
   hz_disp1(2,48,10,cod2);//2 3行,48~55列,显示“:“字
   csa=0; //第2屏显示时间
   csb=1; 
   hz_disp1(2,0,datetime2[8],cod2); 
   hz_disp1(2,8,datetime2[9],cod2);
   hz_disp1(2,16,10,cod2);
   hz_disp1(2,24,datetime2[10],cod2); 
   hz_disp1(2,32,datetime2[11],cod2);
   hz_disp1(2,40,10,cod2); 
   hz_disp1(2,48,datetime2[12],cod2); 
   hz_disp1(2,56,datetime2[13],cod2); 
   
   csa=1; //第1屏显示
   csb=0; 
   
   hz_disp1(4,16,3,cod4); //2 3行,16~23列,显示“t“字
   hz_disp1(4,24,4,cod3); //2 3行,24~31列,显示“e“字
   hz_disp1(4,32,12,cod3);//2 3行, 32~39列,显示“m“字
   hz_disp1(4,40,15,cod3); //2 3行,40~47列,显示“p“字
   hz_disp1(4,48,10,cod2);//2 3行,48~55列,显示“:“字
   csa=0; //第2屏显示
   csb=1; 
   t_C*=10;
   xshu=modf(t_C,str1);
   ftoa(str1[0],1,str2);
   hz_disp1(4,0,str2[0],cod2); 
   hz_disp1(4,8,str2[1],cod2);
   hz_disp1(4,16,11,cod2);
   hz_disp1(4,24,str2[2],cod2);
   //ftoa(rh_true,1,str2);

}


void main( )
{  
 unsigned char HUMI,TEMP;unsigned char error,checksum,a,b;
 HUMI=0X01;TEMP=0X02;
  port_init(); //io初始化
  InitExMem();
  init_lcd();
  clr_scr();
  //InitHt1380();
  //sprintf(datetime1,"20090310152600");
  //SetTime(datetime1);      
  s_connectionreset();
    delay_ms(300);	
  while(1)
  { 
   s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);  //湿度测量
   s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);  //温度测量  
   humi_val.f=(float)humi_val.i;                   //转换为浮点数
   temp_val.f=(float)temp_val.i;                   //转换为浮点数
   calc_sth11(&humi_val.f,&temp_val.f);   
   GetTime(datetime2);
   disp_hz_1();
   run_led=1; 
   delay_ms(1000);
   run_led=0;
   delay_ms(1000);
   
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -