初学51,制作了一个电子钟,四个按键可设置时间和闹钟参数,用了AT89S52,DS1302,DS18B20,G
我是个大二的,刚学单片机一个学期了,刚刚做了个电子钟,拿上来个大伙点评点评,有错的地方请大伙说出来,好让我学习学习,再改进一下;这里是程序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 读 一 个 字 节 ******************************/
ucharDS1302_readByte()
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=DS1302_IO;
DS1302_SCLK=1;
DS1302_SCLK=0;
}
return(ACC);
}
/*******************************************************************************/
/******************************* DS1302 写 一 个 字 节 ******************************/
voidDS1302_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日
/********************************************************************************/ 学习一下。。 如果这些都是你自己按照datasheet写的,而不是东拼西凑的,那么大二的楼主比较牛了 mark 绝对是看PDF自己写出来的,DS18B20的延时比较难控制 很不错,要继续努力啊,好好看下C的“预处理命令”和宏定义,要学会做自己的头文件,这样对以后的发展会有好处的 附件有病毒???
http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_525157.PNG
(原文件名:潜在危险!?.PNG) 修改了xx.c 的文件名,就没有“危险”提示了。 请问:
有没有液晶屏 G12232F 的资料?
谢谢! 回复【8楼】wxfhw
-----------------------------------------------------------------------
点击此处下载 ourdev_525378.pdf(文件大小:550K) (原文件名:液晶12232F.pdf)
液晶G12232F 的PDF 谢谢5楼的建议,其实我也正有此意 很不错 楼主自己写的话的确是很不错了的,尤其是ds18b20的时序是特别的严谨的,要写出来的确是不太容易的一件事……赞一个 楼主的程序模块化需要加强,那样才能让人看得清晰. 看看 mark 好东西
顶 mark MARK mark 夸一下!很棒! 厉害啊,教教我啊 太厉害了我的榜样~~~学习个 佩服楼主,我也大二,但我擅长抄 mark 楼主有没有电路图,给我一个,邮箱:wexm2005@163.com 传粉电路图吧 mark 非常怀疑是东拼西凑或者是直接改的别人的程序。不知是不是课程设计之类的 顶 mark 佩服 mark 很不错的东西哟,学习了,也很佩服楼主的水平,学习的对象 mark 不错!如果是自己写的,那确实是很牛... 楼主,有仿真过吗?还是做的实物啊?键盘程序功能ok?我自己写的键盘程序老错,望楼主指教 我学习了 mark mark 好东东,记号一下. 好帅呀,,,我们也要弄一个这个,。,。我就借一下你这个了 mark 怎么还有效果图呀 mark 当年我也是一句一句的汇编
敲了一个时钟,进入单片机的门槛
没有搭硬件吗? 厉害 mark 顶,不错 mark mark 太强了…完全自己写!向你学习了 太强了…完全自己写!向你学习了 太强了…完全自己写!向你学习了 MARK.......... 好东西,不错 大二一个星期就可以有作品了,算是牛了 mark,not bad.
正在学习 收藏了,谢谢 正在 学习中 好东西。 刚刚学究这么厉害了,加油 很厉害了,继续努力! MARKMARKMARK {:lol:} 显示用12232?不错哦,收藏下 mark LZ大二就能达到这水平,确实不错。 程序写的很中规中矩 一看就是科班出身啊,我们这种由汇编进C的人有时还在纠结一些小的规则 挺不错,学习下~~~ 学习下,看看有没有我没有的 此处mark,为了这句话 “好好看下C的“预处理命令”和宏定义,要学会做自己的头文件” 可以配个图片吧,给个第一印象! 大一会这么多已经很牛了 很不容易了,作为大一的学生 代码格式不错。。调程序应该不是新手了吧。。 学习一下 厉害,我也正想做一个 楼主加油,继续努力,看到楼主的帖子我想起上学时刚刚做东西的时候,一晃好多年过去了。 楼主前途无量 好样的,不错。。。
页:
[1]