- 阅读权限
- 90
- UID
- 12
- 帖子
- 30
- 精华
- 2
- 注册时间
- 2013-2-26
- 在线时间
- 12 小时
- UID
- 12
- 帖子
- 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);*/
}
} |
|