#include"REGx52.h"
#include"RICHMCU.H"
sbit a0 = ACC^0;
sbit a1 = ACC^1;
sbit a2 = ACC^2;
sbit a3 = ACC^3;
sbit a4 = ACC^4;
sbit a5 = ACC^5;
sbit a6 = ACC^6;
sbit a7 = ACC^7;
sbit DQ = P3^3 ; //18B20接口
sbit speaker = P3^6 ; //蜂鸣器
sbit MODE = P1^4 ; //模式键
sbit INC = P1^5 ; //增加键
sbit DEC = P1^6 ; //减少键
sbit OK = P1^7 ; //OK键
#define LCD1602_DATA P0 //8位数据并行口
#define LCD1602_RS P2_0 //指令OR数据寄存器选择
#define LCD1602_RW P2_1 //读写控制
#define LCD1602_EN P2_2 //使能控制
#define LCD1602_CLR 0x01 //清屏
#define LCD1602_MODE 0x38 //8位数据,双列显示,5*7字形
#define LCD1602_ON 0x0c //开显示,关光标,光标不闪烁
#define LCD1602_ADDR_MODE 0x06 //地址递增
#define DS1302_SCLK P1_0 //1302时钟线
#define DS1302_IO P1_1 //1302数据线
#define DS1302_RST P1_2 //1302复位线
volatile uint8 data timedata[7] ; //时间值
volatile uint8 data display_buffer1[16]; //显示缓冲区1
volatile uint8 data display_buffer2[16]; //显示缓冲区2
volatile uint8 data temdata[5] ; //存放温度值
volatile uint16 data tdat ; //温度值变量
volatile uint8 data tflag ; //温度正负值标志
volatile int8 self_pos = 0 ;//自定义三角形标志显示位置变量
volatile uint8 OK_VALUE = 0 ; //OK键键值变量
volatile bit bdata DIS_ON = 1 ; //显示开关位 1 == on 0 == off
volatile bit bdata SCAN_ON = 0 ; //按键扫描开关位,由定时器每20MS刷新
volatile data MODE_ON = 0 ; //模式键按下后显示菜单的开关位
volatile data INC_VALUE = 0 ;
volatile data DEC_VALUE = 0 ;
volatile bit bdata ALARM_VALUE = 0 ;//闹钟标志位
volatile bit bdata ALARM_ON = 1 ; //闹钟响时关闭标志位
volatile uint8 data read_1 = 1,read_2 = 1,read_3 = 1,read_4 = 1;
volatile uint8 data stopwatch_count = 0;
volatile uint8 data stopwatch_second = 0;
volatile uint8 data stopwatch_minute = 0;
volatile bit bdata STOPWATCH_START = 0;
uint8 code self_table1[]={
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,// 年
0x1f,0x11,0x1f,0x11,0x1f,0x11,0x15,0x17,//月
0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,// 日
0x01,0x0c,0x17,0x14,0x17,0x0c,0x01,0x00,//闹钟标志
0x10,0x18,0x1c,0x1e,0x1f,0x1c,0x18,0x10 };//三角形符号
/**********************************************************
蜂鸣器
************************************************************/
void delay_ms(uint16 count) // 延时时间count*1ms
{
uint16 i;
for(;count>0;count--)
{
for(i=0;i<110;i++)
{
nop;
}
}
}
void speakers(uint8 speak_count)
{
for(;speak_count>0;speak_count--)
{
speaker = 0 ;
delay_ms(1) ;
speaker = 1 ;
delay_ms(3) ;
}
}
/***********************************************************
忙检测
************************************************************/
void LCD1602_check_busy(void)
{
LCD1602_DATA = 0xff;
LCD1602_RS = 0 ;
LCD1602_RW = 1 ;
LCD1602_EN = 1 ;
while(LCD1602_DATA & 0x80) ;
LCD1602_EN = 0 ;
}
/**********************************************************
写指令
************************************************************/
void LCD1602_write_cmd(uint8 cmd)
{
LCD1602_check_busy();
LCD1602_RS = 0 ;
LCD1602_RW = 0 ;
LCD1602_DATA = cmd ;
LCD1602_EN = 1 ;
LCD1602_EN = 0 ;
}
/***********************************************************
写数据
*************************************************************/
void LCD1602_write_data(uint8 dat)
{
LCD1602_check_busy();
LCD1602_RS = 1 ;
LCD1602_RW = 0 ;
LCD1602_DATA = dat ;
LCD1602_EN = 1 ;
LCD1602_EN = 0 ;
}
/***********************************************************
1602初始化
************************************************************/
void LCD1602_init(void)
{
uint8 i ;
LCD1602_write_cmd(0x40);//CGRAM起始地址
for(i=0;i<40;i++)
LCD1602_write_data(self_table1[i]);//写入自定义字符
LCD1602_write_cmd(LCD1602_MODE) ;
LCD1602_write_cmd(LCD1602_ON) ;
LCD1602_write_cmd(LCD1602_ADDR_MODE) ;
LCD1602_write_cmd(LCD1602_CLR) ;
}
/************************************************************
设置显示坐标
************************************************************/
void LCD1602_set_postion(uint8 x , uint8 y)
{
if(y<2)
{
y &= 0x01 ; //y值限定在0~1之间
x &= 0x0f ; //x值限定在0~15之间
if(y == 0)
x |= 0x40 ; //如果显示是在第二行,则x的值加0x40
x |= 0x80 ; //获得x的值
LCD1602_write_cmd(x) ;//写入坐标值到LCD
}
}
/************************************************************
指定位置写字符
*************************************************************/
void LCD1602_write_char(uint8 x , uint8 y , uint8 chardata)
{
LCD1602_set_postion(x,y) ;
LCD1602_write_data(chardata) ;
}
/************************************************************
指定位置写字符串
*************************************************************/
void LCD1602_write_string(uint8 x , uint8 y , uint8 *string)
{
LCD1602_set_postion(x,y) ;
while((*string) != '')
{
LCD1602_write_data(*string) ;
string++ ;
}
}
/***************************************************************
指定位置显示自定义字符
**************************************************************
uint8 LCD1602_display_self(uint8 count)
{
switch(count)
{
case 0 : sele_count = 0 ; break ;
case 1 : sele_count = 1 ; break ;
case 2 : sele_count = 2 ; break ;
case 3 : sele_count = 3 ; break ;
default : break ;
}
return(self_count) ;
}*/
/****************************************************************
底层驱动函数(输入)
*****************************************************************/
void DS1302_input(uint8 inputdata)
{
ACC = inputdata ;
DS1302_IO = a0 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
DS1302_IO = a1 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
DS1302_IO = a2 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
DS1302_IO = a3 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
DS1302_IO = a4 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
DS1302_IO = a5 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
DS1302_IO = a6 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
DS1302_IO = a7 ; DS1302_SCLK = 1 ; DS1302_SCLK = 0 ;
}
/****************************************************************
底层驱动函数(输出)控制位的第七位必须为1
*****************************************************************/
uint8 DS1302_output(void)
{
DS1302_IO = 1 ;
a0 = DS1302_IO ;
DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a1 = DS1302_IO ;
DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a2 = DS1302_IO ;
DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a3 = DS1302_IO ;
DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a4 = DS1302_IO ;
DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a5 = DS1302_IO ;
DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a6 = DS1302_IO ;
DS1302_SCLK = 1 ; DS1302_SCLK =0 ; a7 = DS1302_IO ;
return(ACC);
}
/****************************************************************
底层驱动函数(指定地址写一个字节的数据)
*****************************************************************/
void DS1302_write_byte(uint8 cmd , uint8 dat)
{
DS1302_SCLK = 0 ;
DS1302_RST = 0 ;
DS1302_RST = 1 ;
DS1302_input(cmd) ;
DS1302_input(dat) ;
DS1302_RST = 0 ;
DS1302_SCLK = 1 ;
}
/****************************************************************
底层驱动函数(指定地址读取一字节的数据)
*****************************************************************/
uint8 DS1302_read_byte(uint8 cmd)
{
uint8 receivedata = 0 ;
DS1302_SCLK = 0 ;
DS1302_RST = 0 ;
DS1302_RST = 1 ;
DS1302_input(cmd) ;
receivedata = DS1302_output() ;
DS1302_RST = 0 ;
DS1302_SCLK = 1 ;
return(receivedata) ;
}
/********************************************************
设置1302的初始时间
*********************************************************/
void DS1302_init()
{
if(DS1302_read_byte(0xc9) != 0xf0)
{
DS1302_write_byte(0x8e,0x00) ;//允许写操作
DS1302_write_byte(0xc8,0xf0) ; //写入初始化标志 ,系统上电后检测此标志,即此子函数只会在第一次初始化一次。
DS1302_write_byte(0x8c,0x08) ;//年
DS1302_write_byte(0x8a,0x05) ;//星期
DS1302_write_byte(0x88,0x09) ;//月
DS1302_write_byte(0x86,0x19) ;//日
DS1302_write_byte(0x84,0x12) ;//时
DS1302_write_byte(0x82,0x00) ;//分
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』