Ⅰ 51單片機 用按鍵設定時鍾時間的原理
給你個思路。程序自己寫
void intterupt0(void) interrupt 0
{ while(k4==1)
{
if(k1==0)
{
delay(10);
while(k1==0);
p++;
}
else if(k2==0)
{
delay(10);
while(k2==0);
*p=*p++;
}
else if(k3==0)
{
delay(10);
while(k3==0);
*p=*p--;
}
DISPLAY(); //顯示b[]中的內容
if(*p=='\0')
p=b;
}
p=b;
}
簡單和你說下。
p定義一個指向數組b的指針
數組b為從時鍾晶元中讀取的時間內容,格式,秒,分,時,日,月,星期,年
用了5個按鍵。一個按鍵控制中斷,一個按鍵退出修改(K4)。進入中斷後,若K4不按下,則在WHILE(K4)里一直循環,K1,指針地址+1,K2指針值+1,K3,指針值-1; 改完了後,將修改好的B里的值顯示出來。由於DISPLAY()是在循環中的,所以每修改一個鍵,他就會被調用顯示一次,就實現了實時修改顯示的目的。修改完後,按下K4,跳出循環。最後將b[]中的值存入時鍾晶元,OK了
不知道你懂沒。
時鍾晶元用DS1302
Ⅱ 51單片機簡單電子時鍾程序,通過按鍵設置時間,有圖,有解析!
#include<reg52.h>
#include<stddef.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD1602_FLAG
#defineLCD1602_PORTP0
sbitlcd1602_rs=P2^0;
sbitlcd1602_e=P2^2;
sbitlcd1602_rw=P2^1;
sbitlcd1602_busy=P0^7;
sbitkey_ch=P3^5;
sbitkey_add=P3^6;
sbitkey_minus=P3^7;
uchari,sec,min,h,date,month,flag;
uintyear;
uchar*chgstr[7]={"","sec","min","hour","date","min","year"};
ucharj,k,m,n,o,p;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchartimestr[10],datestr[10];
voidinit();
voiddelay(uint);
voidtime_display();
voiddate_display();
voidcontrol();
voidtime();
/*
************************************
*函數名稱:lcd1602_CheckBusy()
*函數功能:狀態查詢
************************************
*/
voidlcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
/*
***************************************
*函數名稱:lcd1602_WriteCmd()
*函數功能:寫命令
*入口參數:命令字
*出口參數:無
***************************************
*/
voidlcd1602_WriteCmd(constucharcmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*******************************************
*函數名稱:lcd1602_WriteData()
*函數功能:寫數據
*入口參數:c--待寫數據
*出口參數:無
*********************************************
*/
voidlcd1602_WriteData(constucharc)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
***********************************************
*函數名稱:lcd1602_Init()
*函數功能:初始化LCD
*入口參數:無
*出口參數:無
***********************************************
*/
voidlcd1602_Init()
{
lcd1602_WriteCmd(0x38); //顯示模式為8位2行5*7點陣
lcd1602_WriteCmd(0x0c);//displayenable,flagenable,flashenable,
lcd1602_WriteCmd(0x06);//flagmovetoright,screendon'tmove
lcd1602_WriteCmd(0x01);//clearscreen
}
/*
************************************************
*函數名稱:lcd1602_Display()
*函數功能:字元顯示
*入口參數:ptr--字元或字元串指針
*出口參數:無
*說明:用戶可通過以下方式來調用:
*1)lcd1602_Display("Hello,world!");
*2)INT8U存儲類型txt[]="要顯示的字元串";
*或者INT8U存儲類型txt[]={'t','x','t',..,'