📄 znk030305.c
字号:
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 + -