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

📄 lt-mini-m16-test.c

📁 AVR单片机c语言的开发板程序
💻 C
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd1602.h"
#include "ds1302.h"
#include "spi.h"
#include "usart.h"
#include "lcd12864.h"
#include "int.h"
#include "beep.h"
#include "adc.h"
#include "iic.h"
#include "ds18b20.h"
#include "smg.h"
#include "key.h"

static unsigned char DS1302_EXIST;

static volatile unsigned char init_date_p = 0;
static volatile unsigned char INITDATE[8]={0x30,	//秒
						   0x01,	//分
						   0x16,	//时 24小时制
						   0x02,	//日
						   0x11,	//月
						   0x07,	//星期
						   0x08,	//年
						   0x80		//写保护
						  };

static unsigned char sCURDATE[]="20xxYYxxMMxxDDxxHHxxmmxxSS Weekxx";
static unsigned char dis_buf[2][17] = 
{
	{"2008/08/08 0.00V\0"},
	{"08:08:08  00.0^C\0"},
};

static unsigned char smg_dis_buf[4] = {8,8,8,8};
static volatile char dis_flag = 1;//0:数码管与串口显示 1:1602显示
static volatile char hm_flag = 0;//0:显示分秒1:显示时分

int main(void)
{
	unsigned int temp,temp1 = 0;
	unsigned char temp2 = 0;

	init_key();
	init_1820();
	temp = gettemp();
	dis_buf[1][10] = (temp & 0xff) / 10 + '0';
	dis_buf[1][11] = (temp & 0xff) % 10 + '0';
	dis_buf[1][13] = (temp >> 8) % 10 + '0';

	init_int();
	LCD_Init();
	init_USART();
	init_SPI();
	DS1302_EXIST=check_RTC();//检测DS1302的存在
	if(DS1302_EXIST)
	{
		put_s("Send 'i' or 'I' to init time...");
		put_s("Send 'r' or 'R' to read cur-time...");
	}
	else
	{
		put_s("RTC not found!");
	}

	sei();//使能全局中断

	if(test_24c02())
	{
		beep_on();
		DisplayListChar(0,0,"AT24C02 test OK!");
		delay(30000);
		beep_off();
		delay(60000);
	}
	
	InitADC();

	while(1)
	{
		un_init_smg();//停止数码管扫描
		init_SPI();//初始化SPI
		read_date(sCURDATE);//读取时间
		un_init_SPI();//关闭SPI

		if(!dis_flag)//数码管显示
		{
			if(get_key(0))
			{
				delay(1000);//延时消抖
				if(get_key(0))
				{
					while(get_key(0));//等待按键抬起
					hm_flag = 1;//显示时分
				}
			}
			if(get_key(1))
			{
				delay(1000);//延时消抖
				if(get_key(1))
				{
					while(get_key(1));//等待按键抬起
					hm_flag = 0;//显示分秒
				}
			}

			if(hm_flag)//显示时分
			{
				smg_dis_buf[0] = sCURDATE[14] - '0';
				smg_dis_buf[1] = sCURDATE[15] - '0' + 0x10;

				smg_dis_buf[2] = sCURDATE[18] - '0';
				smg_dis_buf[3] = sCURDATE[19] - '0';
			}
			else//显示分秒
			{
				smg_dis_buf[0] = sCURDATE[18] - '0';
				smg_dis_buf[1] = sCURDATE[19] - '0' + 0x10;

				smg_dis_buf[2] = sCURDATE[22] - '0';
				smg_dis_buf[3] = sCURDATE[23] - '0';
			}

			write_smg(smg_dis_buf);
		}

		if(dis_buf[1][7] != sCURDATE[23])//秒更新
		{
			temp1 = get_temp(temp2);
			if((temp1 & 0xff) < 35)
			{
				dis_buf[1][10] = (temp1 & 0xff) / 10 + '0';
				dis_buf[1][11] = (temp1 & 0xff) % 10 + '0';
				dis_buf[1][13] = (temp1 >> 8) % 10 + '0';
			}
			temp2 ^= 1;
			
			dis_buf[0][0] = sCURDATE[0];
			dis_buf[0][1] = sCURDATE[1];
			dis_buf[0][2] = sCURDATE[2];
			dis_buf[0][3] = sCURDATE[3];
		
			dis_buf[0][5] = sCURDATE[6];
			dis_buf[0][6] = sCURDATE[7];
		
			dis_buf[0][8] = sCURDATE[10];
			dis_buf[0][9] = sCURDATE[11];
		
			dis_buf[1][0] = sCURDATE[14];
			dis_buf[1][1] = sCURDATE[15];
		
			dis_buf[1][3] = sCURDATE[18];
			dis_buf[1][4] = sCURDATE[19];

			dis_buf[1][6] = sCURDATE[22];
			dis_buf[1][7] = sCURDATE[23];

			temp = ReadADC();
			temp = (temp  * 50) / 20;
			dis_buf[0][11] = temp / 1000 + '0';
			dis_buf[0][13] = temp % 1000 / 100 + '0';
			dis_buf[0][14] = temp % 100 / 10 + '0';
			
			if(dis_flag & 0x01)//液晶显示
			{
				DisplayListChar(0,0,dis_buf[0]);
				DisplayListChar(0,1,dis_buf[1]);
			}
			else//串口与数码管
			{
				put_s(dis_buf[0]);
				put_s(dis_buf[1]);
			}
		}
		
		delay(2000);
	}
}

SIGNAL(SIG_USART_RECV) //串口接收中断服务程序
{
	unsigned char command;
	command=UDR;
	switch(command)
	{
		case 'I':
		case 'i':
		{
			if (DS1302_EXIST)
			{
				init_date_p = 0x1d;
			}
			else
			{
				put_s("RTC not fund!");
			}
			break;
		}
		case 'R':
		case 'r':
		{
			if (DS1302_EXIST)
			{
				put_s("Reading cur-time...");
				init_SPI();
				read_date(sCURDATE);
				put_s(sCURDATE);
			}
			else
			{
				put_s("RTC not fund!");
			}
			break;
		}
		case 'E':
		case 'e':
		{
			if(init_date_p == 0x0f)
			{
				init_date_p = 0;

				put_s("RTC initing...");
				init_SPI();
				init_RTC(INITDATE);
				read_date(sCURDATE);
				put_s(sCURDATE);
			}
			break;
		}
		case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
		{
			if(init_date_p >= 0x10)
			{
				command -= '0';
				if(init_date_p & 0x01)
				{
					INITDATE[(init_date_p & 0x0f) >> 1] = command << 4;
				}
				else
				{
					INITDATE[(init_date_p & 0x0f) >> 1] += command & 0x0f;
				}
				init_date_p --;
			}
			break;
		}
		default:
		{
			break;
		}
	}
}

SIGNAL(SIG_INTERRUPT0)//INT0中断服务程序
{
	delay(5000);
	if(PIND & (1 << PD2))
	{
		while(PIND & (1 << PD2));
		beep_on();
		delay(10000);
		beep_off();
		dis_flag = 1;//开1602显示
		LCD_Init();
	}
}

SIGNAL(SIG_INTERRUPT1)//INT1中断服务程序
{
	delay(5000);
	if(!(PIND & (1 << PD3)))
	{
		while(!(PIND & (1 << PD3)));
		beep_on();
		delay(10000);
		beep_off();
		dis_flag = 0;//开数码管显示
		write_smg(smg_dis_buf);
	}
}

⌨️ 快捷键说明

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