搜索
bottom↓
回复: 81

初学51,制作了一个电子钟,四个按键可设置时间和闹钟参数,用了AT89S52,DS1302,DS18B20,G

  [复制链接]

出0入0汤圆

发表于 2010-1-11 23:23:45 | 显示全部楼层 |阅读模式
我是个大二的,刚学单片机一个学期了,刚刚做了个电子钟,拿上来个大伙点评点评,有错的地方请大伙说出来,好让我学习学习,再改进一下;
这里是程序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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-1-11 23:35:04 | 显示全部楼层
学习一下。。

出0入0汤圆

发表于 2010-1-11 23:48:45 | 显示全部楼层
如果这些都是你自己按照datasheet写的,而不是东拼西凑的,那么大二的楼主比较牛了

出0入0汤圆

发表于 2010-1-12 00:10:08 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-1-12 00:32:00 | 显示全部楼层
绝对是看PDF自己写出来的,DS18B20的延时比较难控制

出0入0汤圆

发表于 2010-1-12 02:23:44 | 显示全部楼层
很不错,要继续努力啊,好好看下C的“预处理命令”和宏定义,要学会做自己的头文件,这样对以后的发展会有好处的

出0入0汤圆

发表于 2010-1-12 04:18:26 | 显示全部楼层
附件有病毒???


(原文件名:潜在危险!?.PNG)

出0入0汤圆

发表于 2010-1-12 04:51:10 | 显示全部楼层
修改了xx.c 的文件名,就没有“危险”提示了。

出0入0汤圆

发表于 2010-1-12 05:04:02 | 显示全部楼层
请问:
有没有液晶屏 G12232F 的资料?
谢谢!

出0入0汤圆

 楼主| 发表于 2010-1-12 18:29:16 | 显示全部楼层
回复【8楼】wxfhw
-----------------------------------------------------------------------
点击此处下载 ourdev_525378.pdf(文件大小:550K) (原文件名:液晶12232F.pdf)

液晶G12232F 的PDF

出0入0汤圆

 楼主| 发表于 2010-1-12 18:30:40 | 显示全部楼层
谢谢5楼的建议,其实我也正有此意

出0入0汤圆

发表于 2010-1-27 10:25:27 | 显示全部楼层
很不错

出0入0汤圆

发表于 2010-1-27 11:24:59 | 显示全部楼层
楼主自己写的话的确是很不错了的,尤其是ds18b20的时序是特别的严谨的,要写出来的确是不太容易的一件事……赞一个

出0入0汤圆

发表于 2010-2-9 00:06:45 | 显示全部楼层
楼主的程序模块化需要加强,那样才能让人看得清晰.

出0入0汤圆

发表于 2010-2-21 17:20:54 | 显示全部楼层
看看

出0入0汤圆

发表于 2010-3-2 16:39:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-2 21:56:47 | 显示全部楼层
好东西

出0入0汤圆

发表于 2010-3-3 13:13:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-3 17:04:26 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-3-8 23:33:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-9 10:45:37 | 显示全部楼层
夸一下!  很棒!

出0入0汤圆

发表于 2010-4-11 18:22:12 | 显示全部楼层
厉害啊,教教我啊

出0入0汤圆

发表于 2010-4-11 18:50:53 | 显示全部楼层
太厉害了  我的榜样~~~  学习个

出0入0汤圆

发表于 2010-4-11 19:21:00 | 显示全部楼层
佩服楼主,我也大二,但我擅长抄

出0入0汤圆

发表于 2010-4-11 19:49:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-6 17:24:45 | 显示全部楼层
楼主有没有电路图,给我一个,邮箱:wexm2005@163.com

出0入0汤圆

发表于 2010-8-14 11:34:25 | 显示全部楼层
传粉电路图吧

出0入0汤圆

发表于 2010-8-15 00:16:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-15 03:25:39 | 显示全部楼层
非常怀疑是东拼西凑或者是直接改的别人的程序。不知是不是课程设计之类的

出0入0汤圆

发表于 2010-8-18 22:41:21 | 显示全部楼层

出0入0汤圆

发表于 2010-8-20 13:56:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-9 21:26:04 | 显示全部楼层
佩服

出0入0汤圆

发表于 2010-10-10 12:54:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-10 18:29:30 | 显示全部楼层
很不错的东西哟,学习了,也很佩服楼主的水平,学习的对象

出0入0汤圆

发表于 2010-10-23 01:57:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-23 14:23:45 | 显示全部楼层
不错!如果是自己写的,那确实是很牛...

出0入0汤圆

发表于 2010-11-6 16:57:23 | 显示全部楼层
楼主,有仿真过吗?还是做的实物啊?键盘程序功能ok?我自己写的键盘程序老错,望楼主指教

出0入0汤圆

发表于 2011-4-8 13:11:24 | 显示全部楼层
我学习了

出0入0汤圆

