📄 washing.c
字号:
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define unint unsigned int
#define w_c_add XBYTE[0x2070] //LCD写命令地址
#define w_d_add XBYTE[0x2071] //LCD写数据地址
#define r_s_add XBYTE[0x2072] //LCD读状态字地址
#define r_d_add XBYTE[0x2073] //LCD读数据地址
#define A8279COM XBYTE[0X2021] //8279状态命令口地址
#define A8279IND XBYTE[0x2020] //8279数据口地址
#define A0809 XBYTE[0x2037] //0809通道0的地址
uchar idata plus[9]={0x02,0x06,0x04,0x0C,0x08,0x09,0x01,0x03,0x00};/*正转控制时序表*/
uchar idata minus[9]={0x03,0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x00};/*反转控制时序表*/
uchar idata w_number[10]={"0123456789"}; /*数库*/
uchar xdata w_begin[] ={" 自动洗衣机 "};
uchar xdata w_beselect[]={" 开始使用请0 "};
uchar xdata w_wel1[] ={" ★欢迎使用★ "};
uchar xdata w_wel2[] ={" 制造 小仙 "};
uchar xdata w_limit[] ={" 选择水位级别00"};
uchar xdata w_style[] ={" 选择工作方式00"};
uchar xdata w_time[] ={" 选择漂洗次数00"};
uchar xdata w_fun1[] ={"设定 0:- 1: + "};
uchar xdata w_fun2[] ={"确认:2 返回:3 "};
uchar xdata w_fun3[] ={"自动0;轻洗1;弱2 "};
uchar xdata w_endset[] ={" 功能选择完毕! "};
uchar xdata w_left[] ={"剩余00秒钟 "};
uchar xdata w_wtin[] ={"水位控制: 上水"};
uchar xdata w_wtout[] ={"水位控制: 脱水"};
uchar xdata w_wtover[] ={" 上水完毕 "};
uchar xdata w_xidi[] ={"当前状态:洗涤 "};
uchar xdata w_qx[] ={"当前状态:强洗 "};
uchar xdata w_qix[] ={"当前状态:轻洗 "};
uchar xdata w_rx[] ={"当前状态:弱洗 "};
uchar xdata w_jp[] ={"当前状态:浸泡 "};
uchar xdata w_xd[] ={"当前状态:洗涤 "};
uchar xdata w_px[] ={"当前状态:漂洗 "};
uchar xdata w_shg[] ={"当前状态:甩干 "};
uchar xdata w_workend[]={" 谢谢使用! "};
uchar xdata w_workpause[]={" 暂停使用 "};
uchar xdata w_workclr[]={" 继续使用! "}; /*字库*/
uchar bdata status; /* 可位寻址片内数据存储器,允许位与字节混合访问 */
sbit busy=status^7; /*“忙”线的第7位*/
uchar idata *run,*runplus,*runminus; /*定义指针变量,控制电机位置,存储位置*/
sbit wtcon=P3^0; /*控制指示灯,表示控制进水开关*/
sbit alarm=P3^1; /*水位蜂鸣报警*/
uchar idata limit; /*存储水位限制值*/
uchar idata vol; /*用于存储ADC0809采样值*/
uchar idata add; /*用于LCD的显示*/
uchar idata style; /*用于选择方式控制*/
uchar idata time; /*控制漂洗次数*/
uchar idata scale; /*水位级别*/
uchar idata step=0,flag=0; /*设置标志位*/
uchar idata start=0; /*洗衣开始控制位*/
uchar idata pause=0; /*结束标志位*/
/************************************************************************************************
* 函数原形:void delay(void) ;
* 功 能:延时。
*************************************************************************************************/
void delay(void) /*延时子程序*/
{
uchar j;
for(j=0;j<20;j++){;}
}
/************************************************************************************************
* 函数原形:void delay1ms(unint x);
* 功 能:延时函数延时1ms。
*************************************************************************************************/
void delay1ms(unint x) /*延时1ms子程序 6MHz晶振*/
{
unsigned char i;
while(x>0)
{
x--;
for(i=0;i<60;i++){i=i;}
}
}
/************************************************************************************************
* 函数原形:void lcd_busy(void);
* 功 能:检测LCD状态是否处于忙状态。
*************************************************************************************************/
void lcd_busy(void) /*LCD忙状态检测函数 */
{
do
{
status=r_s_add; /* 读状态字地址的第7位 */
}
while(busy);
}
/************************************************************************************************
* 函数原形:void lcd_init();
* 功 能:对LCD进行初始化。
*************************************************************************************************/
void lcd_init() /*LCD初始化*/
{
lcd_busy();
w_c_add=0x30; /* 功能设置:8位数据 */
lcd_busy();
w_c_add=0x0C; /* 显示状态:整体显示,游标位置无效*/
lcd_busy();
w_c_add=0x01; /* 清除显示:将DDRAM填满“20H”,并且设定DDRAM的地址计数器到“00”*/
lcd_busy();
w_c_add=0x02; /* 地址归位:设定DDRAM的地址计数器到“00”,将游标移到开头原点位置 */
}
/************************************************************************************************
* 函数原形:void lcd_clr();
* 功 能:对LCD进行清屏处理。
*************************************************************************************************/
void lcd_clr() /*LCD清除程序*/
{
lcd_busy();
w_c_add=0x01;
}
/************************************************************************************************
* 函数原形:display_lcd(uchar www[16],uchar row);
* 功 能:设置LCD的显示。
*************************************************************************************************/
void display_lcd(uchar www[16],uchar row)/*主要的显示函数*/
{
uchar i;
add=row; /* 设置显示坐标 */
lcd_busy();
w_c_add=add; /* 送数据 */
for(i=2;i<16;i++)
{
lcd_busy();
w_d_add=www[i]; /* 写数据*/
}
}
/************************************************************************************************
* 函数原形:void work_end(void);
* 功 能:设置LCD结束画面的显示。
*************************************************************************************************/
void work_end(void) /*结束画面*/
{
display_lcd(w_workend,0x90);
delay1ms(100);
}
/************************************************************************************************
* 函数原形:void work_pause(void);
* 功 能:设置LCD暂停画面的显示。
*************************************************************************************************/
void work_pause(void) /*暂停画面*/
{
display_lcd(w_workpause,0x90);
delay1ms(100);
}
/************************************************************************************************
* 函数原形:key_end(void) interrupt 2 using 1 ;
* 功 能:停止处理中断服务程序。
*************************************************************************************************/
void key_end(void) interrupt 2 using 1 /*停止返回处理*/
{
pause=1;
/*置标志位*/
}
/************************************************************************************************
* 函数原形:key_end(void) interrupt 0 using 0 ;
* 功 能:停止处理中断服务程序。
*************************************************************************************************/
void key_dis(void)interrupt 0 using 0 /*中断内按键处理*/
{
uchar key;
key=A8279IND;
key=key&0X0f;
if(key==10) { do{work_pause();}while(!pause);pause=0;}
else
{
switch(step)
{
case 0: /*开机使用选择*/
{
switch(key)
{
case 0:start=1;
case 1:break;
case 2:break;
case 3:break;
default:break;
}
break;
}
case 1: /*上水等级控制*/
{
switch(key)
{
case 0:{if(scale==0)scale=2;else scale--;break;}
case 1:{if(scale==2)scale=0;else scale++;break;}
case 2:step=2;break;
case 3:step=0;start=0;break;
default:break;
}
break;
}
case 2: /*洗涤工作方式控制*/
{
switch(key)
{
case 0:{if(style==0)style=2;else style--;flag=style;break;}
case 1:{if(style==2)style=0;else style++;flag=style;break;}
case 2:step=3;break;
case 3:step=1;break;
default:break;
}
break;
}
case 3: /*漂洗次数控制*/
{
switch(key)
{
case 0:{if(time==0)time=5;else time--;break;}
case 1:{if(time==5)time=0;else time++;break;}
case 2:step=4;break;
case 3:step=2;break;
default:break;
}
break;
}
case 4: /*参数设定控制*/
{
switch(key)
{
case 0:break;
case 1:break;
case 2:step=5;break;
case 3:step=3;break;
default:break;
}
break;
}
default:break;
}
}
}
/************************************************************************************************
* 函数原形:void begin(void ;
* 功 能:进入开机界面,进行洗衣选择。
*************************************************************************************************/
void begin(void)
{
lcd_clr();
display_lcd(w_begin,0x90);
display_lcd(w_beselect,0x88); /*是否使用的选择*/
if(start==1)
{
display_lcd(w_wel1,0x90); /*欢迎*/
display_lcd(w_wel2,0x88);
step=1;
delay1ms(2000);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -