代码:
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);
}
文章评论(0条评论)
登录后参与讨论