发表于 2011-4-8 14:58:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-9 19:00:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-9 22:25:09 | 显示全部楼层
好东东,记号一下.

出0入0汤圆

发表于 2011-4-10 21:34:03 | 显示全部楼层
好帅呀,,,我们也要弄一个这个,。,。我就借一下你这个了

出0入0汤圆

发表于 2011-6-6 07:50:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-7 16:44:22 | 显示全部楼层
怎么还有效果图呀

出0入0汤圆

发表于 2011-6-7 19:02:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-7 19:30:58 | 显示全部楼层
当年我也是一句一句的汇编

敲了一个时钟,进入单片机的门槛

没有搭硬件吗?

出0入0汤圆

发表于 2011-6-12 11:13:48 | 显示全部楼层
厉害

出145入215汤圆

发表于 2011-9-17 00:16:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-17 09:09:56 | 显示全部楼层
顶,不错

出0入0汤圆

发表于 2011-11-28 19:14:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-28 19:39:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-3 15:23:05 来自手机 | 显示全部楼层
太强了…完全自己写!向你学习了

出0入0汤圆

发表于 2012-4-3 15:24:28 来自手机 | 显示全部楼层
太强了…完全自己写!向你学习了

出0入0汤圆

发表于 2012-4-3 15:25:12 来自手机 | 显示全部楼层
太强了…完全自己写!向你学习了

出0入0汤圆

发表于 2012-4-3 16:50:11 | 显示全部楼层
MARK..........

出0入0汤圆

发表于 2013-4-18 09:12:50 | 显示全部楼层
好东西,不错

出0入0汤圆

发表于 2013-4-18 09:37:59 | 显示全部楼层
大二一个星期就可以有作品了,算是牛了

出0入0汤圆

发表于 2013-4-18 10:37:56 | 显示全部楼层
mark,not bad.

出0入0汤圆

发表于 2013-4-22 14:55:00 | 显示全部楼层
正在学习

出0入0汤圆

发表于 2013-4-24 00:27:52 来自手机 | 显示全部楼层
收藏了,谢谢

出0入0汤圆

发表于 2013-4-24 13:47:22 | 显示全部楼层
正在 学习中

出0入0汤圆

发表于 2013-4-24 17:29:50 | 显示全部楼层
好东西。

出0入0汤圆

发表于 2013-4-25 13:02:30 | 显示全部楼层
刚刚学究这么厉害了,加油

出0入0汤圆

发表于 2013-4-25 14:23:29 | 显示全部楼层
很厉害了,继续努力!

出0入0汤圆

发表于 2013-5-5 15:49:52 | 显示全部楼层
MARKMARKMARK

出0入0汤圆

发表于 2013-5-5 18:18:22 | 显示全部楼层
   

出0入0汤圆

发表于 2013-7-12 23:52:34 | 显示全部楼层
显示用12232?不错哦,收藏下

出0入0汤圆

发表于 2013-11-17 16:50:25 | 显示全部楼层
mark                  

出0入0汤圆

发表于 2013-11-29 23:06:18 | 显示全部楼层
LZ大二就能达到这水平,确实不错。

出0入0汤圆

发表于 2013-12-2 09:35:29 | 显示全部楼层
程序写的很中规中矩 一看就是科班出身啊,我们这种由汇编进C的人有时还在纠结一些小的规则

出0入0汤圆

发表于 2013-12-2 10:24:36 | 显示全部楼层
挺不错,学习下~~~

出0入0汤圆

发表于 2014-12-27 19:57:52 | 显示全部楼层
学习下,看看有没有我没有的

出0入0汤圆

发表于 2014-12-27 20:21:46 | 显示全部楼层
此处mark,为了这句话 “好好看下C的“预处理命令”和宏定义,要学会做自己的头文件”

出0入0汤圆

发表于 2014-12-27 20:36:21 | 显示全部楼层
可以配个图片吧,给个第一印象!

出0入0汤圆

发表于 2014-12-28 08:18:20 | 显示全部楼层
大一会这么多  已经很牛了

出0入0汤圆

发表于 2014-12-28 11:17:02 | 显示全部楼层
很不容易了,作为大一的学生

出0入0汤圆

发表于 2014-12-28 13:44:38 | 显示全部楼层
代码格式不错。。调程序应该不是新手了吧。。

出0入0汤圆

发表于 2014-12-29 17:17:41 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2014-12-29 19:24:12 | 显示全部楼层
厉害,我也正想做一个

出0入0汤圆

发表于 2014-12-29 20:19:04 | 显示全部楼层
楼主加油,继续努力,看到楼主的帖子我想起上学时刚刚做东西的时候,一晃好多年过去了。

出0入0汤圆

发表于 2014-12-29 20:55:13 | 显示全部楼层
楼主前途无量

出0入0汤圆

发表于 2018-7-12 20:34:23 | 显示全部楼层
好样的,不错。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 17:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表