AVR单片机实现电子时钟设计

来源:本站
导读:目前正在解读《AVR单片机实现电子时钟设计》的相关信息,《AVR单片机实现电子时钟设计》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《AVR单片机实现电子时钟设计》的详细说明。
简介:本文为大家提供一个基于AVR单片机实现电子时钟设计。

#include <avr/signal.h>

#include <avr/interrupt.h>

#include <avr/delay.h>

#include <avr/wdt.h>

#include <avr/eeprom.h>

#include <math.h>

#include <stdlib.h>

#include <string.h>

#define uchar unsigned char

#define uint unsigned int

#define xtal 8

#define CS PA5

#define SID PA6

#define SCLK PA7

#define Set_CS() DDRA |= (1<<CS);PORTA |= (1<<CS)

#define Set_SID() DDRA |= (1<<SID);PORTA |= (1<<SID)

#define Set_SCLK() DDRA |= (1<<SCLK);PORTA |= (1<<SCLK)

#define Clr_CS() DDRA |= (1<<CS);PORTA &=~(1<<CS)

#define Clr_SID() DDRA |= (1<<SID);PORTA &=~(1<<SID)

#define Clr_SCLK() DDRA |= (1<<SCLK);PORTA &=~(1<<SCLK)

#define HH 2 //定义 时 为2

#define MM 1 //定义 分 为1

#define SS 0 //定义 秒 为0

volatile unsigned char Time_h_m_s[3]={0,0,0}; //时间的 时 分 秒 存贮单元

volatile unsigned char flash_sign=0x00;

//====================================================================

//函数声明

void Delay(uint ms); //延时子程序

void Serial_W_1byte_to_LCD(uchar RS, uchar W_data);

void Serial_send_cmd(uchar send_cmd);

void Serial_send_data(uchar send_data);

void Write_8bits(uchar W_bits);

void LCD_Init(void);

void Serial_send_string_to_xy(uchar row, uchar col, uchar *p);

void Display_clock1(uchar row, uchar col, uchar *time);

/*=============================================================

功能: TIMER2溢出中断函数

=================================================================*/

SIGNAL(SIG_OUTPUT_COMPARE2) // _VECTOR(3)

{

static unsigned char half_second;

if((++half_second)>=2)

{

if((++Time_h_m_s[SS])>=60)

{

Time_h_m_s[SS] = 0;

if((++Time_h_m_s[MM])>=60)

{

Time_h_m_s[MM] = 0;

if((++Time_h_m_s[HH])>=24)

Time_h_m_s[HH] = 0;

}

}

half_second = 0x00;

}

flash_sign &= 0x01;

flash_sign ^= 0x01; //置位闪动标志位(该位为0时闪动)

}

/*******************************************************************

函 数 名:Port_init

入口参数:无

出口参数:无

建立日期:

修改日期:

函数作用:MCU端口初始化函数

说 明:

********************************************************************/

void Port_init(void)

{

DDRC = ~(1<<DDC6);

PORTC = 0x00;

ASSR |= (1<<AS2); //允许Timer2用TOSC1脚的时钟信号

TIMSK |= (1<<OCIE2); //允许定时器2比较匹配中断允许

TCCR2 |= (1<<WGM21)|(1<<CS22)|(1<<CS21); //CTC模式 ,256分频

OCR2 = 63;

}

/*******************************************************************

函 数 名:Serial_send_string

入口参数: *p_send_data

出口参数:无

建立日期:

修改日期:

函数作用:发送字符串子函数

说 明:

********************************************************************/

void Serial_send_string(uchar *p_send_data)

{

uchar *p_temp;

p_temp = p_send_data;

while(*p_temp != 0)

{

Serial_send_data(*p_temp++);

}

}

//========================

/********************************************************************

函 数 名:Serial_send_string_to_xy

入口参数:row,col,*p

出口参数:无

建立日期:

修改日期:

函数作用:

说 明:

********************************************************************/

void Serial_send_string_to_xy(uchar row, uchar col, uchar *p)

{

switch(row)

{

case 0:Serial_send_cmd(0x80+col);

break;

case 1:Serial_send_cmd(0x90+col);

break;

case 2:Serial_send_cmd(0x88+col);

break;

case 3:Serial_send_cmd(0x98+col);

break;

default: break;

}

while(*p != 0)

{

Serial_send_data(*p++); //写数据到RAM

}

}

/********************************************************************/

int main(void)

{

PORTA = 0XFF; //

DDRA = 0XFF; //PA口全部设为输出模式

Port_init();

Clr_CS();

Clr_SID();

Clr_SCLK();

LCD_Init();

Delay(10);

LCD_Init(); //初始化两边是关键,否则液晶上电重起将不能显示

sei(); //开总中断

while(1)

{

asm("nop");

asm("nop");

Serial_send_cmd(0x30); //基本指令集,,绘图显示OFF

//Serial_send_cmd(0x01); //清除显示

Serial_send_string_to_xy(0, 0, "现在时间:");

Display_clock1(1, 3,Time_h_m_s);

}

}

/*******************************************************************

函 数 名:LCD_Init

入口参数:无

出口参数:无

建立日期:

修改日期:

函数作用:12864液晶初始化函数

说 明:

********************************************************************/

void LCD_Init(void)

{

uchar cmd;

Delay(50);

cmd=0x30; //功能设置 8位数据,基本指令

Serial_send_cmd(cmd);

Delay(20);

cmd=0x0C; //显示状态 ON,游标OFF,反白OFF

Serial_send_cmd(cmd); //写指令

Delay(20);

cmd=0x01; //清除显示

Serial_send_cmd(cmd); //写指令

Delay(20);

cmd=0x02; //地址归位

Serial_send_cmd(cmd); //写指令

Delay(20);

cmd=0x80; //设置DDRAM地址

Serial_send_cmd(cmd); //写指令

Delay(20); //延时

}

/*******************************************************************

函 数 名:Serial_send_cmd

入口参数:cmd

出口参数:无

建立日期:

修改日期:

函数作用:写一个字节指令的到12864液晶,

说 明:

********************************************************************/

void Serial_send_cmd(uchar send_cmd)

{

Serial_W_1byte_to_LCD(0, send_cmd);

}

/*******************************************************************

函 数 名:Serial_send_data

入口参数:cmd

出口参数:无

建立日期:

修改日期:

函数作用:写一个字节数据到12864液晶,

说 明:

********************************************************************/

void Serial_send_data(uchar send_data)

{

Serial_W_1byte_to_LCD(1, send_data);

}

提醒:《AVR单片机实现电子时钟设计》最后刷新时间 2024-03-14 01:00:13,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《AVR单片机实现电子时钟设计》该内容的真实性请自行鉴别。