微波炉定时c语言程序,微波炉控制系统c语言编程.doc
#include #define nop _nop_
#define uchar unsigned char
#define uint unsigned int
/*****************************************************************************/
//定義
sbit WEI_LE=P1^1;//數碼管控制
sbit DUAN_LE=P1^0;
sbit RS=P2^0;//LCD端口
sbit RW=P2^1;
sbit E=P2^2;
#define DB P0
sbit PSB=P2^3;
sbit NC=P2^4;
sbit RST=P2^5;
sbit BEEP=P1^0;//蜂鳴器
sbit KEY1=P3^4;//按鍵
sbit KEY2=P3^5;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
uchar key_up,key_x;//按鍵變量
uchar fire,min,sec;//火力和時間變量
uchar o_hour,o_min,o_sec;//預約時間變量
/*****************************************************************************/
//輔助函數
//延遲函數
void delay50us(uint m)//for雙重嵌套型。公式:t=m*(2*n+12)+偏差值。m比較小時,偏差為+13;m=0時,t=14。
{
uchar n;
for(;m>0;m--)
for(n=19;n>0;n--);
}
void delay500us(uint m)//for雙重嵌套型。公式:t=m*(2*n+12)+偏差值。m比較小時,偏差為+13;m=0時,t=14。
{
uchar n;
for(;m>0;m--)
for(n=244;n>0;n--);
}
/*****************************************************************************/
//底層驅動
//LCD驅動
void lcd_wcom(uchar com)//寫指令函數
{
delay50us(1);
RS=0;
RW=0;
DB=com;
E=1;
delay50us(1);
E=0;
}
void lcd_wdat(uchar dat)//寫數據函數
{
delay50us(1);
RS=1;
RW=0;
DB=dat;
E=1;
delay50us(1);
E=0;
}
void lcd_init()//初始化
{
lcd_wcom(0x30);
delay50us(2);
lcd_wcom(0x30);
delay50us(1);
lcd_wcom(0x0c);
delay50us(2);
lcd_wcom(0x01);
delay500us(20);
lcd_wcom(0x06);
delay50us(2);
}
void lcd_wstr(uchar *s)//寫字符串
{
while(*s!=0)lcd_wdat(*s++);
}
void lcd_clr()//清屏
{
lcd_wcom(0x01);
delay500us(3);
}
//按鍵驅動
void key_get()//按鍵錄入
{
if(KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1){key_up=1;}
else
{
if(KEY1==0 && key_up==1){key_up=0;key_x=1;}
else if(KEY2==0 && key_up==1){key_up=0;key_x=2;}
else if(KEY3==0 && key_up==1){key_up=0;key_x=3;}
else if(KEY4==0 && key_up==1){key_up=0;key_x=4;}
delay500us(100);//防抖
}
}
/*****************************************************************************/
//應用層函數
//顯示相關信息
void dis_author()//作者
{
lcd_clr();
lcd_wcom(0x80);lcd_wstr("作者:");lcd_wstr("黃志輝");
lcd_wcom(0x93); lcd_wstr("董曉敏");
lcd_wcom(0x8b); lcd_wstr("蔡定材");
while(key_up==0)key_get();
key_x=0;
}
//預約時間
void order_mark(uchar sel)//預約光標
{
switch(sel)
{
case 1:lcd_wcom(0x89);lcd_wcom(0x0e);break;
case 2:lcd_wcom(0x8b);lcd_wcom(0x0e);break;
case 3:lcd_wcom(0x8d);lcd_wcom(0x0e);break;
case 4:lcd_wcom(0x9a);lcd_wcom(0x0c);lcd_wdat(0x10);break;
}
}
void order_shift(uchar sel)//預約調整
{
uchar quit=0;
char a;
do
{
lcd_wcom(0x89);
lcd_wdat(o_hour/10+0x30);
lcd_wdat(o_hour%10+0x30);
lcd_wstr("時");
lcd_wdat(o_min/10+0x30);
lcd_wdat(o_min%10+0x30);
lcd_wstr("分");
lcd_wdat(o_sec/10+0x30);
lcd_wdat(o_sec%10+0x30);
lcd_wstr("秒");
order_mark(sel);
lcd_wcom(0x0f);
while(key_up==0)key_get();
while(key_up==1)key_get();
switch(key_x)
{
case 4:quit=1;break;
case 3:quit=1;break;
case 2:a=1;break;
case 1:a=-1;
}
if(key_x==2 || key_x==1)
{
switch(sel)
{
case 1:o_hour=o_hour+a;
if(o_hour==24)o_hour=0;
if(o_hour==-1)o_hour=23;
break;
case 2:o_min=o_min+a;
if(o_min==60)o_min=0;
if(o_min==-1)o_min=59;
break;
case 3:o_sec=o_sec+a;
if(o_sec==60)o_sec=0;
if(o_sec==-1)o_sec=59;
}
}
}
while(quit!=1);
key_x=0;
}
void order()//預約界面
{
static uchar sel=1;
uchar quit=0;
do
{
lcd_clr();
lcd_wcom(0x82);lcd_wstr(" [預約]");
lcd_wcom(0x92);lcd_wstr("倒計時:");
lcd_wcom(0x89);
lcd_wdat(o_hour/10+0x30);
lcd_wdat(o_hour%10+0x30);
lcd_wstr("時");
lcd_wdat(o_min/10+0x30);
lcd_wdat(o_min%10+0x30);
lcd_wstr("分");
lcd_wdat(o_sec/10+0x30);
lcd_wdat(o_sec%10+0x30);
lcd_wstr("秒");
lcd_wcom(0x9b);lcd_wstr("開始");
order_mark(sel);
while(key_up==0)key_get();
while(key_up==1)key_get();
switch(key_x)
{
case 4:switch(sel)
{
case 1:
case 2:
case 3:order_shift(sel);break;
case 4:break;
}
break;
case 3:quit=1;break;
case 2:sel--;if(sel<1)sel=4;break;
case 1:sel++;if(sel>4)sel=1;
}
}
while(quit!=1);
lcd_wcom(0x0c);
key_x=0;
}
//調整火力和時間
void shift_mark(uchar sel)//調整光標
{
switch(sel)
{
case 1:lcd_wcom(0x92);lcd_wcom(0x0c);lcd_wdat(0x10);break;
case 2:lcd_wcom(0x8b);lcd_wcom(0x0e);break;
case 3:lcd_wcom(0x8d);lcd_wcom(0x0e);break;
case 4:lcd_wcom(0x98);lcd_wcom(0x0c);lcd_wdat(0x10);break;
case 5:lcd_wcom(0x9c);lcd_wcom(0x0c);lcd_wdat(0x10);
}
}
void dis_fire_time()//顯示火力和時間
{
uchar f;
lcd_wcom(0x90);lcd_wstr("火力 ");
f=fire;while(f--)lcd_wdat(0x04);f=8-fire;while(f--)lcd_wdat(0x20);
lcd_wcom(0x88);lcd_wstr("時間 ");
lcd_wdat(min/10+0x30);
lcd_wdat(min%10+0x30);
lcd_wstr(":");
lcd_wdat(sec/10+0x30);
lcd_wdat(sec%10+0x30);
}
void shift_fire_time(uchar custom_sel)//進行調整
{
uchar quit=0;
char a;
do
{
dis_fire_time();
shift_mark(custom_sel);
lcd_wcom(0x0f);
while(key_up==0)key_get();
while(key_up==1)key_get();
switch(key_x)
{
case 4:quit=1;break;
case 3:quit=1;break;
case 2:a=1;break;
case 1:a=-1;
}
if(key_x==2 || key_x==1)
{
switch(custom_sel)
{
case 1:fire=fire+a;
if(fire==0)fire=1;
if(fire==9)fire=8;
break;
case 2:min=min+a;
if(min==60)min=0;
if(min==-1)min=59;
break;
case 3:sec=sec+a;
if(sec==60)sec=0;
if(sec==-1)sec=59;
}
}
}
while(quit!=1);
key_x=0;
}
void custom_heat()//自定義
{
uchar quit=0;
static uchar sel=1;
static uchar custom_fire=1,custom_min=00,custom_sec=00;
fire=custom_fire;min=custom_min;sec=custom_sec;
do
{
lcd_clr();
lcd_wcom(0x82);lcd_wstr(" [自定義]");
dis_fire_time();
lcd_wcom(0x99);lcd_wstr("預約");
lcd_wcom(0x9d);lcd_wstr("開始");
shift_mark(sel);
while(key_up==0)key_get();
while(key_up==1)key_get();
switch(key_x)
{
case 4:switch(sel)
{
case 1:
case 2:
case 3:shift_fire_time(sel);
custom_fire=fire;custom_min=min;custom_sec=sec;
break;
case 4:order();break;
case 5:break;
}
break;
case 3:quit=1;break;
case 2:sel--;if(sel<1)sel=5;break;
case 1:sel++;if(sel>5)sel=1;
}
}
while(quit!=1);
lcd_wcom(0x0c);
key_x=0;
}
void fast_heat(uchar menu_sel)//快速加熱
{
uchar quit=0;
static uchar sel=5;
do
{
lcd_clr();
switch(menu_sel)
{
case 1:lcd_wcom(0x82);lcd_wstr(" [燒烤]");fire=6;min=10;sec=0;break;
case 2:lcd_wcom(0x82);lcd_wstr(" [湯類]");fire=7;min=1;sec=30;
}
dis_fire_time();
lcd_wcom(0x99);lcd_wstr("預約");
lcd_wcom(0x9d);lcd_wstr("開始");
shift_mark(sel);
while(key_up==0)key_get();
while(key_up==1)key_get();
switch(key_x)
{
case 4:switch(sel)
{
case 4:order();break;
case 5:break;
}
break;
case 3:quit=1;break;
case 2:sel--;if(sel<4)sel=5;break;
case 1:sel++;if(sel>5)sel=4;
}
}
while(quit!=1);
key_x=0;
}
//菜單
void menu_mark(uchar sel)//菜單光標
{
switch(sel)
{
case 1:lcd_wcom(0x90);break;
case 2:lcd_wcom(0x88);break;
case 3:lcd_wcom(0x98);break;
}
lcd_wdat(0x10);
}
void menu()//進入菜單
{
static uchar sel=1;
do
{
lcd_clr();
lcd_wcom(0x82);lcd_wstr(" [菜單]");
lcd_wcom(0x91);lcd_wstr("燒烤");lcd_wcom(0x95);lcd_wstr("解凍");
lcd_wcom(0x89);lcd_wstr("湯類");lcd_wcom(0x8d);lcd_wstr("蒸菜");
lcd_wcom(0x99);lcd_wstr("自定義");
menu_mark(sel);
while(key_up==0)key_get();
while(key_up==1)key_get();
switch(key_x)
{
case 4:switch(sel)
{
case 1:
case 2:fast_heat(sel);break;
case 3:custom_heat();
}
break;
case 3:dis_author();break;
case 2:sel--;if(sel<1)sel=3;break;
case 1:sel++;if(sel>3)sel=1;
}
}
while(1);
}
/*****************************************************************************/
//主程序
void main()
{
P0=0xFF;//開發板初始化(關數碼管)
DUAN_LE=1;
DUAN_LE=0;
P0=0x00;
WEI_LE=1;
WEI_LE=0;
PSB=1;
delay500us(1000);//芯片初始化
lcd_init();
lcd_wcom(0x91);lcd_wdat(0x02);lcd_wstr(" 歡迎使用 ");lcd_wdat(0x02);//開機畫面
lcd_wcom(0x89);lcd_wstr("智能 微波爐");
delay500us(2000);
menu();//顯示菜單
}
總結
以上是生活随笔為你收集整理的微波炉定时c语言程序,微波炉控制系统c语言编程.doc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言手机通讯录退出程序,通讯录小程序(
- 下一篇: c语言题目及答案1037,PAT Bas