|
在仿真上可以顯示并可調(diào),但是在單片機(jī)板子上不能實(shí)現(xiàn),用的是不b104 的板子,用了按鍵調(diào)時(shí)間,鬧鐘這是程序
是不是在lcd1602上需要用ascii碼值,但是我不知道該怎樣改驅(qū)動(dòng)里面的數(shù)據(jù)轉(zhuǎn)換呀- #include<reg51.h>
- #include<lcd1602.c>
- #include<display.c>
- #include<ds1302.c>
- #include<key.c>
- void timer0_isr()interrupt 1
- {
- TL0= (65536-2000)%256;
- TH0= (65536-2000)/256;
- cp++;
-
- if(cp>=250) //半秒的時(shí)間
- {
- cp=0;
- cp1++;
- cp2++;
- P0= 0xff;
-
- }
-
- if(cp1>= 2)
- {
- cp1= 0;
- flash= ~flash;
- if(key_flag> 8 || key_flag <= 0)
- {
- display();
- }
- else
- display_key_scan();
- P0= 0xff;
- //FL1602_clear();
- }
- if(time[6]== hour && time[7] == min) //響?hù)[鐘的時(shí)間
- {
- buzzer= 0;
- if(cp3>= 5000) //十秒鐘后自動(dòng)關(guān)閉
- {
- cp3= 0;
- buzzer= 1;
- cp4++;
- }
- if(cp4>= 3) //30秒后自動(dòng)開(kāi)啟
- {
- cp4= 0;
- buzzer= 0;
- }
- }
- elsebuzzer = 1;
- }
- void timer0_init()
- {
- TMOD= 0x01;
- TL0= (65536-2000)%256;
- TH0= (65536-2000)/256;
- EA= 1;
- ET0= 1;
- TR0= 1;
- }
- void main(void)
- {
- init_ds1302();
- FL1602_init();
- timer0_init();
- FL1602_clear();
- while(1)
- {
- buzzer= 0;
- key_scan();
- get_ds1302_time();
- }
- }
- ///////////////////////////////////////////////////////////////
- 這是ds1302
- #include<reg51.h>
- /*********************************************************************************/
- //ds1302驅(qū)動(dòng)
- //2011年5月
- /*********************************************************************************/
- #define uchar unsigned char /*宏定義用uchar 代替unsignedchar*/
- #define uint unsigned int /*宏定義用uint 代替 unsignedint*/
- sbit ret = P3^7;
- sbit scl = P3^6;
- sbit sd = P3^4;
- //uchar sec, min, hour, date, month, year,week;
- void ds1302_init(void)
- {
- ret= 0;
- scl= 0;
- ret= 1;
- }
- /*********************************對(duì)DS1302寫(xiě)1字節(jié)函數(shù)*****************************/
- void write_ds1302_onebyte(uchar dat)
- {
- uchari;
- for(i= 0;i < 8;i++)
- {
- sd= dat & 0x01;
- scl= 0;
- scl= 1;
- dat= dat >> 1;
- }
- }
- /*********************************從DS1302讀一字節(jié)函數(shù)*****************************/
- uchar read_ds1302_onebyte(void)
- {
- uchari,dat;
- for(i= 0;i < 8;i++)
- {
- scl= 1;
- dat= dat >> 1;
- scl= 0;
- if(sd)dat= dat | 0x80;
- }
- return(dat);
- }
- /*****************************對(duì)DS1302的某一地址寫(xiě)一字節(jié)函數(shù)***********************/
- void write_ds1302_add_dat(uchar add,uchardat)
- {
- ds1302_init();
- write_ds1302_onebyte(add);
- write_ds1302_onebyte(dat);
- scl= 1;
- ret= 0;
- }
- /*****************************從DS1302的某一地址讀一字節(jié)函數(shù)***********************/
- uchar read_ds1302_add_dat(uchar add) /*讀1302數(shù)據(jù)*/
- {
- uchardat_temp;
- ds1302_init();
- write_ds1302_onebyte(add);
- dat_temp= read_ds1302_onebyte();
- scl= 1;
- ret= 0;
- return(dat_temp);
- }
- /********************************8421BCD碼到十進(jìn)制轉(zhuǎn)換*****************************/
- uchar BCD_DEC_conv(uchar x)
- {
- uchardec;
- dec= 0x0f & x;
- x= x >> 4;
- dec = dec + x * 10;
- return(dec);
- }
- /********************************十進(jìn)制到8421BCD碼轉(zhuǎn)換*****************************/
- uchar DEC_BCD_conv(uchar x)
- {
- ucharbcd;
- bcd= x % 10;
- x= x / 10;
- x= x << 4;
- bcd = bcd | x ;
- return(bcd);
- }
- /*******************從ds1302中獲得時(shí)間函數(shù)函數(shù)**********************/
- void get_ds1302_time(void) //獲取1302的時(shí)間數(shù)據(jù)(時(shí)、分、秒),存入time1數(shù)組中
- {
- uchard;
- d= read_ds1302_add_dat(0x81); //讀秒
- sec= BCD_DEC_conv(d); //得到秒
- d= read_ds1302_add_dat(0x83); //讀分
- min= BCD_DEC_conv(d); //得到分
- d= read_ds1302_add_dat(0x85); //讀小時(shí)
- hour= BCD_DEC_conv(d); //得到小時(shí)
- d= read_ds1302_add_dat(0x8b); //讀周
- week= BCD_DEC_conv(d); //得到周
- d= read_ds1302_add_dat(0x87); //讀日
- date= BCD_DEC_conv(d); //得到日
- d = read_ds1302_add_dat(0x89); //讀月
- month= BCD_DEC_conv(d); //得到月
- d = read_ds1302_add_dat(0x8d); //讀年
- year= BCD_DEC_conv(d); //得到年
- }
- /*******************DS1302初始化函數(shù)hanshu*********************/
- void init_ds1302(void)
- {
- write_ds1302_add_dat(0x8e,0x00); //寫(xiě)允許
- write_ds1302_add_dat(0x80,DEC_BCD_conv(19)); //寫(xiě)年
- write_ds1302_add_dat(0x84,DEC_BCD_conv(4)); //寫(xiě)月
- write_ds1302_add_dat(0x82,DEC_BCD_conv(23)); //寫(xiě)日
- write_ds1302_add_dat(0x80,DEC_BCD_conv(3)); //寫(xiě)星期
- write_ds1302_add_dat(0x84,DEC_BCD_conv(10)); //寫(xiě)時(shí)
- write_ds1302_add_dat(0x82,DEC_BCD_conv(12)); //寫(xiě)分
- write_ds1302_add_dat(0x80,DEC_BCD_conv(16)); //寫(xiě)秒
- write_ds1302_add_dat(0x8e, 0x80); //寫(xiě)保護(hù)
- }
- //////////////////////////////////////////////////////////
- 顯示函數(shù)
- #include<reg51.h>
- //#include"key.c"
- uchari,year,month,date,hour,week,min,sec,flash,cp1,key_flag,cp,cp2,cp3,cp4;
- char time[9];
- sbit buzzer = P3^2;
- void display(void)
- {
- goto_row_column(1,4);//第一行
- // display_string("20");//顯示2
- display_num(year);
- display_string("/");
- display_num(month);
- display_string("/");
- display_num(date);
- goto_row_column(2,4);
- display_num(hour);
- if(flash)display_string(":"); else display_string(" ");
- display_num(min);
- if(flash)display_string(":"); else display_string(" ");
- display_num(sec);
- // delay(50000);
- // // FL1602_clear();
- // goto_row_column(1,4);
- // display_string("20"); //顯示2
- // display_num(year);
- // display_string("/"); //顯示字母及符號(hào)的方式
- // display_num(month);
- // display_string("/");
- // display_num(date);
- // delay(50000);delay(50000);delay(50000);
- // goto_row_column(2,4);
- // display_num(hour);
- // if(flash== 1) display_string("");
- // else display_string(":");//冒號(hào)閃爍0x00if(flash== 0xff) 0x00 if(flash == 0xff )
- // display_num(min);
- // if(flash== 1 )display_string(" ");
- // elsedisplay_string(":");//冒號(hào)閃爍
- // display_num(sec);
- // delay(50000);delay(50000);delay(50000);//delay(50000);
- //
- // i++;
- // if(i> 100)i = 0;
- }
- void display_key_scan(void) //顯示調(diào)整時(shí)的時(shí)間
- {
- if(key_flag > 6)
- {
- goto_row_column(1,0);
- display_string("****ding nao****");
- goto_row_column(2,4);
- if(key_flag == 7) //調(diào)整時(shí)的小時(shí)
- {
- if(flash)
- display_num(time[6]);
- else
- display_string(" ");
- }
- else
- display_num(time[6]);
- if(flash==0x00) //
- display_string(":");
- else
- display_string("");
- if(key_flag == 8) //
- {
- if(flash)
- display_num(time[7]);
- else
- display_string(" ");
- }
- else
- display_num(time[7]);
- display_string(" ");
-
- }
- else //調(diào)整顯示狀態(tài)下的時(shí)分秒
- {
- goto_row_column(1,4);//第一行
- if(key_flag== 1) //顯示年的調(diào)整值并閃爍
- {
- if(flash)
- display_num(time[0]);
- else
- display_string(" ");
- }
- else
- display_num(time[0]);
- display_string("/");
- if(key_flag== 2) //顯示月的調(diào)整值并閃爍
- {
- if(flash)
- display_num(time[1]);
- else
- display_string(" ");
- }
- else
- display_num(time[1]);
- display_string("/");
-
- if(key_flag== 3) //顯示日的調(diào)整值并閃爍
- {
- if(flash)
- display_num(time[2]);
- else
- display_string(" ");
- }
- else
- display_num(time[2]);
- goto_row_column(2,4);
-
- if(key_flag== 4) //顯示時(shí)的調(diào)整值并閃爍
- {
- if(flash)
- display_num(time[3]);
- else
- display_string(" ");
- }
- else
- display_num(time[3]);
-
- if(flash) //冒號(hào)的顯示并閃爍 == 0x00
- display_string(":");
- else
- display_string("");
-
- if(key_flag== 5) //顯示分的調(diào)整值并閃爍
- {
- if(flash)
- display_num(time[4]);
- else
- display_string(" ");
- }
- else
- display_num(time[4]);
-
- if(flash) //冒號(hào)的顯示并閃爍==0x00
- display_string(":");
- else
- display_string("");
-
- if(key_flag== 6) //顯示秒的調(diào)整值并閃爍
- {
- if(flash)
- display_num(time[5]);
- else
- display_string(" ");
- }
- else
- display_num(time[5]);
- }
- // FL1602_clear();
- }
- //////////////////////////////////////////
- Lcd1602
- #include<reg51.h> //這兩個(gè)驅(qū)動(dòng)均是正確的
- #define uchar unsigned char
- #define uint unsigned int
- uchar num[] = "0123456789";
- sbit RS = P1^7;
- sbit RW = P1^6;
- sbit E = P1^5;
- void delay(uint x)
- {
- while(x--);
- }
- void write_command(uchar command) /*寫(xiě)指令函數(shù)*/
- {
- RW= 0;
- RS= 0;
- P0= command;
- E= 1;
- delay(100);
- E= 0;
- RW= 1;
- }
- void write_dat(uchar dat) /*寫(xiě)數(shù)據(jù)函數(shù)*/
- {
- RW= 0;
- RS= 1;
- P0= dat;
- E= 1;
- delay(100);
- E= 0;
- RW= 1;
- }
- void display_string(char *p) /*字符串函數(shù)*/
- {
- while(*p)
- {
- write_dat(*p);
- p++;
- }
- }
- void display_num(uchar x) //向lcd1602寫(xiě)數(shù)字變量
- {
- write_dat(num[x/ 10]);
- write_dat(num[x% 10]);
- }
- void goto_row_column(uchar row, ucharcolumn) /*行列控制函數(shù)*/
- {
- if(row== 1)
- {
- write_command(0x80+ column);
- delay(100);
- }
- elseif(row == 2)
- write_command(0xc0 + column); // 0xC0
- }
- void FL1602_init(void) /*初始化函數(shù)*/
- {
- write_command(0x38); /*設(shè)置兩行,每行16個(gè)字符,每個(gè)字符5*7點(diǎn)陣,8位數(shù)據(jù)接口*/
- write_command(0x0f);
- delay(100);
- write_command(0x0c); /*設(shè)置開(kāi)顯示*/
- write_command(0x06); /*設(shè)置當(dāng)讀或?qū)懸粋(gè)字節(jié)后,地址指針加1,且光標(biāo)加1*/
- }
- void FL1602_clear(void) /*清屏函數(shù)*/
- { /*設(shè)置清屏指令,單片機(jī)向1602的數(shù)據(jù)端口寫(xiě)入0x01后,1602自動(dòng)將本身DDRAM的內(nèi)容全部填入“空白”
- 的ASCII碼20H,并將地址計(jì)數(shù)器AC的值設(shè)為0,同時(shí)光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方
- ,此時(shí)顯示器無(wú)顯示。*/
- write_command(0x01);
- write_command(0x02);
-
- }
- //////////////////////////////////////////////////////////////
- 按鍵部分
- #include<reg51.h>
- unsigned char seven_seg[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- unsigned char key_flag,i,j,year,month,date,hour,min,sec; //用一變量記載13按鍵按下的次數(shù)
- code uchar key_scan_row[] ={0x7f,0xbf,0xdf,0xef};
- code uchar key_value[] = {
- 0xee,0xed,0xeb,0xe7,
- 0xde,0xdd,0xdb,0xd7,
- 0xbe,0xbd,0xbb,0xb7,
- 0x7e,0x7d,0x7b,0x77
- };
- char time[9] ;
- uchar key_mode; /*為了避免每次調(diào)整完一個(gè)數(shù)據(jù)后不再?gòu)膁s1302中讀取數(shù)據(jù),即LCD1602上顯示的數(shù)據(jù)位當(dāng)前的調(diào)整值*/
- void key_scan(void) //讓鍵盤(pán)行線(xiàn)輸出掃描數(shù)據(jù)
- {
- P2= key_scan_row[ i];
- [ i]
- if(P2!= key_scan_row[ i]) //[ i]如果有按鍵按下,P2口不是原來(lái)的掃描數(shù)據(jù);
- [ i]
- {
- delay(200);
- for(j= 0;j < 16;j ++)
- {
- if(j == 13) //切換鍵&& key_flag >= 1
- {
- if(P2== key_value[j] )
- {
- delay(200);
- key_flag++;
- if(key_flag> 8) key_flag = 0;
- key_mode++;
- if(key_mode== 1)
- {
- time[0]= year;
- time[1]= month;
- time[2]= date;
- time[3]= hour;
- time[4]= min;
- time[5]= sec;
- }
- }
- }
- if(j== 14)
- {
- if(P2== key_value[j] ) //加鍵
- {
- delay(200);
- if(key_flag == 1) time[0] ++;if(time[0] >=100) time[0] = 0; //年
- if(key_flag == 2) time[1] ++;if(time[1] >=13) time[1] = 1; //月
- if(key_flag == 3) time[2] ++;if(time[2] >=31) time[2] = 1; //日
- if(key_flag == 4) time[3] ++;if(time[3] >=24) time[3] = 0; //時(shí)
- if(key_flag == 5) time[4] ++;if(time[4] >=60) time[4] = 0; //分
- if(key_flag == 6) time[5] ++;if(time[5] >=60) time[5] = 0; //秒
- if(key_flag == 7) time[6] ++;if(time[5] >=24) time[6] = 0; // 定時(shí)
- if(key_flag == 8) time[7] ++;if(time[5] >=60) time[7] = 0; // 定分
- }
- }
- if(j== 15)
- {
- if(P2== key_value[j] ) //減鍵
- {
- delay(200);
- if(key_flag == 1) time[0] --;if(time[0] <0) time[0] = 99; //年
- if(key_flag == 2) time[1] --;if(time[1] <1) time[1] = 12; //月
- if(key_flag == 3) time[2] --;if(time[2] <1) time[2] = 31; //日
- if(key_flag == 4) time[3] --;if(time[3] <0) time[3] = 23; //時(shí)
- if(key_flag == 5) time[4] --;if(time[4] <0) time[4] = 59; //分
- if(key_flag == 6) time[5] --;if(time[5] <0) time[5] = 59; //秒
- if(key_flag == 7) time[6] --;if(time[5]<0) time[7] = 23; // 定時(shí)
- if(key_flag == 8) time[7] --;if(time[5]<0) time[8] = 59; // 定分
- }
- }
- if(j== 12) //退出鍵,退出模式
- {
- if(P2== key_value[j] )
- {
- delay(200);
- key_flag= 0;
- key_mode= 0;
- write_ds1302_add_dat(0x8e,0x00); //寫(xiě)允許
- write_ds1302_add_dat(0x8c,DEC_BCD_conv(time[0])); //寫(xiě)年
- write_ds1302_add_dat(0x88,DEC_BCD_conv(time[1])); //寫(xiě)月
- write_ds1302_add_dat(0x86,DEC_BCD_conv(time[2])); //寫(xiě)日
- // write_ds1302_add_dat(0x8a,DEC_BCD_conv(time[3])); //寫(xiě)周
- write_ds1302_add_dat(0x84,DEC_BCD_conv(time[3])); //寫(xiě)時(shí)
- write_ds1302_add_dat(0x82,DEC_BCD_conv(time[4])); //寫(xiě)分
- write_ds1302_add_dat(0x80,DEC_BCD_conv(time[5])); //寫(xiě)秒
- write_ds1302_add_dat(0x8e,0x80); //寫(xiě)保護(hù)
- }
- }
- if(j== 11) //直接調(diào)到定鬧模式
- {
- if(P2== key_value[j] )
- {
- delay(200);
- key_flag = 7;
- if(key_flag > 8 )key_flag = 0;
- }
- }
- if(j== 10) //關(guān)閉鬧鐘按鍵
- {
- if(P2== key_value[j] )
- {
- delay(200);
- buzzer= 1;
- }
- }
- }
- while(P2!= key_scan_row[ i]);
- [ i]
- }
- i++;
- if(i>= 4)i = 0;
- }
復(fù)制代碼
|
|