/* 写命令 */
void write_com( uchar com )
{
LCDRS = 0;
LCD_WriteData( com );
/* DAT=com; */
LCDdelay( 5 );
LCDEN = 1;
LCDdelay( 5 );
LCDEN = 0;
}
/* 写数据 */
void write_data( uchar date )
{
LCDRS = 1;
LCD_WriteData( date );
/* DAT=date; */
LCDdelay( 5 );
LCDEN = 1;
LCDdelay( 5 );
LCDEN = 0;
}
/*------------------------------------------------
* 选择写入位置
* ------------------------------------------------*/
void SelectPosition( unsigned char x, unsigned char y )
{
if ( x == 0 )
{
write_com( 0x80 + y ); /* 表示第一行 */
}else {
write_com( 0xC0 + y ); /* 表示第二行 */
}
}
/*------------------------------------------------
* 写入字符串函数
* ------------------------------------------------*/
void LCD_Write_String( unsigned char x, unsigned char y, unsigned char *s )
{
SelectPosition( x, y );
while ( *s )
{
write_data( *s );
s++;
}
}
/*
* ========================================================================
* 函数: void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
* 应用: LCD_Write_Char(0,1,366,4) ;
* 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366
* 参数: x:行,y:列,s:要显示的字,l:显示的位数
* 返回: none.
* 版本: VER1.0
*/
/* ======================================================================== */
void LCD_Write_Char( u8 x, u8 y, u16 s, u8 l )
{
SelectPosition( x, y );
if ( l >= 1 )
write_data( 0x30 + s % 10 ); /* 个位 */
}
/*1602指令简介
* write_com(0x38);//屏幕初始化
* write_com(0x0c);//打开显示 无光标 无光标闪烁
* write_com(0x0d);//打开显示 阴影闪烁
* write_com(0x0d);//打开显示 阴影闪烁
*/
/* 1602初始化 */
void Init1602()
{
uchar i = 0;
write_com( 0x38 ); /* 屏幕初始化 */
write_com( 0x0c ); /* 打开显示 无光标 无光标闪烁 */
write_com( 0x06 ); /* 当读或写一个字符是指针后一一位 */
write_com( 0x01 ); /* 清屏 */
}
void Display_1602( setValue, temp )
{
/* 显示预设采集值 */
LCD_Write_Char( 1, 13, setValue, 2 );
/* 时时采集值 */
LCD_Write_Char( 1, 7, temp, 1 );
}
/*
* ========================================================================
* 函数: unsigned int Adc0832(unsigned char channel)
* 应用: temp=Adc0832(0);
* 描述: 读取0通道的AD值
* 参数: channel:通道0和通道1选择
* 返回: 选取通道的AD值
* 版本: VER1.0
* ========================================================================
*/
unsigned int Adc0832( unsigned char channel )
{
uchar i = 0;
uchar j;
uint dat = 0;
uchar ndat = 0;
uchar Vot = 0;
if ( channel == 0 )
channel = 2;
if ( channel == 1 )
channel = 3;
ADDI = 1;
_nop_();
_nop_();
ADCS = 0; /* 拉低CS端 */
_nop_();
_nop_();
ADCLK = 1; /* 拉高CLK端 */
_nop_();
_nop_();
ADCLK = 0; /* 拉低CLK端,形成下降沿1 */
_nop_();
_nop_();
ADCLK = 1; /* 拉高CLK端 */
ADDI = channel & 0x1;
_nop_();
_nop_();
ADCLK = 0; /* 拉低CLK端,形成下降沿2 */
_nop_();
_nop_();
ADCLK = 1; /* 拉高CLK端 */
ADDI = (channel >> 1) & 0x1;
_nop_();
_nop_();
ADCLK = 0; /* 拉低CLK端,形成下降沿3 */
ADDI = 1; /* 控制命令结束 */
_nop_();
_nop_();
dat = 0;
for ( i = 0; i < 8; i++ )
{
dat |= ADDO; /* 收数据 */
ADCLK = 1;
_nop_();
_nop_();
ADCLK = 0; /* 形成一次时钟脉冲 */
_nop_();
_nop_();
dat <<= 1;
if ( i == 7 )
dat |= ADDO;
}
for ( i = 0; i < 8; i++ )
{
j = 0;
j = j | ADDO; /* 收数据 */
ADCLK = 1;
_nop_();
_nop_();
ADCLK = 0; /* 形成一次时钟脉冲 */
_nop_();
_nop_();
j = j << 7;
ndat = ndat | j;
if ( i < 7 )
ndat >>= 1;
}
ADCS = 1; /* 拉低CS端 */
ADCLK = 0; /* 拉低CLK端 */
ADDO = 1; /* 拉高数据端,回到初始状态 */
dat <<= 8;
dat |= ndat;
return(dat); /* return ad data */
}
/*
* ========================================================================
* 函数: u8 Key_Scan()
* 应用: temp=u8 Key_Scan();
* 描述: 按键扫描并返回按下的键值
* 参数: NONE
* 返回: 按下的键值
* 版本: VER1.0
* 备注: 该函数带松手检测,按下键返回一次键值后返回0,直至第二次按键按下
* ========================================================================
*/
u8 Key_Scan()
{
static u8 key_up = 1; /*按键按松开标志 */
if ( key_up && (Key1 == 0 || Key2 == 0 || Key3 == 0) )
{
delay_ms( 10 ); /* 去抖动 */
key_up = 0;
if ( Key1 == 0 )
return(1);
else if ( Key2 == 0 )
return(2);
else if ( Key3 == 0 )
return(3);
}else if ( Key1 == 1 && Key2 == 1 && Key3 == 1 )
key_up = 1;
return(0); /* 无按键按下 */
}
void main( void )
{
u8 key;
Buzzer = 0;
Led = 0;
Init1602(); /* 调用初始化显示函数 */
LCD_Write_String( 0, 0, ">Water Quality<" ); /* 开机界面 */
LCD_Write_String( 1, 0, "NOW EQ:0 UP:0" );
delay_ms( 1000 );
while ( 1 ) /* 主循环 */
{
key = Key_Scan(); /*按键扫描 */
value = Adc0832( 0 ); /* 读取采集值值 */
if ( value < 36 )
{
value = 0;
}else if ( (value > 36 || value == 36) && value < 72 )
{
value = 1;
}else if ( (value > 72 || value == 72) && value < 108 )
{
value = 2;
}else if ( (value > 108 || value == 108) && value < 140 )
{
value = 3;
}else if ( (value > 140 || value == 140) && value < 172 )
{
value = 4;
}else if ( (value > 172 || value == 172) && value < 208 )
{
value = 5;
}else if ( value > 208 || value == 208 )
{
value = 6;
}
if ( key == KEY_SET )
{
Mode++;
}
switch ( Mode ) /* 判断模式的值 */
{
case 0: /* 监控模式 */
{
Display_1602( setValue, value ); /* 显示预设采集值,预设采集值,采集值值,采集值值 */
if ( value >= setValue ) /* 采集值值大于等于预设值时 */
{
Led = 1; /* 采集值指示灯亮 */
Fan = 0;
Buzzer = 1; /* 蜂鸣器报警 */
}else { /* 采集值值小于预设值时 */
Buzzer = 0;
Led = 0; /* 关掉报警灯 */
Fan = 1;
}
break;
}
case 1: /* 预设采集值模式 */
{
SelectPosition( 1, 13 ); /* 指定位置 */
write_com( 0x0f ); /* 打开显示 无光标 光标闪烁 */
if ( key == KEY_ADD ) /* 加键按下 */
{
setValue++; /* 预设采集值值(阀值)加1,最大为255 */
if ( setValue >= 6 ) /* 当阀值加到大于等于255时 */
setValue = 6; /* 阀值固定为254 */
LCD_Write_Char( 1, 13, setValue, 2 );
}
if ( key == KEY_MINUS ) /* 减键按下 */
{
if ( setValue <= 1 ) /* 当采集值上限值减小到1时 */
setValue = 1; /* 固定为1 */
setValue--; /* 预设采集值值减一,最小为0 */
LCD_Write_Char( 1, 13, setValue, 2 );
}
break;
}
default:
{
write_com( 0x38 ); /* 屏幕初始化 */
write_com( 0x0c ); /* 打开显示 无光标 无光标闪烁 */
Mode = 0; /* 恢复正常模式 */
break;
}
}
}
}
资料下载地址