,将跳线J2调整为KBD模式
* 2.按键功能可参考按键处理函数:void key_proc(unsigned char key); * 日期版本:2012-9-4/V1.0a *******************************************************************************/ #include 'reg52.h' //定义51单片机特殊功能寄存器 #include 'onewire.h' //单总线函数库 #include 'absacc.h' unsigned char dspbuf[8] = {11,1,11,10,10,10,0,0}; unsigned char dspbuf1[8] = {11,10,10,10,10,11,10,10};//显示缓冲区 unsigned char dspcom = 0; unsigned char intr,intr1; unsigned char temper_flag = 0;//温度读取标志 code unsigned char tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff,0xbf}; unsigned char wendusheding[4]={3,0,2,0}; sbit LCD_E = P1^7; sbit RELAY = P0^4; unsigned char temperature; void display(void); void displayer(void); unsigned int tmax=30; unsigned int tmin=18; bit key_re; unsigned char key_press; unsigned char key_value; unsigned int low; unsigned int mid; unsigned int high; unsigned int modelflag; bit shezhi; bit model_low; bit model_mid; bit model_high; unsigned int model=0; bit flag; bit key_flag; unsigned char intr; void led(); unsigned char read_keyboard(void); void key_proc(unsigned char key); //主函数 void main(void) { unsigned char key_temp = 0xff; shezhi=0; TMOD |= 0x01; //配置定时器工作模式 TH0 = (65536-2000)/256; TL0 = (65536-2000)%256; EA = 1; ET0 = 1; //打开定时器中断 TR0 = 1; //启动定时器 while(1) { key_temp = 0xff; //清除旧键值 P0=0xff; if(temper_flag) { temper_flag = 0; if(rd_temperature()<50) temperature = rd_temperature(); //读温度 } //显示数据更新 if(key_flag) { key_flag = 0; key_temp = read_keyboard(); } if(temperature<50) { dspbuf[6] = temperature/10; dspbuf[7] = temperature%10; if(temperature<tmax){if(temperature>tmin) dspbuf[1]=1;else dspbuf[1]=0;} else dspbuf[1]=2; } led(); if(shezhi) { dspbuf1[1]=wendusheding[0]; dspbuf1[2]=wendusheding[1]; dspbuf1[6]=wendusheding[2]; dspbuf1[7]=wendusheding[3]; tmax= dspbuf1[1]*10 dspbuf1[2]; tmin=dspbuf1[6]*10 dspbuf1[7] ; } key_proc(key_temp); key_temp = 0xff; } } //定时器中断服务函数 void isr_timer_0(void) interrupt 1 //默认中断优先级 1 { TH0 = (65536-2000)/256; TL0 = (65536-2000)%256; //定时器重载 P2 &= 0x1f; P0 = 0xff; P2 = ((P2&0x1f)|0x80); P2 &= 0x1f; if(shezhi) displayer(); else display(); if( intr == 15) //2ms执行一次 { intr = 0; key_flag = 1; //20ms按键扫描标志位置1 temper_flag=1; modelflag ; if(modelflag==100)modelflag=0; } } void led() { if(dspbuf[1]==0)low ; else low=0; if(low == 25) { model_low=1; low =0; P0 = 0x00; P2 = ((P2&0x1f)|0xa0); P0 = 0x00; P2 = P2&0x1f; P0 = 0xff; } if(dspbuf[1]==1)mid ;else mid=0; if(mid == 25) { model_mid=1; mid=0; P0 = 0x00; P2 = ((P2&0x1f)|0xa0); P0 = 0x00; P2 = P2&0x1f; P0 = 0xff; } if(dspbuf[1]==2)high ; else high=0; if(high == 50) { model_high=1; high =0; P0 = 0x10; P2 = ((P2&0x1f)|0xa0); P0 = 0x10; P2 = P2&0x1f; P0 = 0xff; } if(model_mid) { model_mid = 0; if(modelflag==25) { P0 = 0xfe; P2 = ((P2&0x1f)|0x80); P2 &= 0x1f; P0 = 0xff; modelflag=0; } } if(model_low) { model_low = 0; if(modelflag==11) { P0 = 0xfe; P2 = ((P2&0x1f)|0x80); P2 &= 0x1f; modelflag=0; P0 = 0xff; } } if(model_high) { model_high = 0; if(modelflag==5) { P0 = 0xfe; P2 = ((P2&0x1f)|0x80); P2 &= 0x1f; P0 = 0xff; modelflag=0; } } if(tmax>tmin)flag=0; else flag=1; if(flag) { P0 = 0xfd; P2 = ((P2&0x1f)|0x80); P2 &= 0x1f; } } //读取矩阵键盘键值 unsigned char read_keyboard(void) { unsigned char key_temp; static unsigned char col; P3 = 0xf0; key_temp = (P3&0xf0); if(key_temp != 0xf0) //有按键按下 key_press ; else key_press = 0; //抖动 if(key_press == 3) { key_press = 0; key_re = 1; switch(key_temp) { case 0x70: col = 1; //第一列按键按下 break; case 0xb0: col = 2; //第二列按键按下 break; case 0xd0: col = 3; //第三列按键按下 break; case 0xe0: col = 4; //第四列按键按下 break; } P3 = 0x0f; key_temp = (P3&0x0f); switch(key_temp) { case 0x0e: key_value = (col-1); //第一行按键按下 break; case 0x0d: key_value = (3 col); //第二行按键按下 break; case 0x0b: key_value = (7 col); //第三行按键按下 break; case 0x07: key_value = (11 col); //第四行按键按下 break; } } //连续三次检测到按键被按下,并且该按键已经释放 P3 = 0x0f; key_temp = (P3&0x0f); if((key_re == 1) && (key_temp == 0x0f)) { key_re = 0; return key_value; } return 0xff; //无按键按下或被按下的按键未被释放 } //按键处理函数:S7,S11 void key_proc(unsigned char key) { unsigned int i; switch(key) { case 0: wendusheding[i]=1;i ; break; case 1: // wendusheding[i]=2;i ; break; case 2: // wendusheding[i]=3;i ; break; case 4: // wendusheding[i]=4;i ; break; case 5: // wendusheding[i]=5;i ; break; case 6: // wendusheding[i]=6;i ; break; case 8: // wendusheding[i]=7;i ; break; case 9: // wendusheding[i]=8;i ; break; case 10: // wendusheding[i]=9;i ; break; case 12: // shezhi=~shezhi; break; case 13: // wendusheding[i]=0;i ; break; case 14: // { dspbuf1[1]=10; dspbuf1[2]=10; dspbuf1[6]=10; dspbuf1[7]=10; wendusheding[0]=dspbuf1[1]; wendusheding[1]=dspbuf1[2]; wendusheding[2]=dspbuf1[6]; wendusheding[3]=dspbuf1[7]; i=0; } break; } } //显示函数 void display(void) { P0 = 0xff; P2 = ((P2&0x1f)|0xE0); P2 = P2&0x1f; P2 = ((P2&0x1f)|0xC0); P0 = 1<<dspcom; P2 = P2&0x1f; P0 = tab[dspbuf[dspcom]]; P2 = ((P2&0x1f)|0xE0); P2 = P2&0x1f; P0 = 0xff; if( dspcom == 8){ dspcom = 0; } } void displayer(void) { P0 = 0xff; P2 = ((P2&0x1f)|0xE0); P2 = P2&0x1f; P2 = ((P2&0x1f)|0xC0); P0 = 1<<dspcom; P2 = P2&0x1f; P0 = tab[dspbuf1[dspcom]]; P2 = ((P2&0x1f)|0xE0); P2 = P2&0x1f; P0 = 0xff; if( dspcom == 8){ dspcom = 0; } } |
|