/*实现功能:利用maichong()函数来模拟人的脚步,通过定时器中断
来对人的step进行计数,通过LCD1602进行step的显示。
滑动变阻器负责调节LCD1602的背光
Key0按键负责开机,当按下开机按键后会出现开机"welcome"界面,然后再显示运动界面。
Key1按键负责Step复位到0;
LED负责对步数超限进行指示
注:1、由于计算机仿真对按键的电平检测不稳定,在按按键时不应点击过快。
2、最高显示步数为99999(完全满足一个正常人的运动量)
*/
图一、原理图
/*File main.c*/
/*实现功能:利用maichong()函数来模拟人的脚步,通过定时器中断
来对人的step进行计数,通过LCD1602进行step的显示。
滑动变阻器负责调节LCD1602的背光
Key0按键负责开机,当按下开机按键后会出现开机"welcome"界面,然后再显示运动界面。
Key1按键负责Step复位到0;
LED负责对步数超限进行指示
注:1、由于计算机仿真对按键的电平检测不稳定,在按按键时不应点击过快。
2、最高显示步数为99999(完全满足一个正常人的运动量)
*/
#include <reg51.h>
#include "lcd1602.h"
void Timer0Init(void); //中断初始化函数
uint num=0; //step计数的变量;
sbit STEP=P3^4; //脉冲中断输入键
sbit Key0=P0^0; //开始键
sbit Key1=P0^1; //步数复位键
uchar xiaomi[16]="Welcome Iwatch";
uchar need[16]="Life Need Sports";
uchar d[16] = " I Love Sports";
uchar total[6] = "Total:";
uchar T[10]="0123456789";
uchar step[5] = " Step";
sbit baojing=P3^0;//中断脉冲输入端
void delay(uint i)
{
while(i--);
}
void maichong()
{
STEP=0;
delay(200);
STEP=1;
delay(200);
}
void wrc(uint c)
{
LcdWriteCom(c);
}
void wrd(uint d)
{
LcdWriteData(d);
}
void lcd_init()
{
LcdInit();
}
void kaiji_dispaly()
{
uint l,m;
wrc(0x80+0x00);
for(l=0;l<16;l++)
{
wrd(xiaomi[l]);
delay(12000);
}
wrc(0x80+0x40);
for(m=0;m<16;m++)
{
wrd(need[m]);
delay(12000);
}
}
void display()
{
uint i,j,k;
wrc(0x80+0x00);
for(i=0;i<16;i++)
{
wrd(d[i]);
}
wrc(0x80+0x40);
for(j=0;j<6;j++)
{
wrd(total[j]);
}
// wrd('T');
// wrd('o');
// wrd('t');
// wrd('a');
// wrd('l');
// wrd(':');
wrd(T[num/10000]);
wrd(T[num/1000%10]);
wrd(T[num/100%10]);
wrd(T[num/10%10]);
wrd(T[num%10]);
//wrd(0xdf); //摄氏度中的半角0
for(k=0;k<6;k++)
{
wrd(step[k]);
}
// wrd(' ');
// wrd('S');
// wrd('t');
// wrd('e');
// wrd('p');
}
void Timer0Init(void)
{
TMOD=0x06; //设置定时器模式(方式2,计数模式)
TL0 = 0xff; //设置定时初值
TH0 = 0xff; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //计数器0开始计时
EA=1;
ET0=1;
}
void Time0() interrupt 1 //计数器T0中断
{
num++;
if(num==9999)
{
num=0;
baojing=0; //驱动led发光报警
}
}
void main(void)
{
lcd_init(); //LCD1602初始化
Timer0Init(); //为了提高代码的可读性,此处运用定时器中断函数
P2=0x00;
while(1)
{
if(Key0==0) //判断按键开始
{
kaiji_dispaly();
while(1)
{
maichong(); //脉冲模拟脚步
display(); //Lcd1602显示
if(Key1==0) //判断按键复位
{
num=0;
}
}
}
}
}
/*File lcd1602.h*/
#ifndef __LCD1602_H_
#define __LCD1602_H_
#include <reg51.h>
#include <intrins.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define LCD1602_DATAPINS P2
sbit LCD1602_RS = P1^2;
sbit LCD1602_RW = P1^3;
sbit LCD1602_E = P1^4;
void Lcd1602_Delay1ms(uint c) ; //误差 0us
void LcdWriteCom(uchar com) ; //写入命令
void LcdWriteData(uchar dat) ; //写入数据
void LcdInit(); //初始化
#endif
/*File lcd1602.c*/
#include <reg51.h>
#include "lcd1602.h"
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : c
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uint a,b;
for(; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}