原创 AVR 与 12864 做的时钟

2008-5-9 21:12 4147 14 14 分类: MCU/ 嵌入式
代码:
20:03 2008-5-9#include <avr/io.h>
#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);
}



/*******************************************************************
函 数 名:Serial_Serial_W_1byte_to_LCD_to_LCD
入口参数:RW、RS、W_data
出口参数:无
建立日期:2007年3月3日
修改日期:
函数作用:写一个字节的数据到12864液晶,包括指令和数据
说    明:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶;
   (一般RW都设为0,即只向液晶写数据,不读数据)
          RS=1,写入的是数据;RS=0,写入的是指令;
    一般模式:RW=0,RS=1;写数据
       RW=0,RS=0;写指令
********************************************************************/
void Serial_W_1byte_to_LCD(uchar RS, uchar W_data)
{
 uchar H_data,L_data,S_ID = 0xf8;  //11111 RWRS 0
 
 if(RS == 0)
  {
    S_ID &= ~0x02;
  }
 else     //if(RS==1)
  {
    S_ID |= 0X02;
  }
 H_data = W_data;
 H_data &= 0xf0;   //屏蔽低4位的数据
 L_data = W_data;  //xxxx0000格式
 L_data <<= 4;     //xxxx0000格式
 L_data &= 0xf0;   //屏蔽高4位的数据
    
 Set_CS();
 asm("nop");
 asm("nop");
 Write_8bits(S_ID);   //发送S_ID
 asm("nop");
 Write_8bits(H_data); //发送H_data
 asm("nop");
 Write_8bits(L_data); //发送L_data
 asm("nop");
 Clr_CS(); 
}
/********************************************************************
函 数 名:Write_8bits
入口参数:W_bits
出口参数:无
建立日期:2007年3月3日
修改日期:
函数作用:负责串行输出8个bit位
说    明:
********************************************************************/
void Write_8bits(uchar W_bits)
{
 uchar i,Temp_data;
 Temp_data = W_bits;
 for(i=0; i<8; i++)
 {  
   if((Temp_data&0x80)==0)
    {
      Clr_SID();
    }
   else
    {
     Set_SID();
    } 
   asm("nop");
   asm("nop");   
   Set_SCLK();
   asm("nop");
   asm("nop");   
   Clr_SCLK();
   asm("nop");
   asm("nop");  
   Temp_data <<= 1;  
 }
 Clr_SID();
}
/********************************************************************
函 数 名:Delay
入口参数:ms
出口参数:无
建立日期:2007年3月3日
修改日期:
函数作用:毫秒级的延时程序,当晶振为12Mhz时,xtal=12;
说    明:
********************************************************************/
void Delay(uint ms) 

    uint i; 
    while(ms--)    
   { 
     for(i=1;i<(uint)(xtal*143-2);i++) 
         ; 
   }   
}

/********************************************************************
函 数 名:Display_clock1
入口参数:row,col,*time
出口参数:无
建立日期:2008年05月09日
修改日期:
函数作用:
说    明:
********************************************************************/
void Display_clock1(uchar row, uchar col, uchar *time) 

  unsigned char  c_data[16];
  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;
    }
        
    utoa(time[HH]/10,c_data,10);
    Serial_send_string(c_data);
        utoa(time[HH]%10,c_data,10);
    Serial_send_string(c_data);
        
        if(flash_sign==0x00)
         Serial_send_string(":");
        else
     Serial_send_string(" ");    
        
        utoa(time[MM]/10,c_data,10);
    Serial_send_string(c_data);
        utoa(time[MM]%10,c_data,10);
    Serial_send_string(c_data);
        
        if(flash_sign==0x00)
         Serial_send_string(":");
        else
     Serial_send_string(" ");  
        
        utoa(time[SS]/10,c_data,10);
    Serial_send_string(c_data);
        utoa(time[SS]%10,c_data,10);
    Serial_send_string(c_data);
}
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
14
关闭 站长推荐上一条 /3 下一条