一个万年历程序,自己写的,当然有参考一下别人的程序,lcd显示,用的是ds1302芯片调时,剩下就是一些按键之类的,现在问题是其他都正常,就是lcd显示正常计时的时候lcd上一些位置显示的是问号和数字间接闪烁,数字应该都读进去了,也可以正常读出,但是就是显示不正常。其他功能均正常。<br /> 电路绝对没有问题,拿别人的万年历试验过完全可以用。<br /> 都调了两天了,人都快疯了!可能我比较菜,但是我可以想到的办法都试过了,就是找不到问题所在,哪位好心人帮我看一下吧!或者跟我说个大概方向也成。<br /> PS:示波器之类我没有,也找不到,所以没有办法用那个。<br /> 程序如下:<br />//调用函数库<br />#include<reg51.h><br />#include<intrins.h><br /><br />//宏定义<br />#define uchar unsigned char<br />#define uint unsigned int<br /><br />//位定义<br />sbit ACC0 = ACC^0;<br />sbit ACC7 = ACC^7;<br /><br />sbit T_CLK=P2^2; //与硬件相关的连线 clk为DS1302的时钟信号线<br />sbit T_IO=P2^3; //DAT为DS1302的I/O数据线<br />sbit T_RST=P2^4; //RST为DS1302的RST信号线<br /><br />sbit lcd_rs=P2^6;<br />sbit lcd_rw=P2^7;<br />sbit lcd_en=P2^5;<br /><br />sbit DS=P2^1; //定义温度传感器接口<br /><br />sbit sw_add=P1^0; //定义增加键<br />sbit sw_move=P1^1; //定义光标左移动键<br />sbit sw_changeweb=P1^3; //定义翻页键<br />sbit sw_back=P3^0; //定义回到计时按键<br /><br />sbit ring_bell=P1^2; //蜂鸣器接口<br /><br />uchar a[7]={0x00,0x15,0x14,0x03,0x06,0x02,0x09}; //初始化日期<br />uchar week[21]={0x4d,0x6f,0x6e,0x54,0x75,0x65,0x57,0x65,0x64,0x54,0x68,0x75,<br /> 0x46,0x72,0x69,0x53,0x61,0x74,0x53,0x75,0x6e};<br /><br />uchar welcome_screen1[10]=" Welcome"; //开机画面<br />uchar welcome_screen2[14]="by wei and zao"; <br /><br />uchar numbuf1[4]; //定义一个数组用于存储温度各个位<br />uchar sec[7]; //用于存储1302中读出的时间<br />uchar week_buf; //用于存储周<br />uchar clockring[2]; //用于闹钟存时<br />uchar ringdebug; //闹钟闹铃判断<br />uchar ringbiao; //用于显示有闹钟<br />uchar ringbegin; //闹钟开启判断<br />////////////////////////////////////////////////////////<br />// //<br />// DS1820b温度传感器模块 //<br />// //<br />// //<br />////////////////////////////////////////////////////////<br />void delay(uint count) //delay 延时子程序<br />{<br /> uint i;<br /> while(count)<br /> {<br /> i=200;<br /> while(i>0)<br /> i--;<br /> count--;<br /> }<br />}<br /><br />void rstds1820b(void) //发送初始化命令子程序<br />{<br /> uint i;<br /> DS=0;<br /> i=103;<br /> while(i>0)i--;<br /> DS=1;<br /> i=4;<br /> while(i>0)i--;<br />}<br /><br />bit readbit(void) //read a bit 读一位<br />{<br /> uint i;<br /> bit dat;<br /> DS=0;i++; //i++ for delay<br /> DS=1;i++;i++;<br /> dat=DS;<br /> i=8;while(i>0)i--;<br /> return (dat);<br />}<br /><br />uchar readbyte(void) //read a byte date 读一个字节<br />{<br /> uchar i,j,dat;<br /> dat=0;<br /> for(i=1;i<=8;i++)<br /> {<br /> j=readbit();<br /> dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里<br /> }<br /> return(dat);<br />}<br /><br />void writebyte(uchar dat) //write a byte to ds18b20 给温度传感器写一个字节<br />{<br /> uint i;<br /> uchar j;<br /> bit testb;<br /> for(j=1;j<=8;j++)<br /> {<br /> testb=dat&0x01;<br /> dat=dat>>1;<br /> if(testb) //write 1<br /> {<br /> DS=0;<br /> i++;i++;<br /> DS=1;<br /> i=8;while(i>0)i--;<br /> }<br /> else<br /> {<br /> DS=0; //write 0<br /> i=8;while(i>0)i--;<br /> DS=1;<br /> i++;i++;<br /> }<br /><br /> }<br />}<br /><br />void temchange(void) //DS18B20 begin change 发送温度转换命令<br />{<br /> rstds1820b();<br /> delay(1);<br /> writebyte(0xcc); // address all drivers on bus<br /> writebyte(0x44); // initiates a single temperature conversion<br />}<br /><br />uint gettem() //得到温度值<br />{<br /> float tt;<br /> uchar a,b;<br /> uint temp; //定义一个变量用来表示温度<br /> rstds1820b();<br /> delay(1);<br /> writebyte(0xcc);<br /> writebyte(0xbe);<br /> a=readbyte();<br /> b=readbyte();<br /> temp=b;<br /> temp<<=8; //将实型数据变成整型数据<br /> temp=temp|a;<br /> tt=temp*0.0625;<br /> temp=tt*10+0.5;<br /> return temp;<br />}<br /><br />void getnum() //得到温度的十、个、小数位<br />{<br /> uchar A;<br /> temchange();<br /> numbuf1[0]=gettem()/100+0x30;<br /> A=gettem()%100;<br /> numbuf1[1]=A/10+0x30;<br /> numbuf1[2]=0x2e;<br /> numbuf1[3]=A%10+0x30; <br />}<br /><br /><br />////////////////////////////////////////////////////////<br />// //<br />// lcd1602显示模块 //<br />// //<br />// //<br />////////////////////////////////////////////////////////<br /><br />//延时函数<br />void delay1(uint ms) //对于AT89S51来说大概延时为每单位4.5ms<br />{<br /> int i;<br /> while(ms--)<br /> {<br /> for(i=0;i<250;i++)<br /> {<br /> _nop_(); <br /> _nop_();<br /> _nop_();<br /> _nop_();<br /> }<br /> }<br />}<br /><br />void delay2(uint us) //每单位大约延时50us<br />{<br /> while(us--)<br /> {<br /> _nop_();<br /> }<br />}<br /><br />//判断是否准备好<br />uchar lcd_ready()<br />{<br /> uchar result;<br /> lcd_rs=0;<br /> lcd_rw=1;<br /> lcd_en=1;<br /> delay2(4);<br /> result=P0&0x80; //读寄存器BF位看是否忙<br /> lcd_en=0;<br /> return result;<br />}<br /><br />//写指令代码<br />void lcd_inputcode(uchar cmd)<br />{<br /> while(lcd_ready());<br /> lcd_en=0;<br /> lcd_rs=0;<br /> lcd_rw=0; <br /> delay2(2);<br /> P0=cmd;<br /> delay2(4);<br /> lcd_en=1; //EN下降沿写指令代码<br /> delay2(4);<br /> lcd_en=0;<br />}<br /><br />//写数据代码<br />void lcd_inputdata(uchar dat)<br />{<br /> while(lcd_ready());<br /> lcd_en=0;<br /> lcd_rs=1;<br /> lcd_rw=0;<br /> P0=dat;<br /> delay2(4);<br /> lcd_en=1;<br /> delay2(4);<br /> lcd_en=0;<br />}<br /><br />//设定显示位置<br />void lcd_pos(uchar XPOS,uchar YPOS)<br />{ XPOS&=0x0f;<br /> YPOS&=0x03;<br /> if(YPOS==0x00)<br /> lcd_inputcode(XPOS|0x80);<br /> else if(YPOS==0x01)<br /> lcd_inputcode((XPOS+0x40)|0x80);<br />}<br /><br />//在指定位置显示一个字符<br />void displayonechar(uchar X, uchar Y, uchar dat)<br />{<br /> lcd_pos(X,Y); //根据参数定位<br /> lcd_inputdata(dat); //写入字符数据<br />}<br /><br />//显示字符串<br />void displaychar(uchar dat[],line)<br />{<br /> uchar i;<br /> while(dat!='\0')<br /> {<br /> displayonechar(i,line,dat);<br /> i++;<br /> }<br /> i=0;<br />}<br />//初始化程序<br />void lcd_init()<br />{<br /> delay1(20);<br /> lcd_inputcode(0x38); //工作方式设置<br /> delay1(5);<br /> lcd_inputcode(0x38);<br /> delay1(5);<br /><br /> lcd_inputcode(0x0c); //显示光标及闪烁设置<br /> delay1(5);<br /> lcd_inputcode(0x06);<br /> delay1(5);<br /> lcd_inputcode(0x01); //清DDRAM和AC值<br /> delay1(5);<br />}<br /><br />//清屏程序<br />void lcd_clr()<br />{<br /> lcd_inputcode(0x01);<br /> delay1(5);<br />}<br /><br />//闪动程序<br />void flash()<br />{<br /> delay1(150);<br /> lcd_inputcode(0x08);<br /> delay1(150);<br /> lcd_inputcode(0x0c);<br /> delay1(150);<br /> lcd_inputcode(0x08);<br /> delay1(150);<br /> lcd_inputcode(0x0c);<br /> delay1(150);<br />}<br /><br />//温度获取<br />void get1820()<br />{<br /> uchar i;<br /> getnum();<br /> i=0;<br /> while(i!=4)<br /> {<br /> displayonechar(9+i,1,numbuf1);<br /> i++;<br /> }<br /> displayonechar(13,1,0xdf);<br /> displayonechar(14,1,0x43);<br /> i=0; <br />}<br /><br />//开机显示画面<br />void dispaly_begin()<br />{<br /> uchar i,j;<br /> lcd_clr();<br /> lcd_inputcode(0x80|0x11); //DDRAM地址设置两行显示<br /> for(i=0;i<10;i++)<br /> lcd_inputdata(welcome_screen1);<br /> lcd_inputcode(0x80|0x51);<br /> for(i=0;i<14;i++)<br /> lcd_inputdata(welcome_screen2);<br /> for(j=0;j<16;j++)<br /> {<br /> lcd_inputcode(0x18);<br /> delay1(50);<br /> }<br /> flash();<br />}<br />////////////////////////////////////////////////////////<br />// //<br />// 时钟芯片1302显示模块 //<br />// //<br />// //<br />////////////////////////////////////////////////////////<br />void DS1302InputByte(uchar d) //实时时钟写入一字节(内部函数)<br />{ <br /> unsigned char i;<br /> ACC = d;<br /> for(i=8; i>0; i--)<br /> {<br /> T_IO = ACC0; //相当于汇编中的 RRC<br /> T_CLK = 1;<br /> T_CLK = 0;<br /> ACC = ACC >> 1; <br /> } <br />}<br /><br />uchar DS1302OutputByte(void) //实时时钟读取一字节(内部函数)<br />{ <br /> uchar i;<br /> for(i=8; i>0; i--)<br /> {<br /> ACC = ACC >>1; //相当于汇编中的 RRC <br /> ACC7 = T_IO;<br /> T_CLK = 1;<br /> T_CLK = 0;<br /> } <br /> return(ACC); <br />}<br /><br />//先写地址,后写命令数据<br />void W1302(uchar ucAddr,uchar ucDa) //ucAddr: DS1302地址, ucData: 要写的数据<br />{<br /> T_RST = 0;<br /> T_CLK = 0;<br /> T_RST = 1;<br /> DS1302InputByte(ucAddr); // 地址,命令 <br /> DS1302InputByte(ucDa); // 写1Byte数据<br /> T_CLK = 1;<br /> T_RST = 0;<br />} <br /><br />//先写地址,后后读命令数据<br />uchar R1302(uchar ucAddr) //读取DS1302某地址的数据<br />{<br /> uchar ucData;<br /> T_RST = 0;<br /> T_CLK = 0;<br /> T_RST = 1;<br /> DS1302InputByte(ucAddr); // 地址,命令 <br /> ucData = DS1302OutputByte(); // 读1Byte数据<br /> T_CLK = 1;<br /> T_RST = 0;<br /> return(ucData);<br />}<br /><br />//读全部1302模块<br />void read_1302()<br />{<br /> uchar i;<br /> uchar uccode;<br /> uccode=0x8d;<br /> for(i=0;i<7;i++)<br /> {<br /> sec=R1302(uccode);<br /> uccode=uccode-2;<br /> }<br />}<br /><br />//写单个位1302模块<br />void write1302_bit(uchar ucAddr,uchar num)<br />{<br /> W1302(0x8e,0x00);<br /> W1302(ucAddr,num);<br /> W1302(0x8e,0x80); <br />}<br /><br />//显示单个时间,例如年,月等子程序<br />display1302_bit(uchar i,uchar address,uchar line)<br />{<br /> displayonechar(address,line,((sec>>4)&0x0f)+0x30);<br /> displayonechar(address+1,line,(sec&0x0f)+0x30); <br />}<br /><br />//初始时间<br />void write1302()<br />{<br /> uchar i1;<br /> uchar ucAddr = 0x80; <br /> W1302(0x8e,0x00); // 控制命令,WP=0,写操作<br /> for(i1 =0; i1<7; i1++)<br /> { <br /> W1302(ucAddr,a[i1]); // 秒 分 时 日 月 星期 年 <br /> <br /> ucAddr +=2;<br /> }<br /> W1302(0x8e,0x80); // 控制命令,WP=1,写保护 <br />}<br /><br />//1302显示模块<br />void get1302()<br />{<br /> read_1302();<br /> displayonechar(0x01,0,0x32);<br /> displayonechar(0x02,0,0x30);<br /> display1302_bit(0,0x03,0); //显示年<br /> displayonechar(0x05,0,0x2d); //分隔符<br /> display1302_bit(2,0x06,0); //显示月<br /> displayonechar(0x08,0,0x2d); //分隔符<br /> display1302_bit(3,0x09,0); //显示日<br /> week_buf=((sec[1]&0x0f)-1)*3;<br /> displayonechar(0x0c,0,week[week_buf]); //显示周<br /> displayonechar(0x0d,0,week[week_buf+1]); <br /> displayonechar(0x0e,0,week[week_buf+2]); <br /><br /> display1302_bit(4,0x00,1); //显示时<br /> displayonechar(0x02,1,0x3a); //分隔符<br /> display1302_bit(5,0x03,1); //显示分<br /> displayonechar(0x05,1,0x3a); //分隔符<br /> display1302_bit(6,0x06,1); //显示秒<br /><br /> if(ringbiao==1) //判断时钟是否开启<br /> {<br /> displayonechar(0x08,1,0xef);<br /> }<br />}<br /><br />void ds1302_init()<br />{<br /> write1302_bit(0x90,0xa9); //开涓流充电 <br /> W1302(0x8e,0x80); //写保护 <br />}<br /><br />////////////////////////////////////////////////////////<br />// //<br />// 按键调时模块 //<br />// //<br />// //<br />////////////////////////////////////////////////////////<br />//延时模块,一个单位延时大概为1ms<br />void delayms(uint z)<br />{<br /> uint x,y;<br /> for(x=z;x>0;x--)<br /> for(y=122;y>0;y--);<br />}<br /><br />//每一位调时模块<br />void changetime_bit0(uchar i,uchar code_change,uchar address_change,uchar line)<br />{<br /> sec=sec+1;<br /> write1302_bit(code_change,sec);<br /> if((sec&0x0f)>9)sec=sec&0xf0;<br /> displayonechar(address_change,line,sec%16+0x30);<br /> lcd_inputcode(0x80+0x40*line+address_change);<br /><br />}<br /><br />void changetime_bit1(uchar i,uchar j,uchar code_change,uchar address_change,uchar line)<br />{<br /> sec=sec+0x10;<br /> write1302_bit(code_change,sec);<br /> if((sec>>4)>j)sec=sec&0x0f;<br /> displayonechar(address_change,line,sec/16+0x30);;<br /> lcd_inputcode(0x80+0x40*line+address_change); <br />}<br /><br />//调时模块<br />void changetime() //调时钟时间<br />{ <br /> uchar i; //保证第一次在个位分 <br /> if(sw_add==0)<br /> {<br /> delayms(15);<br /> if(sw_add==0) //加按键判定<br /> {<br /> while(!sw_add); //松手判定<br /> delayms(15);<br /> while(!sw_add); //松手判定<br /> if(i==0) //个位秒的修改<br /> changetime_bit0(6,0x80,0x07,1); <br /> else if(i==1) //十位秒的修改 <br /> changetime_bit1(6,5,0x80,0x06,1);<br /> else if(i==2) //个位分的修改<br /> changetime_bit0(5,0x82,0x04,1);<br /> else if(i==3) //十位分的修改 <br /> changetime_bit1(5,5,0x82,0x03,1);<br /> else if(i==4) //个位小时修改<br /> changetime_bit0(4,0x84,0x01,1);<br /> else if(i==5) //十位小时修改<br /> changetime_bit1(4,2,0x84,0x00,1);<br /> else if(i==6) //周修改<br /> {<br /> sec[3]=sec[3]+1;<br /> write1302_bit(0x8a,sec[3]);<br /> if(sec[3]>7)sec[3]=0x01;<br /> week_buf=(sec[3]%16-1)*3;<br /> displayonechar(0x0c,0,week[week_buf]); //显示周<br /> displayonechar(0x0d,0,week[week_buf+1]); <br /> displayonechar(0x0e,0,week[week_buf+2]); <br /> lcd_inputcode(0x80+0x0c);<br /> }<br /> else if(i==7) //日个位修改<br /> changetime_bit0(2,0x86,0x0a,0);<br /> else if(i==8) //日十位修改<br /> changetime_bit1(2,3,0x86,0x09,0);<br /> else if(i==9) //月个位修改<br /> changetime_bit0(1,0x88,0x07,0);<br /> else if(i==10) //月十位修改<br /> changetime_bit1(1,1,0x88,0x06,0);<br /> else if(i==11) //年个位修改<br /> changetime_bit0(0,0x8c,0x04,0);<br /> else //年十位修改<br /> changetime_bit1(0,9,0x8c,0x03,0);<br /> }<br />}<br /> if(sw_move==0) //移动按键判定<br /> {<br /> delayms(20);<br /> if(sw_move==0)<br /> {<br /> while(!sw_move); //松手判定<br /> delayms(20);<br /> while(!sw_move); //松手判定<br /> if(i<12) i++;<br /> else i=0;<br /> } <br /> if(i==0) lcd_inputcode(0x80+0x40+7);<br /> else if(i==1) lcd_inputcode(0x80+0x40+6);<br /> else if(i==2) lcd_inputcode(0x80+0x40+4);<br /> else if(i==3) lcd_inputcode(0x80+0x40+3);<br /> else if(i==4) lcd_inputcode(0x80+0x40+1);<br /> else if(i==5) lcd_inputcode(0x80+0x40);<br /> else if(i==6) lcd_inputcode(0x80+0x0c);<br /> else if(i==7) lcd_inputcode(0x80+0x0a);<br /> else if(i==8) lcd_inputcode(0x80+0x09);<br /> else if(i==9) lcd_inputcode(0x80+0x07);<br /> else if(i==10) lcd_inputcode(0x80+0x06);<br /> else if(i==11) lcd_inputcode(0x80+0x04);<br /> else lcd_inputcode(0x80+0x03);<br /> } <br />} <br /><br />void changering_bit0(uchar i,uchar address_ring)<br />{<br /> clockring=clockring+1;<br /> if((clockring&0x0f)>9)clockring=clockring&0xf0;<br /> displayonechar(address_ring,1,clockring%16+0x30);<br /> lcd_inputcode(0x80+0x40+address_ring);<br />}<br /><br />void changering_bit1(uchar i,uchar j,uchar address_ring)<br />{<br /> clockring=clockring+0x10;<br /> if((clockring>>4)>j)clockring=clockring&0x0f;<br /> displayonechar(address_ring,1,clockring/16+0x30);<br /> lcd_inputcode(0x80+0x40+address_ring); <br />}<br /><br />void changering() //调闹钟时间<br />{ <br /> uchar i; <br /> if(sw_add==0)<br /> {<br /> delayms(15);<br /> if(sw_add==0) //按键判定<br /> {<br /> while(!sw_add); //松手判定<br /> delayms(15);<br /> while(!sw_add); //松手判定<br /> ringbiao=1;<br /> ringbegin=1;<br /> if(i==0) //个位分的修改<br /> changering_bit0(0,0x0a);<br /> else if(i==1) //十位分的修改 <br /> changering_bit1(0,5,0x09);<br /> else if(i==2) //个位小时修改<br /> changering_bit0(1,0x07);<br /> else if(i==3) //十位小时修改<br /> changering_bit1(1,2,0x06);<br /> }<br /> }<br /> if(sw_move==0) //按键判定<br /> {<br /> delayms(20);<br /> if(sw_move==0)<br /> {<br /> while(!sw_move); //松手判定<br /> delayms(20);<br /> while(!sw_move); //松手判定<br /> if(i<3) i++;<br /> else i=0;<br /> } <br /> if(i==0) lcd_inputcode(0x80+0x40+0x0a); //光标移动<br /> else if(i==1) lcd_inputcode(0x80+0x40+9);<br /> else if(i==2) lcd_inputcode(0x80+0x40+7);<br /> else if(i==3) lcd_inputcode(0x80+0x40+6);<br /> } <br /><br />}<br /><br />void change1302_bit(uchar address_1302,uchar line,uchar i)<br />{<br /> displayonechar(address_1302,line,sec/16+0x30); <br /> displayonechar(address_1302+1,line,sec%16+0x30); <br />}<br /><br />void display1302() //对当前sec数值进行提取显示<br />{<br /> lcd_clr();<br /> displayonechar(0x01,0,0x32);<br /> displayonechar(0x02,0,0x30);<br /> change1302_bit(0x03,0,0); //显示年<br /><br /> displayonechar(0x05,0,0x2d); //分隔符<br /> <br /> change1302_bit(0x06,0,1); //显示月<br /> <br /> displayonechar(0x08,0,0x2d); //分隔符<br /> <br /> change1302_bit(0x09,0,2);<br /> <br /> week_buf=(sec[3]%16-1)*3;<br /> displayonechar(0x0c,0,week[week_buf]); //显示周<br /> displayonechar(0x0d,0,week[week_buf+1]); <br /> displayonechar(0x0e,0,week[week_buf+2]); <br /><br /> change1302_bit(0x00,1,4); //显示时<br /><br /> displayonechar(0x02,1,0x3a); //分隔符<br /> <br /> change1302_bit(0x03,1,5); //显示分<br /><br /> displayonechar(0x05,1,0x3a); //分隔符<br /> <br /> change1302_bit(0x06,1,6); //显示秒<br />}<br /><br />//不同屏幕的显示函数<br />void screen0()<br />{<br /> lcd_clr();<br /> display1302();<br /> get1820();<br />}<br />void screen1()<br />{<br /> lcd_clr();<br /> displaychar(" made in fzu ",0);<br />}<br />void screen2()<br />{<br /> lcd_clr();<br /> ringdebug=0;<br /> displaychar(" bell ring ",0); <br /> displayonechar(0x06,1,clockring[1]/16+0x30); //显示时<br /> displayonechar(0x07,1,clockring[1]%16+0x30);<br /><br /> displayonechar(0x08,1,0x3a); //分隔符<br /> <br /> displayonechar(0x09,1,clockring[0]/16+0x30); //显示分<br /> displayonechar(0x0a,1,clockring[0]%16+0x30);<br />}<br /><br />//闹时界面<br />void displaybellring()<br />{<br /> lcd_clr();<br /> ringbiao=0;<br /> displaychar(" it's the time ",0);<br /> displaychar("press sw to stop",1); <br />}<br />//换屏幕显示<br />void changescreen()<br />{<br /> uchar i;<br /> if(sw_changeweb==0)<br /> {<br /> delayms(5);<br /> if(sw_changeweb==0)<br /> {<br /> if(i<2) i++;<br /> else i=0;<br /> }<br /> if(i==1)<br /> screen1();<br /> else if(i==2)<br /> screen2();<br /> else <br /> screen0();<br /> }<br /> while(sw_changeweb!=1); <br /> if(i==0) changetime();<br /> if(i==2) changering(); <br />}<br /><br />//对时钟进行调时<br />void changeclock() interrupt 2<br />{<br /> lcd_inputcode(0x0f); //开光标<br /> lcd_inputcode(0x80|0x4f); //将光标移位至最后一位<br /> while(sw_back!=0)<br /> {<br /> changescreen();<br /> }<br /> lcd_inputcode(0x0c); //关光标<br />}<br /><br />//闹钟判断<br />void bellring()<br />{<br /> if(clockring[0]==sec[5]&&clockring[1]==sec[4]&&ringdebug==0&&ringbegin==1)<br /> {<br /> lcd_clr();<br /> displaybellring();<br /> ring_bell=0;<br /> while(sw_back!=0);<br /> ring_bell=1;<br /> lcd_clr();<br /> ringdebug++;<br /> }<br />}<br /><br />//按键初始化模块<br />void sw_init()<br />{<br /> IT1=0; //使得外部中断的触发方式为低电平触发;<br /> EX1=1; //允许外部的中断0的中断请求<br /> PX1=1; //设置外部中断为高优先级 <br /> //开中断终端设置<br /> EA=1; //开中断总允许位<br />}<br /><br /><br />void main()<br />{<br /> lcd_init();<br /> lcd_clr();<br /> sw_init();<br /> dispaly_begin();<br /> ds1302_init();<br /> write1302();<br /> lcd_clr();<br /> while(1)<br /> { <br /> get1820();<br /> get1302();<br /> bellring();<br /> delayms(500); <br /> }<br /> //flash();<br /> <br />}<br /> |
|