| 
阅读权限90UID12帖子30精华2注册时间2013-2-26在线时间12 小时
 
  
 UID12帖子30精华2注册时间2013-2-26在线时间12 小时
 | 
| //ICC-AVR application builder : // Target : M16
 // Crystal: 8.0000Mhz
 // Author: Sunany
 
 #include <iom16v.h>
 #include <macros.h>
 #include <init.h>
 #include <RA8835.h>
 #include <ds18b20.h>
 
 #define uchar unsigned char
 #define uint unsigned int
 #define ulong unsigned long
 #define xtal 8.000000
 
 #define KEY_RST        key_set[3]
 #define KEY_DEL        key_set[7]
 #define KEY_SET        key_set[11]
 #define KEY_DOT        key_set[12]
 #define KEY_ESC        key_set[14]
 #define KEY_ENT        key_set[15]
 #define KEY_SUB        key_set[16]
 #define KEY_UP         key_set[17]
 #define KEY_CAL        key_set[18]
 #define KEY_MEA        key_set[19]
 #define KEY_LEF        key_set[20]
 #define KEY_DOW        key_set[21]
 #define KEY_RIG        key_set[22]
 
 #define BEE_ON         PORTD|=BIT(3)
 #define BEE_OFF        PORTD&=~BIT(3)
 
 #define FAN_ON         PORTD&=~BIT(1)
 #define FAN_OFF        PORTD|=BIT(1)
 
 #define LED_ON         PORTD&=~BIT(4)
 #define LED_OFF        PORTD|=BIT(4)
 
 
 unsigned char key_data;
 unsigned char key_show;
 unsigned char flag_timer0_10ms = 0;
 unsigned char data[4]={0};
 
 /*定义键值*/
 const unsigned char key_set[]=
 {
 1, 2, 3,18,
 4, 5, 6,19,
 7, 8, 9,20,
 10, 0,11,21,
 12,13,14,22,
 15,16,17,23
 };
 
 /*-------------------------------------------------------------------
 函数名称:按键读取函数
 输    出:按键值key
 其    它:按键行线,五行PA5 PA4 PA3 PA2 PA1 PA0
 按键列线,四列PB3 PB2 PB1 PB0
 DDRA 0b 0011 1111 0x3F
 DDRB 0b 0000 1111 0x0F
 DDRA 0b 1100 0000 0xC0
 DDRB 0b 1111 0000 0xF0
 -------------------------------------------------------------------*/
 unsigned char get_key(void)
 {
 unsigned char key_num;
 switch (PINA & 0x3F)         //清高两位为零PA0-PA5不变
 {
 case 0b00011111:
 key_num=0;
 break;
 case 0b00101111:
 key_num=4;
 break;
 case 0b00110111:
 key_num=8;
 break;
 case 0b00111011:
 key_num=12;
 break;
 case 0b00111101:
 key_num=16;
 break;
 case 0b00111110:
 key_num=20;
 break;
 }
 
 DDRA  |= 0x3F;           //置PA0-PA5为输出口
 PORTA &= 0xC0;           //置PA0-PA5为低电平
 
 DDRB  &= 0xF0;           //置PB0-PB3为输入口
 PORTB |= 0x0F;           //置PB0-PB3为带上拉输入
 
 delay_us(1);
 
 switch (PINB & 0x0F)    //清高四位为零PB0-PB4不变
 {
 case 0b00000111:
 key_num+=0;
 break;
 case 0b00001011:
 key_num+=1;
 break;
 case 0b00001101:
 key_num+=2;
 break;
 case 0b00001110:
 key_num+=3;
 break;
 default :
 key_num=255;
 break;
 }
 
 DDRA  &= 0xC0;           //置PA0-PA5为输入口
 PORTA |= 0x3F;           //置PA0-PA5为带上拉输入?
 
 DDRB  |= 0x0F;           //置PB0-PB3为输出口
 PORTB &= 0xF0;           //置PB0-PB3为低电平
 return(key_num);
 }
 
 /******************Timer0 interrupt function******************/
 #pragma interrupt_handler timer0_ovf_isr:10   //2ms溢出中断
 void timer0_ovf_isr(void)
 {
 static unsigned char CNT0=0;
 TCNT0 = 0x06;  //reload counter value
 CNT0++;
 if(CNT0==5)  //askdistance flag,every 10ms once
 {
 CNT0=0;
 flag_timer0_10ms = 1;
 //key=get_key();
 }
 }
 
 void BCD_Data_to_ASCII(uint i,uchar *data)
 {
 data[0]=i/1000+48;
 i=i%1000;
 data[1]=i/100+48;
 i=i%100;
 data[2]=i/10+48;
 i=i%10;
 data[3]=i+48;
 }
 
 /******************Speaker function******************/
 void speaker(unsigned int n)
 {
 unsigned int i;
 for(i=0;i<n;i++)
 {
 BEE_ON;     //开BEE
 delay_ms(5);
 BEE_OFF;    //关BEE
 }
 }
 
 /******************Fan function******************/
 void fan(void)
 {
 static unsigned int i=0;
 i++;
 if(i%2)
 {
 FAN_OFF;
 show_char(25,29, ":OFF");
 }
 else
 {
 i=0;
 FAN_ON;
 show_char(25,29, ":ON ");
 }
 
 }
 
 /*-------------------------------------------------------------------
 函数名称:中值滤波函数
 输    出:
 其    它:data 采集的数据
 cnt  采集的数据的个数>3
 -------------------------------------------------------------------*/
 /*unsigned int Avg_data(uint *data )
 {
 uchar count,i,j;
 uint value_buf[7];
 uint sum=0,temp;
 
 for (count=0;count<7;count++)
 {
 value_buf[count] =data[count];
 }
 
 for (j=0;j<6;j++)
 {
 for (i=0;i<6-j;i++)
 {
 if ( value_buf[i]>value_buf[i+1] )
 {
 temp = value_buf[i];
 value_buf[i] = value_buf[i+1];
 value_buf[i+1] = temp;
 }
 }
 }
 for(count=1;count<6;count++)
 sum += value_buf[count];
 return (uint)(sum/(5));
 }*/
 
 /*-------------------------------------------------------------------
 函数名称:温度显示函数
 输    出:温度值
 其    它:
 -------------------------------------------------------------------*/
 void LCD_Display_TEMP(void)
 {
 signed int TEMP;
 TEMP=readTempDS18B20();
 if(TEMP>0)
 {
 show_char_num(6,29,"+",1);
 }
 else
 {
 show_char_num(6,29,"-",1);
 TEMP=abs(TEMP);
 }
 BCD_Data_to_ASCII(TEMP,data);
 show_char_num(7,29,data+1,3);
 show_pixel(70,239,0);
 }
 /*-------------------------------------------------------------------
 函数名称:初始化屏显示函数
 输    出:
 其    它:
 -------------------------------------------------------------------*/
 void init_display(void)
 {
 show_pic(8,3,192,24,tab2,0);     //智能开发控制平台
 
 show_hzg(1,223,9,0);     //温
 show_hzg(3,223,10,0);    //度
 show_hzg(11,223,11,0);   //背
 show_hzg(13,223,12,0);   //光
 show_hzg(21,223,13,0);   //风
 show_hzg(23,223,14,0);   //扇
 show_char(31,29, "KEY:");
 show_char(5,29, ":   C");
 show_char(15,29, ":5");
 show_char(25,29, ":ON");
 }
 /****************************main function*******************************/
 void main(void)
 {
 init_devices();
 LED_ON;
 FAN_ON;
 BEE_ON;
 speaker(10);
 delay_ms(1000);
 LCD320_init();
 init_display();
 while(1)
 {
 
 show_pic(8,3,192,24,tab2,0);     //智能开发控制平台
 
 if(flag_timer0_10ms==1)
 {
 flag_timer0_10ms=0;
 key_data=key_set[get_key()];
 key_show=key_data+48;
 if(key_show<73)
 show_char_num(35,29,&key_show,1);
 }
 
 LCD_Display_TEMP();
 
 if(key_data==KEY_ENT)
 {
 fan();
 }
 
 if(key_data==KEY_RST)
 {
 lcd_cls(0);
 }
 
 if(key_data==KEY_SET)
 {//key=0;
 show_hzg(4,80,1,0);
 
 locate_xy(50,50);
 //locate_xy(x, y);         //光标定位
 write_cmd(csrform);      //光标形状设置
 write_dat(0x05);         //水平显示宽度6
 write_dat(0x07);         //线状光标显示,高度8
 write_cmd(csrdirr);      //光标向右方向移动
 write_cmd(dispon);       //显示状态开启
 write_dat(0x57);         //显示图像,光标1Hz闪烁
 }
 
 if(key_data==KEY_UP)
 {//key=0;
 show_hzg(6,80,2,0);
 }
 
 show_hzg(8,80,1,1);
 show_char(10, 5, "HELLO BABY LCD");
 
 show_char(10, 15, "Made by sunany");
 
 /*show_pixel(0, 0,0);
 show_pixel(10, 10,0);
 show_pixel(20, 20,0);
 show_pixel(30, 30,0);
 show_pixel(40, 40,0);
 show_pixel(41, 40,0);
 show_pixel(39, 40,0);
 delay_ms(500);
 show_pixel(39, 40,1);
 delay_ms(500);
 show_pixel(41, 40,1);
 delay_ms(500);
 show_pixel(40, 40,1);
 delay_ms(500);
 show_line(0,0,319,239,0);
 delay_ms(500);
 show_line(0,0,319,239,1);
 show_rectangle(25,25,60,60,0);
 show_circle(100,100,10,0);
 delay_ms(100);
 show_rectangle(25,25,60,60,1);
 show_circle(100,100,10,1);
 show_pic(2,50,216,14,tab1,0);
 delay_ms(1000);
 show_pic(2,50,216,14,tab1,1);
 
 show_hzg(2,80,0,1);
 delay_ms(1000);
 show_hzg(2,80,0,0);
 delay_ms(1000);
 show_hzg(4,80,1,1);
 delay_ms(1000);
 show_hzg(4,80,1,0);
 delay_ms(1000);
 show_hzg(6,80,2,1);
 delay_ms(1000);
 show_hzg(6,80,2,0);
 delay_ms(1000);
 show_hzg(8,80,3,1);
 delay_ms(1000);
 show_hzg(8,80,3,0);
 delay_ms(1000);
 show_hzg(10,80,4,1);
 delay_ms(1000);
 show_hzg(10,80,4,0);
 delay_ms(1000);
 show_hzg(12,80,5,1);
 delay_ms(1000);
 show_hzg(12,80,5,0);
 delay_ms(1000);
 show_hzg(14,80,6,1);
 delay_ms(1000);
 show_hzg(14,80,6,0);
 delay_ms(1000);
 show_hzg(16,80,7,1);
 delay_ms(1000);
 show_hzg(16,80,7,0);
 show_char(40, 15, "Made by sunany");
 
 //show_pic(0,100,tab2,0);
 //delay_ms(1000);
 //show_pic(0,100,tab2,1);
 //set_line(0,0,200,200,0);
 //show_pixel(150, 150,0);
 //show_pixel(200, 200,0);
 //show_pixel(0, 0,1);
 /*
 uchar temp=0;
 write_cmd(mread);
 delay_ms(10);
 temp = read_dat();
 putchar(temp);
 putchar(0x0d);  //Enter and return
 putchar(0x0a);
 delay_ms(500);*/
 }
 
 }
 | 
 |