#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);
}