/***********說明*************/
/***
第一行顯示:加熱模式:強(P2^0=1、P2^1=0)或弱(P2^0=0、P2^1=1)(由按鍵S4切換)
第二行顯示:加熱時間還剩:
第三行顯示: 時 分 秒
第四行顯示:加熱中或加熱結束(倒計時結束時)。
按下開關S1,開始設定秒,秒編輯位閃動,
按下S2增加或S3減小數值;
在按下開關S1,秒確定,設定分;
再按下S1,分確定,設定小時。
再按下S1,時間確定。
再按下S1,開始倒計時并使P1^5=0。到達定時時間后P1^5=1。
12864采用:www點jlxlcd點cn/UpFile/2015922133914.pdf
sbit Rom_OUT=P1^2;
sbit Rom_IN=P1^1;
sbit Rom_SCK=P1^3;
sbit Rom_CS=P1^4;
sbit lcd_sda=P3^1;
sbit lcd_sck=P3^2;
sbit lcd_rs=P3^0;
sbit lcd_reset=P1^6;
sbit lcd_cs1=P1^7;
sbit LEDA=P3^3;
sbit s1=P3^4;//設置按鈕
sbit s2=P3^5;
sbit s3=P3^6;
sbit s4=P3^7;
參考程序如下(并口)
***/
/*****
簡介:第一行顯示,距離系統爆炸時間
第二行顯示,還剩
第三行顯示,00時,00分,00秒
第四行顯示, 周林
按下旋鈕開關,開始設定秒,秒編輯位閃動。左右旋轉設定數值,
在按下開關,秒確定,設定分,分編輯位閃動左右調數值,
再按下,分確定,小時位閃動。左右轉調小時,再按一下。時間確定,開始倒計時。到達定時時間后停止,并閃動。
*****/
- #include <reg52.h>
- #include <intrins.h>
- /********************* 定義 ********************************/
- #define LCD_data P0 //數據口
- sbit LCD_RS = P2 ^ 0; //寄存器選擇輸入
- sbit LCD_RW = P2 ^ 1; //液晶讀/寫控制
- sbit LCD_EN = P2 ^ 2; //液晶使能控制
- sbit LCD_PSB = P2 ^ 3; //串/并方式控制
- sbit LCD_RST = P2 ^ 5; //液晶復位端口
- sbit sset=P3^4;//設置按鈕
- sbit spk=P1^4;
- sbit sadd=P2^7;
- sbit sdel=P2^6;
- signed char second=0,minute=0,hour=0,count=0,keycount=0;
- signed char key=0;
- unsigned char code DIS1[] =
- {
- "距離系統爆炸時間"
- };
- unsigned char code DIS2[] =
- {
- "還剩:"
- };
- unsigned char code DIS31[] =
- {
- "時"
- };
- unsigned char code DIS32[] =
- {
- "分"
- };
- unsigned char code DIS33[] =
- {
- "秒"
- };
- unsigned char code DIS4[] =
- {
- "周林"
- };
- unsigned char code table2[]="0123456789";
- char code reserve[3]_at_ 0x3b; //保留0x3b開始的3個字節
- /*********************延時子函數**************************/
- void delayNOP()//us延時子函數 (4.34us)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- void delayms(unsigned int ms)//ms延時子函數
- {
- unsigned char y;
- while (ms--)
- {
- for (y = 0; y < 114; y++)
- ;
- }
- }
- //******************檢查LCD忙狀態**************************
- bit lcd_busy()//檢查LCD忙狀態 1忙,0閑
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(P0 &0x80);
- LCD_EN = 0;
- return (result);
- }
- //***********************寫指令數據***********************
- void lcd_wcmd(unsigned char cmd)//寫指令數據到LCD
- {
- while (lcd_busy())
- {
- ;
- }
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 1;
- P0 = cmd;
- delayNOP();
- LCD_EN = 0;
- }
- void lcd_wdat(unsigned char dat)//寫顯示數據到LCD
- {
- while (lcd_busy())
- ;
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 1;
- P0 = dat;
- delayNOP();
- LCD_EN = 0;
- }
- void writesmh(unsigned char add,unsigned char date)//顯示個位和十位數據
- {
- unsigned char shi,ge;
- shi=date/10;
- ge=date%10;
- lcd_wcmd(0x80+add);
- delayms(5);
- lcd_wdat(table2[shi]);
- delayms(5);
- lcd_wdat(table2[ge]);
- delayms(5);
- }
- //*********************初始化設定****************************
- void lcd_init()
- {
- LCD_PSB = 1; //并口方式
- LCD_RST = 0; //液晶復位
- delayms(5); //液晶復位
- LCD_RST = 1; //液晶復位
- delayms(5); //液晶復位
- lcd_wcmd(0x34); //擴充功能設定,擴充指令,選8位數據
- delayms(5);
- lcd_wcmd(0x30); //功能設定,基本指令操作,選8位數據
- delayms(5);
- lcd_wcmd(0x0C); //顯示開,關光標,關光標反白允許。
- delayms(5);
- lcd_wcmd(0x04); //光標的移動方向
- delayms(5);
- lcd_wcmd(0x01); //清除LCD的顯示內容
- delayms(5);
- TMOD=0x01;
- TH0=0x3C;
- TL0=0xB0;
- EA=1;
- ET0=1;
- TR0=0;
- EX0=0; //外部中斷0允許
- IT0=1; //外部中斷0為邊沿觸發方式
- }
- //*********************設定顯示位置子函數**********************
- void lcd_pos(unsigned char X, unsigned char Y)//設定顯示位置
- {
- unsigned char pos;
- if (X == 1)
- {
- X = 0x80;
- }
- else if (X == 2)
- {
- X = 0x90;
- }
- else if (X == 3)
- {
- X = 0x88;
- }
- else if (X == 4)
- {
- X = 0x98;
- }
- pos = X + Y; //確定顯示地址
- lcd_wcmd(pos); //寫顯示地址
- }
- //*****************清屏子函數***************************
- void clr_screen()//清屏子函數
- {
- lcd_wcmd(0x34); //擴充指令操作
- delayms(5);
- lcd_wcmd(0x30); //基本指令操作
- delayms(5);
- lcd_wcmd(0x01); //清屏
- delayms(5);
- }
- //******************閃爍子函數**************************
- void lcdflag()
- {
- lcd_wcmd(0x08); //關閉顯示
- delayms(500);
- lcd_wcmd(0x0c); //開啟顯示
- delayms(500);
- lcd_wcmd(0x08);
- delayms(500);
- lcd_wcmd(0x0c);
- delayms(500);
- lcd_wcmd(0x08);
- delayms(500);
- lcd_wcmd(0x0c);
- delayms(500);
- }
- //******************寫字符串子函數*************************
- void wr_string(unsigned char str[])//寫字符串子函數
- {
- unsigned char num = 0;
- while (str[num])
- {
- lcd_wdat(str[num++]); //寫數據
- }
- }
- //********************按鍵設置時間*************************
- void keyscan()//按鍵設置時間
- {
-
- if(sset==0)
- {
- delayms(10);
- if(sset==0)
- {
- EX0=1;
- keycount++;
- while(sset==0)
- {
- ;
- }
- if(keycount==1)
- {
- TR0=0; //停止計時
- key=1;
- keycount=2;
- lcd_wcmd(0x8e);
- lcd_wcmd(0x0d);//秒位閃爍
-
- }
- if(keycount==2)
- {
-
- ;
-
- }
- if(keycount==3)
- {
- keycount=4;
- lcd_wcmd(0x8c);
- lcd_wcmd(0x0d);//分位閃爍
- //lcd_wcmd(0x04);光標左移一位
- }
- if(keycount==4)
- {
- ;
-
-
- }
- if(keycount==5)
- {
- keycount=6;
- lcd_wcmd(0x8a);
- lcd_wcmd(0x0d);//時位閃爍
-
- }
- if(keycount==6)
- {
- ;
- }
- if(keycount==7)
- {
- keycount=0;
-
- lcd_wcmd(0x0c);//停止閃爍
- TR0=1; //開始計時
- EX0=1;
-
- }
- }
- }
-
- if(keycount!=0)
- {
- if(keycount==2)//編輯秒
- {
- if(sadd==0)//數值加1
- {
- delayms(10);
- if(sadd==0)
- {
- second++;
- if(second==60)
- {
- second=0;
- }
- sadd=1;
- }
- writesmh(0x0e,second);
- lcd_wcmd(0x8e);
- lcd_wcmd(0x0d);//秒位閃爍
-
- }
- if(sdel==0)//數值減1
- {
- delayms(10);
- if(sdel==0)
- {
-
- if(second==0)
- {
- second=60;
- }
- second--;
- sdel=1;
- }
- writesmh(0x0e,second);
- lcd_wcmd(0x8e);
- lcd_wcmd(0x0d);//秒位閃爍
-
- }
-
-
-
- }
- if(keycount==4)//編輯分鐘
- {
- if(sadd==0)//數值加1
- {
- delayms(10);;
- if(sadd==0)
- {
- minute++;
- if(minute==60)
- {
- minute=0;
- }
- sadd=1;
- }
- writesmh(0x0c,minute);
- lcd_wcmd(0x8c);
- lcd_wcmd(0x0d);//分位閃爍
- }
- if(sdel==0)//數值減1
- {
- delayms(10);
- if(sdel==0)
- {
-
- if(minute==0)
- {
- minute=60;
- }
- minute--;
- sdel=1;
- }
- writesmh(0x0c,minute);
- lcd_wcmd(0x8c);
- lcd_wcmd(0x0d);//分位閃爍
- }
-
-
- }
- if(keycount==6)//編輯小時
- {
- if(sadd==0)//數值加1
- {
- delayms(10);
- if(sadd==0)
- {
- hour++;
- if(hour==24)
- {
- minute=0;
- }
- sadd=1;
- }
- writesmh(0x0a,hour);
- lcd_wcmd(0x8a);
- lcd_wcmd(0x0d);//時位閃爍
- }
- if(sdel==0)//數值減1
- {
- delayms(10);
- if(sdel==0)
- {
-
- if(hour==0)
- {
- hour=24;
- }
- hour--;
- sdel=1;
- }
- writesmh(0x0a,hour);
- lcd_wcmd(0x8a);
- lcd_wcmd(0x0d);//時位閃爍
- }
-
-
- }
-
- }
- }
- //主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數
- void main()
- {
- delayms(100); //上電,等待穩定
- lcd_init(); //初始化LCD
-
- lcd_pos(1, 0); //設置顯示位置為第一行
- wr_string(DIS1);
- lcd_pos(2, 0); //設置顯示位置為第二行
- wr_string(DIS2);
- lcd_pos(3, 3); //設置顯示位置為第四行
- wr_string(DIS31);
- lcd_pos(3, 5); //設置顯示位置為第四行
- wr_string(DIS32);
- lcd_pos(3, 7); //設置顯示位置為第四行
- wr_string(DIS33);
- lcd_pos(4, 6); //設置顯示位置為第四行
- wr_string(DIS4);
-
- writesmh(0x0e,second);
- delayms(5);
- writesmh(0x0c,minute);
- delayms(5);
- writesmh(0x0a,hour);
- delayms(5);
-
- while (1)
- {
-
- keyscan();
-
-
- }
- }
- //**********************中斷***************************
- void time0() interrupt 1 using 0//倒計時中斷
- {
-
- TH0=0x3C;
- TL0=0xB0;
- count++;
- if(count==20)
- {
- count=0;
- second--;
- if(second<0)
- {
- second=59;
- minute--;
- if(minute<0)
- {
- minute=59;
- hour--;
- if(hour<0)
- {
- hour=24;
- }
- lcd_pos(3, 2); //設置顯示位置為第三行,第七列
- writesmh(0x0a,hour);
- }
- lcd_pos(3, 4); //設置顯示位置為第三行,第七列
- writesmh(0x0c,minute);
- }
- lcd_pos(3, 6); //設置顯示位置為第三行,第七列
- writesmh(0x0e,second);
- if((second==0)&&(minute==0)&&(hour==0))//到點后響鈴
- {
- TR0=0;
- spk=0;
- second=0;
- minute=0;
- hour=0;
- lcdflag();
-
- spk=1;
-
- }
- }
-
- }
- void encoder(void) interrupt 0//外部中斷0 旋轉碼開關中斷程序
- {
- if(INT1==1)
- {
- sadd=0;
- sdel=1;
-
- }
- if(INT1==0)
- {
- sdel=0;
- sadd=1;
-
- }
- }
- //*********************************************************
復制代碼
|