|
我是个大二的,刚学单片机一个学期了,刚刚做了个电子钟,拿上来个大伙点评点评,有错的地方请大伙说出来,好让我学习学习,再改进一下;
这里是程序C代码:
这是原程序,因为在网页上显示出来没退格比较不好看ourdev_525119.rar(文件大小:5K) (原文件名:晶振12MHz AT89s52+12232+DS1302+DS18B20电子钟.rar)
/**************** AT89S52 + G12232F + DS1302 + DS18B20 电 子 钟 **********************/
//主要功能:用DS1302实现精准电子钟,闹钟
// 用DS18B20采集温度
// 用四个独立按键可对时间,闹钟,进行调节
//石英晶振:12MHz
/*********************************************************************************/
#include <reg52.h> //头文件
#include <intrins.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit DS1302_SCLK=P0^7; //定义时钟芯片DS1302时钟线
sbit DS1302_IO=P0^6; //定义时钟芯片DS1302数据线
sbit DS1302_RST=P0^5; //定义时钟芯片DS1302复位线
sbit G12232_CS=P2^0; //定义液晶片选引脚
sbit G12232_DI=P2^1; //定义液晶数据线
sbit G12232_SCLK=P2^2; //定义液晶时钟线
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit KEY0=P3^2;
sbit KEY1=P3^3;
sbit KEY2=P3^4;
sbit KEY3=P3^5;
sbit DQ=P0^2; //定义DS18B20的单总线引脚
sbit fm=P0^3; //定义蜂鸣器引脚
/******************************* 函 数 申 明 **************************************/
void delay_us(uchar x); //延时 2 * x + 5 us
void delay_ms(uint z); //延时任意Ms
void DS1302_writebyte(uchar writebyte); //往DS1302写一个字节
uchar DS1302_readbyte(); //往DS1302读一个字节
uchar DS1302_read(uchar DS1302_add); //往DS1302指定地址读数据
void DS1302_write(uchar DS1302_add,uchar DS1302_data); //往DS1302指定地址写数据
void DS1302_init(); //DS1302初始化函数
void DS1302_set_time(); //设置时间
void DS1302_read_time(); //读取时间
void G12232_send_byte(uchar G12232_data); //往G12232发送一个字节
void G12232_write_com(uchar G12232_data); //往G12232写命令
void G12232_write_data(uchar G12232_data); //往G12232写数据
void week(uchar week); //星期代码
void G12232_init(); //液晶初始化函数
void keyscan() ; //键盘扫描
void keyscan_waibu(); //进入外部中断的键盘扫描,用于设定时间
void keyscan_nz(); //进入闹钟扫描按键,用于闹钟设置
void G12232_write_time(); //往液晶写入时间参数
void DS18B20_init(); //DS18B20初始化
void DS18B20_writeByte(uchar cmd); //DS18B20写一个字节
uchar DS18B20_readByte(); //DS18B20读一个字节
void DS18B20_read(); //读取DS18B20的温度
void nz_jc(); //闹钟检测函数
/*********************************************************************************/
/******************************** 全 局 变 量 *************************************/
char w,nian,yue,ri,xingqi,shi,fen,miao;
char nz_xingqi,nz_shi,nz_fen,nz_miao;
uchar wbzd,nz,t0,wh,wl;
bit naozhong;
uint wx,wz,t1;
/********************************************************************************/
void main()
{
DS1302_init(); //调用时钟芯片DS1302的初始化函数
G12232_init(); //调用液晶G12232的初始化函数
TMOD=0x11; //设置定时器0,定时器1工作在方式1
TH0=0xd8;
TL0=0xf0; //10ms溢出进入中断
TH1=0x3c;
TL1=0xb0; //50ms溢出进入中断
EA=1; //开总中断
ET0=1; //开定时器0中断
ET1=1; //开定时器0中断
EX0=1; //开外部中断0
fm=0;
while(1)
{
DS1302_read_time(); //调用读取DS1302时间参数函数
G12232_write_time(); //调用写时间参数进液晶的函数
keyscan(); //调用键盘扫描
nz_jc();
}
}
/*************************** 外 部 中 断 0 程 序 ************************************/
//功能:按键触发,对时间进行调节
/*******************************************************************************/
void int0() interrupt 0 //外部中断0程序
{
EX0=0; //进入中断后关外部中断开关
wbzd=0; //循环控制变量
DS1302_read_time();
DS1302_write(0x8e,0x00); //关写保护
DS1302_write(0x80,0x80); //关时间
DS1302_write(0x8e,0x80); //开写保护
G12232_write_com(0x01); //清除显示
G12232_write_time(); //将时间参数写入液晶
while(!wbzd)
{
keyscan_waibu(); //进入外部中断的键盘扫描,用于设定时间
}
EX0=1; //中断函数结束时再开外部中断开关
}
/*******************************************************************************/
/******************************* 定 时 器 0 程 序 ***********************************/
//功能:,用于判断按键被按下的时间,时间按键的多功能
/*******************************************************************************/
void time0() interrupt 1 //定时器0程序
{
TH0+=0xd8;
TL0+=0xf0; //10ms溢出进入中断
t0++;
}
/*******************************************************************************/
/******************************* 定时器 1 程序 *************************************/
//功能:闹钟到了,蜂鸣器响一分钟
/********************************************************************************/
void time1() interrupt 3
{
TH1+=0x3c;
TL1+=0xb0;
t1++;
if(t1==1200)
{
t1=0;
TR1=0;
TH1=0x3c;
TL1=0xb0;
fm=0;
}
}
/********************************************************************************/
/******************************* us 级 延 时 函 数 **********************************/
//功能:延时任意微秒,理论上7~515us
/*******************************************************************************/
void delay_us(uchar x) //延时 2 * x + 5 us
{
while(--x); //实现精准延时,us级别
}
/*******************************************************************************/
/******************************* ms 级 延 时 函 数 *********************************/
//功能:延时任意毫秒,理论上1~65535ms
/*******************************************************************************/
void delay_ms(uint z) //延时任意Ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
/*******************************************************************************/
/****************************** 闹 钟 检 测 函 数 *********************************/
//功能:检测闹钟设的参数是否是此时时间参数相同的,相同的话驱动蜂鸣器响1分钟
/*******************************************************************************/
void nz_jc()
{
if((naozhong==1)&&(nz_xingqi==xingqi)&&(nz_shi==shi)&&(nz_fen==fen)&&(nz_miao==miao))
{
fm=1;
TR1=1;
}
}
/********************************************************************************/
/****************************** DS18B20 初 始 化 ***********************************/
//功能:向DS18B20发复位信号,并检测DS18B20回发的存在信号
/********************************************************************************/
void DS18B20_init() //DS18B20初始化
{
while(1)
{
DQ=1; //拉高数据总线线
_nop_(); //延时1us
DQ=0; //拉低数据总线
delay_us(250); //延时505us
DQ=1; //释放总线
delay_us(40); //延时85us,等待DS18B2发存在信号
if(!DQ) //DS18B20发存在脉冲则退出循环,无存在信号则重发初始化信号
break;
}
delay_us(110); //延时225us
DQ=1; //释放总线
}
/*******************************************************************************/
/************************* 向 DS18B20 写 一 个 字 节 *********************************/
void DS18B20_writeByte(uchar cmd) //DS18B20写一个字节
{
uchar i;
for(i=0;i<8;i++) //发八位
{
if(cmd&0x01)
{
DQ=0; //拉低数据总线,产生写时隙
delay_us(5); //延时15us
DQ=1; //写 1
}
else
{
DQ=0; //写 0
delay_us(5); //延时15us
}
delay_us(25); //延时55us,等待DS18B20进行采样
DQ=1; //释放总线
_nop_(); //延时1us
cmd>>=1; //数据右移一位,发下一位
}
}
/********************************************************************************/
/************************* 向 DS18B20 读 一 个 字 节 *********************************/
uchar DS18B20_readByte() //DS18B20读一个字节
{
uchar i,tmp;
for(i=0;i<8;i++) //读八位
{
DQ=1; //拉高总线
_nop_(); //延时1us
tmp>>= 1;
DQ=0; //读时隙
_nop_(); //延时1us
_nop_(); //延时1us
_nop_(); //延时1us
_nop_(); //延时1us
DQ=1; //释放总线
delay_us(3); //延时11us
if(DQ) //开始读位
tmp|=0x80;
delay_us(25); //延时55us
}
return tmp; //将所读到的一个字节返回
}
/*******************************************************************************/
/****************************读取DS18B20的温度***********************************/
//功能:读取DS18B20的温度,并把温度值送到液晶上显示
/*******************************************************************************/
void DS18B20_read() //读取DS18B20的温度
{
DS18B20_init(); //初始化
DS18B20_writeByte(0xcc); //发跳过ROM命令
DS18B20_writeByte(0x44); //发温度转换命令
_nop_(); //延时1us,等待转换
DS18B20_init(); //初始化
DS18B20_writeByte(0xcc); //发跳过ROM命令
DS18B20_writeByte(0xbe); //发读暂存器命令
wl=DS18B20_readByte(); //开始温度读低字节
wh=DS18B20_readByte(); //再读温度高字节
_nop_(); //延时1us
wx=(wl&0x0f)*625; //温度小数部分处理
wz=wh*16+(wl>>4); //温度正数部分处理
G12232_write_com(0x92); //液晶光标跳到0x92位置
G12232_write_data(wz/10+0x30); //往液晶送温度数据
G12232_write_data(wz%10+0x30);
G12232_write_data('.');
G12232_write_data(wx/1000+0x30);
G12232_write_data(wx/1000%100+0x30);
G12232_write_data(wx/100%10+0x30);
G12232_write_data(wx%10+0x30);
}
/*******************************************************************************/
/***************************** DS1302 的 初 始 化 **********************************/
//功能:上电时对时钟芯片DS1302里面的数据全部清零
/*******************************************************************************/
void DS1302_init() //DS1302 的 初 始 化,将所有参数全清零
{
DS1302_write(0x8e,0x00); //关写保护
DS1302_write(0x80,0x80); //关时间
DS1302_write(0x80,0x00);
DS1302_write(0x82,0x00);
DS1302_write(0x84,0x00);
DS1302_write(0x86,0x00);
DS1302_write(0x88,0x00);
DS1302_write(0x8a,0x00);
DS1302_write(0x8c,0x00);
DS1302_write(0x80,0x00); //开时间
DS1302_write(0x8e,0x80); //开写保护
}
/*******************************************************************************/
/*************************** G12232 液 晶 初 始 化 函 数 ******************************/
//功能:初始化液晶
/*******************************************************************************/
void G12232_init() //G12232液晶初始化函数
{
G12232_write_com(0x01); //清除显示
G12232_write_com(0x02); //地址位归零
G12232_write_com(0x0c); //开显关游标
G12232_write_com(0x06); //光标移动方向
G12232_write_com(0x30); //基本功能设定
}
/*******************************************************************************/
/******************************* DS1302 读 一 个 字 节 ******************************/
uchar DS1302_readByte()
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=DS1302_IO;
DS1302_SCLK=1;
DS1302_SCLK=0;
}
return(ACC);
}
/*******************************************************************************/
/******************************* DS1302 写 一 个 字 节 ******************************/
void DS1302_writeByte(uchar tdata)
{
uchar i;
ACC=tdata;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0;
DS1302_SCLK=1;
DS1302_SCLK=0;
ACC=ACC>>1;
}
}
/********************************************************************************/
/******************************* DS1302 写 操 作 **********************************/
void DS1302_write(uchar tadd,uchar tdata)
{
DS1302_RST=0;
DS1302_SCLK=0;
DS1302_RST=1;
DS1302_writeByte(tadd);
DS1302_writeByte(tdata);
DS1302_RST=0;
DS1302_SCLK=1;
}
/********************************************************************************/
/******************************* DS1302 读 操 作 **********************************/
uchar DS1302_read(uchar tadd)
{
uchar tdata;
DS1302_RST=0;
DS1302_SCLK=0;
DS1302_RST=1;
DS1302_writeByte(tadd);
tdata=DS1302_readByte();
DS1302_RST=0;
DS1302_SCLK=1;
return(tdata);
}
/********************************************************************************/
/****************************** DS1302 设 置 时 间 **********************************/
//功能:对已经调节好的时间参数写到DS1302中
/*********************************************************************************/
void DS1302_set_time() //设置时间
{
DS1302_write(0x8e,0x00); //关写保护
DS1302_write(0x80,0x80); //关时间
DS1302_write(0x8c,(nian/10<<4)|(nian%10));
DS1302_write(0x8a,(xingqi/10<<4)|(xingqi%10));
DS1302_write(0x88,(yue/10<<4)|(yue%10));
DS1302_write(0x86,(ri/10<<4)|(ri%10));
DS1302_write(0x84,(shi/10<<4)|(shi%10));
DS1302_write(0x82,(fen/10<<4)|(fen%10));
DS1302_write(0x80,(miao/10<<4)|(miao%10));
DS1302_write(0x8e,0x80); //开写保护
}
/*******************************************************************************/
/****************************** DS1302 读 取 时 间 *********************************/
//功能:读取时钟芯片DS1302的时间参数
/*******************************************************************************/
void DS1302_read_time() //读取时间
{
miao =DS1302_read(0x81);
fen =DS1302_read(0x83);
shi =DS1302_read(0x85);
ri =DS1302_read(0x87);
yue =DS1302_read(0x89);
xingqi=DS1302_read(0x8b);
nian =DS1302_read(0x8d);
}
/*******************************************************************************/
/************************** G12232 显 示 时 间 参 数 ********************************/
//功能:将DS1302读取回来的时间参数送到液晶上显示
/*******************************************************************************/
void G12232_write_time()
{
G12232_write_com(0x80);
G12232_write_data('2');
G12232_write_data('0');
G12232_write_data((nian>>4)+0x30);
G12232_write_data((nian&0x0f)+0x30);
G12232_write_data(0xc4);
G12232_write_data(0xea); //“年”
G12232_write_data((yue>>4)+0x30);
G12232_write_data((yue&0x0f)+0x30);
G12232_write_data(0xd4);
G12232_write_data(0xc2); //“月”
G12232_write_data((ri>>4)+0x30);
G12232_write_data((ri&0x0f)+0x30);
G12232_write_data(0xc8);
G12232_write_data(0xd5); //“日”
G12232_write_data(' ');
G12232_write_data(' ');
G12232_write_com(0x90);
week(xingqi);
if(naozhong==0)
{
G12232_write_data(' ');
G12232_write_data(' ');
}
else
{
G12232_write_data(0x06);
G12232_write_data(' ');
}
G12232_write_data((shi>>4)+0x30);
G12232_write_data((shi&0x0f)+0x30);
G12232_write_data(0xa1);
G12232_write_data(0xc3);
G12232_write_data((fen>>4)+0x30);
G12232_write_data((fen&0x0f)+0x30);
G12232_write_data(0xa1);
G12232_write_data(0xc3);
G12232_write_data((miao>>4)+0x30);
G12232_write_data((miao&0x0f)+0x30);
G12232_write_data(' ');
G12232_write_data(' ');
}
/*******************************************************************************/
/**************************** 往 G12232 发 送 一 个 字 节 ****************************/
void G12232_send_byte(uchar G12232_data) //往G12232发送一个字节
{
uchar i;
CY=0;
for(i=0;i<8;i++)
{
G12232_data<<=1;
G12232_DI=CY;
G12232_SCLK=0;
G12232_SCLK=1;
}
}
/********************************************************************************/
/******************************* 往 G12232 写 命 令 ********************************/
void G12232_write_com(uchar G12232_data) //往G12232写命令
{
uchar _data,i=250;
_data=G12232_data;
G12232_data&=0xf0;
_data<<=4;
_data&=0xf0;
G12232_SCLK=0;
G12232_CS=1;
G12232_send_byte(0xf8);
G12232_send_byte(G12232_data);
G12232_send_byte(_data);
G12232_SCLK=0;
G12232_CS=0;
G12232_data=0;
while(--i); //延时505us
}
/********************************************************************************/
/******************************** 往 G12232 写 数 据 ********************************/
void G12232_write_data(uchar G12232_data) //往G12232写数据
{
uchar _data,i=250;
_data=G12232_data;
G12232_data&=0xf0;
_data<<=4;
_data&=0xf0;
G12232_SCLK=0;
G12232_CS=1;
G12232_send_byte(0xfa);
G12232_send_byte(G12232_data);
G12232_send_byte(_data);
G12232_SCLK=0;
G12232_CS=0;
G12232_data=0;
while(--i); //延时505us
}
/********************************************************************************/
/********************************* 星 期 代 码 ************************************/
//功能:将星期的数字转换成汉字
/********************************************************************************/
void week(uchar week) //星期代码
{
switch(week)
{
case 0: G12232_write_data(0xc8);G12232_write_data(0xd5);break;
case 1: G12232_write_data(0xd2);G12232_write_data(0xbb);break;
case 2: G12232_write_data(0xb6);G12232_write_data(0xfe);break;
case 3: G12232_write_data(0xc8);G12232_write_data(0xfd);break;
case 4: G12232_write_data(0xcb);G12232_write_data(0xc4);break;
case 5: G12232_write_data(0xce);G12232_write_data(0xe5);break;
case 6: G12232_write_data(0xc1);G12232_write_data(0xf9);break;
default:break;
}
}
/********************************************************************************/
/************************** 进 入 外 部 中 断 后 的 键 盘 扫 描 **************************/
//功能:对时间参数进行调节设置
/*******************************************************************************/
void keyscan_waibu() //进入外部中断的键盘扫描,用于设定时间
{
uchar v;
P3=0xff;
if(P3!=0xff)
{
delay_ms(10);
if(KEY0==0)
{
delay_ms(10);
while(KEY0==0);
delay_ms(10);
v++;
if(v==8) v=1;
switch(v)
{ //开光标并跳到那一位,等待用户设定参数
case 1:G12232_write_com(0x81);
G12232_write_com(0x0f);
break;
case 2:G12232_write_com(0x83);
G12232_write_com(0x0f);
break;
case 3:G12232_write_com(0x85);
G12232_write_com(0x0f);
break;
case 4:G12232_write_com(0x90);
G12232_write_com(0x0f);
break;
case 5:G12232_write_com(0x92);
G12232_write_com(0x0f);
break;
case 6:G12232_write_com(0x94);
G12232_write_com(0x0f);
break;
case 7:G12232_write_com(0x96);
G12232_write_com(0x0f);
break;
default :break;
}
return ;
}
if(KEY1==0)
{
delay_ms(10);
while(KEY1==0);
delay_ms(10);
switch(v)
{
case 1:nian--;
if(nian<0)
nian=99;
if(nian>100)
nian=0;
G12232_write_data(nian/10+0x30);
G12232_write_data(nian%10+0x30);
G12232_write_com(0x81);
break;
case 2:yue--;
if(yue<0)
yue=12;
if(yue>12)
yue=1;
G12232_write_data(yue/10+0x30);
G12232_write_data(yue%10+0x30);
G12232_write_com(0x83);
break;
case 3:ri--;
if(ri<0)
ri=31;
if(ri>31)
ri=1;
G12232_write_data(ri/10+0x30);
G12232_write_data(ri%10+0x30);
G12232_write_com(0x85);
break;
case 4:xingqi--;
if(xingqi<0)
xingqi=6;
if(xingqi>6)
xingqi=0;
week(xingqi);
G12232_write_com(0x90);
break;
case 5:shi--;
if(shi<0)
shi=23;
if(shi>23)
shi=0;
G12232_write_data(shi/10+0x30);
G12232_write_data(shi%10+0x30);
G12232_write_com(0x92);
break;
case 6:fen--;
if(fen<0)
fen=59;
if(fen>59)
fen=0;
G12232_write_data(fen/10+0x30);
G12232_write_data(fen%10+0x30);
G12232_write_com(0x94);
break;
case 7:miao--;
if(miao<0)
miao=59;
if(miao>59)
miao=0;
G12232_write_data(miao/10+0x30);
G12232_write_data(miao%10+0x30);
G12232_write_com(0x96);
break;
default :break;
}
return ;
}
if(KEY2==0)
{
delay_ms(10);
while(KEY2==0);
delay_ms(10);
wbzd=1;
v=0;
DS1302_set_time(); //设置时间
G12232_write_com(0x0c); //关游标
return ;
}
if(KEY3==0)
{
delay_ms(10);
while(KEY3==0);
delay_ms(10);
switch(v)
{
case 1:nian++;
if(nian<0)
nian=99;
if(nian>100)
nian=0;
G12232_write_data(nian/10+0x30);
G12232_write_data(nian%10+0x30);
G12232_write_com(0x81);
break;
case 2:yue++;
if(yue<0)
yue=12;
if(yue>12)
yue=1;
G12232_write_data(yue/10+0x30);
G12232_write_data(yue%10+0x30);
G12232_write_com(0x83);
break;
case 3:ri++;
if(ri<0)
ri=31;
if(ri>31)
ri=1;
G12232_write_data(ri/10+0x30);
G12232_write_data(ri%10+0x30);
G12232_write_com(0x85);
break;
case 4:xingqi++;
if(xingqi<0)
xingqi=6;
if(xingqi>6)
xingqi=0;
week(xingqi);
G12232_write_com(0x90);
break;
case 5:shi++;
if(shi<0)
shi=23;
if(shi>23)
shi=0;
G12232_write_data(shi/10+0x30);
G12232_write_data(shi%10+0x30);
G12232_write_com(0x92);
break;
case 6:fen++;
if(fen<0)
fen=59;
if(fen>59)
fen=0;
G12232_write_data(fen/10+0x30);
G12232_write_data(fen%10+0x30);
G12232_write_com(0x94);
break;
case 7:miao++;
if(miao<0)
miao=59;
if(miao>59)
miao=0;
G12232_write_data(miao/10+0x30);
G12232_write_data(miao%10+0x30);
G12232_write_com(0x96);
break;
default :break;
}
return ;
}
}
}
/*******************************************************************************/
/**************************** 主 程 序 中 的 键 盘 扫 描 *******************************/
//功能:通过判断按住按键的时间来进行相应的功能选项,其中用到定时器0计时
/********************************************************************************/
void keyscan() //独立键盘扫描
{
P3=0xff;
if(P3!=0xff)
{
delay_ms(10);
if(KEY1==0)
{
delay_ms(10);
while(KEY1==0)
{
}
}
if(KEY2==0)
{
TR0=1;
while(KEY2==0)
{
if(t0>100)
{
TR0=0;
t0=0;
G12232_write_com(0x01); //清除显示
G12232_write_com(0x80);
G12232_write_data(0xc4);
G12232_write_data(0xd6); //“闹”
G12232_write_data(0xd6);
G12232_write_data(0xd3); //“中”
G12232_write_data(0xc9);
G12232_write_data(0xe8); //“设”
G12232_write_data(0xd6);
G12232_write_data(0xc3); //“置”
G12232_write_data(0xa1);
G12232_write_data(0xc3); //“:”
if(naozhong==1)
{
G12232_write_data(0xbf);
G12232_write_data(0xaa);
}
else
{
G12232_write_data(0xb9);
G12232_write_data(0xd8);
}
G12232_write_com(0x90);
week(nz_xingqi);
G12232_write_data(' ');
G12232_write_data(' ');
G12232_write_data((nz_shi>>4)+0x30);
G12232_write_data((nz_shi&0x0f)+0x30);
G12232_write_data(0xa1);
G12232_write_data(0xc3);
G12232_write_data((nz_fen>>4)+0x30);
G12232_write_data((nz_fen&0x0f)+0x30);
G12232_write_data(0xa1);
G12232_write_data(0xc3);
G12232_write_data((nz_miao>>4)+0x30);
G12232_write_data((nz_miao&0x0f)+0x30);
G12232_write_data(' ');
G12232_write_data(' ');
while(!nz)
{
keyscan_nz();
}
nz=0;
return ;
}
}
if(t0<100)
{
TR0=0;
t0=0;
}
}
if(KEY3==0)
{
TR0=1;
while(KEY3==0)
{
if(t0>100)
{
TR0=0;
t0=0;
G12232_write_com(0x01); //清除显示
G12232_write_com(0x0c); /*开显关游标*/
G12232_write_com(0x80);
G12232_write_data(0xcf);
G12232_write_data(0xd6); //“现”
G12232_write_data(0xd4);
G12232_write_data(0xda); //“在”
G12232_write_data(0xb5);
G12232_write_data(0xc4); //“的”
G12232_write_data(0xce);
G12232_write_data(0xc2); //“温”
G12232_write_data(0xb6);
G12232_write_data(0xc8); //“度”
G12232_write_data(0xa1);
G12232_write_data(0xc3); //“:”
while(KEY3==0)
{
DS18B20_read();
}
return ;
}
}
if(t0<100)
{
TR0=0;
t0=0;
}
}
}
}
/*******************************************************************************/
/************************ 进 入 闹 钟 设 置 后 的 键 盘 扫 描 ****************************/
//功能:主程序的键盘扫描进入到闹钟设置选项后,对闹钟的参数进行调节设置
/*******************************************************************************/
void keyscan_nz() //进入闹钟扫描按键,用于闹钟设置
{
uchar j;
P3=0xff;
if(P3!=0xff)
{
delay_ms(10);
EX0=0;
if(KEY0==0)
{
delay_ms(10);
while(KEY0==0);
delay_ms(10);
nz=1;
j=0;
EX0=1;
}
if(KEY1==0)
{
delay_ms(10);
while(KEY1==0);
delay_ms(10);
switch(j)
{
case 1:naozhong=~naozhong;
if(naozhong==1)
{
G12232_write_data(0xbf);
G12232_write_data(0xaa);
}
else
{
G12232_write_data(0xb9);
G12232_write_data(0xd8);
}
G12232_write_com(0x85);break;
case 2:nz_xingqi--;
if(nz_xingqi<0)
nz_xingqi=6;
if(nz_xingqi>6)
nz_xingqi=0;
week(nz_xingqi);
G12232_write_com(0x90);
break;
case 3:nz_shi--;
if(nz_shi<0)
nz_shi=23;
if(nz_shi>23)
nz_shi=0;
G12232_write_data(nz_shi/10+0x30);
G12232_write_data(nz_shi%10+0x30);
G12232_write_com(0x92);
break;
case 4:nz_fen--;
if(nz_fen<0)
nz_fen=59;
if(nz_fen>59)
nz_fen=0;
G12232_write_data(nz_fen/10+0x30);
G12232_write_data(nz_fen%10+0x30);
G12232_write_com(0x94);
break;
case 5:nz_miao--;
if(nz_miao<0)
nz_miao=59;
if(nz_miao>59)
nz_miao=0;
G12232_write_data(nz_miao/10+0x30);
G12232_write_data(nz_miao%10+0x30);
G12232_write_com(0x96);
break;
default :break;
}
return ;
}
if(KEY2==0)
{
delay_ms(10);
while(KEY2==0);
delay_ms(10);
j++;
if(j==8) j=1;
switch(j)
{ //开光标并跳到那一位,等待用户设定参数
case 1:G12232_write_com(0x85);
G12232_write_com(0x0f);
break;
case 2:G12232_write_com(0x90);
G12232_write_com(0x0f);
break;
case 3:G12232_write_com(0x92);
G12232_write_com(0x0f);
break;
case 4:G12232_write_com(0x94);
G12232_write_com(0x0f);
break;
case 5:G12232_write_com(0x96);
G12232_write_com(0x0f);
break;
default :break;
}
return ;
}
if(KEY3==0)
{
delay_ms(10);
while(KEY3==0);
delay_ms(10);
switch(j)
{
case 1:naozhong=~naozhong;
if(naozhong==1)
{
G12232_write_data(0xbf);
G12232_write_data(0xaa);
}
else
{
G12232_write_data(0xb9);
G12232_write_data(0xd8);
}
G12232_write_com(0x85);
break;
case 2:nz_xingqi++;
if(nz_xingqi<0)
nz_xingqi=6;
if(nz_xingqi>6)
nz_xingqi=0;
week(nz_xingqi);
G12232_write_com(0x90);
break;
case 3:nz_shi++;
if(nz_shi<0)
nz_shi=23;
if(nz_shi>23)
nz_shi=0;
G12232_write_data(nz_shi/10+0x30);
G12232_write_data(nz_shi%10+0x30);
G12232_write_com(0x92);
break;
case 4:nz_fen++;
if(nz_fen<0)
nz_fen=59;
if(nz_fen>59)
nz_fen=0;
G12232_write_data(nz_fen/10+0x30);
G12232_write_data(nz_fen%10+0x30);
G12232_write_com(0x94);
break;
case 5:nz_miao++;
if(nz_miao<0)
nz_miao=59;
if(nz_miao>59)
nz_miao=0;
G12232_write_data(nz_miao/10+0x30);
G12232_write_data(nz_miao%10+0x30);
G12232_write_com(0x96);
break;
default :break;
}
return ;
}
}
}
/******************程序结束,谢谢观看,有错的地方请大家指出来,谢谢了******************/
//制作人 :谢钟满
//联系QQ:176628757
//制作时间:2010年1月11日
/********************************************************************************/ |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|