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

2009-8-4 08:32 1858 0 分类: MCU/ 嵌入式

来源 CEPARK网站http://www.cepark.com/Index.html  作者: hnrain


#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
入口参数:无
出口参数:无
建立日期:2008年05月09日
修改日期:
函数作用: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
出口参数:无
建立日期:2008年05月09日
修改日期:
函数作用:发送字符串子函数
说    明:
********************************************************************/
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
出口参数:无
建立日期:2008年04月13日
修改日期:
函数作用:
说    明:
********************************************************************/
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
入口参数:无
出口参数:无
建立日期:2008年05月09日
修改日期:
函数作用: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
出口参数:无
建立日期:2008年4月13日
修改日期:
函数作用:写一个字节指令的到12864液晶,
说    明:
********************************************************************/
void Serial_send_cmd(uchar send_cmd)
{
  Serial_W_1byte_to_LCD(0, send_cmd);
}
/*******************************************************************
函 数 名:Serial_send_data
入口参数:cmd
出口参数:无
建立日期:2008年4月13日
修改日期:
函数作用:写一个字节数据到12864液晶,
说    明:
********************************************************************/
void Serial_send_data(uchar send_data)
{
  Serial_W_1byte_to_LCD(1, send_data);
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
0
关闭 站长推荐上一条 /3 下一条