|
# include "bsp.h"
# define S 5.0f
uint8_t JumpTime = 0; /* 外部中斷0邊沿跳變次數(shù)統(tǒng)計(jì) */
uint8_t MeasureOK = 0; /* 測量完成標(biāo)志 */
uint32_t Time = 0; /* 用于計(jì)算兩次邊沿跳變的時(shí)間 */
uint8_t str[20] = {0}; /* LCD顯示緩存區(qū) */
sbit key = P3^2; /* 外部中斷引腳 */
int main(void)
{
bsp_Config(); /* 板級外設(shè)初始化 */
EX0 = 1; /* 開啟外部中斷0 */
bsp_lcd_ShowString(1, 0, "Speed Measuring");
while(1)
{
}
}
void EX0_IRQ(void) interrupt 0
{
float speed = 0.0f;
JumpTime++; /* 統(tǒng)計(jì)中斷次數(shù) */
while(key == 0); /* 等待按鍵被釋放 */
if(JumpTime >= 2 && MeasureOK == 0) /* 按鍵已經(jīng)按了兩次,計(jì)算速度 */
{
JumpTime = 0; /* 清除跳變量 */
MeasureOK = 1; /* 已經(jīng)完成測量了 */
speed = (float)((S /Time) * 1000.0);
Time = 0;
sprintf(str,"%f m/s", speed);
bsp_lcd_ShowString(0, 1, str);
}
}
#include "bsp.h"
void bsp_Config(void)
{
bsp_lcd_Config();
bsp_tim_Config();
}
void bsp_DelayMs(uint8_t ui_nMs)
{
uint8_t a = 0, b = 0;
for(; ui_nMs > 0; ui_nMs --)
{
for(a = 199; a > 0; a --)
{
for(b = 1; b > 0; b --);
}
}
}
# include "bsp.h"
# include "app.h"
# define TIMS (65536 - FOSC/1000)
void bsp_tim_Config(void)
{
TMOD = 0x01;
TL0 = TIMS;
TH0 = TIMS >> 8;
TR0 = 1;
ET0 = 1;
EA = 1;
}
static count = 0;
extern uint8_t JumpTime;
extern uint32_t Time;
void timer0_IRQ(void) interrupt 1 using 1
{
TL0 = TIMS; /* 需要重裝初值 */
TH0 = TIMS >> 8;
if(JumpTime == 1) /* 只有在第一次按下后才開始計(jì)數(shù),直到第二次按下 */
{
Time ++;
}
}
static void bsp_lcd_WriteCmd(uint8_t cmd)
{
LCD_EN = 0; /* 使能LCD1602 */
LCD_RD = 0; /* 選擇發(fā)送命令 */
LCD_RW = 0; /* 選擇寫入 */
LCD_DATA = cmd; /* 寫入命令 */
bsp_DelayMs(5); /* 等待數(shù)據(jù)穩(wěn)定延時(shí)5ms */
LCD_EN = 1; /* 寫入時(shí)序 */
bsp_DelayMs(10);
LCD_EN = 0;
}
static void bsp_lcd_WriteData(uint8_t dat)
{
LCD_EN = 0;
LCD_RD = 1;
LCD_RW = 0;
LCD_DATA = dat; //將數(shù)據(jù)放到LCD里
bsp_DelayMs(1);
LCD_EN = 1;
bsp_DelayMs(5);
LCD_EN = 0;
}
void bsp_lcd_Config(void)
{
bsp_lcd_WriteCmd(0x38); /* 開顯示 */
bsp_lcd_WriteCmd(0x0c); /* 不顯示光標(biāo) */
bsp_lcd_WriteCmd(0x06); /* 寫一個(gè)指針加1 */
bsp_lcd_WriteCmd(0x01); /* 清屏 */
bsp_lcd_WriteCmd(0x80); /* 指針復(fù)位 */
}
static void bsp_lcd_SetPos(uint8_t x, uint8_t y)
{
/* 坐標(biāo)超出范圍了 */
if(x > 15) return ;
if(y > 1) return ;
if(y == 0) bsp_lcd_WriteCmd(x + 0x80);
else if(y == 1) bsp_lcd_WriteCmd(x + 0xc0);
}
void bsp_lcd_ShowNum(uint8_t x, uint8_t y, uint32_t num, uint8_t xbit)
{
uint8_t temp = 0;
while(xbit)
{
temp = num % 10; /* 取得要顯示的個(gè)位 */
/* 從最后一位開始顯示 */
bsp_lcd_SetPos(x + xbit - 1, y);
bsp_lcd_WriteData(temp + 0x30);
num/=10; /* 已經(jīng)顯示完個(gè)位了,把個(gè)位扔掉 */
xbit --; /* 由于是從后往前開始顯示,所以x坐標(biāo)軸要減小 */
}
}
void bsp_lcd_ShowChar(uint8_t x, uint8_t y, uint8_t c)
{
bsp_lcd_SetPos(x, y);
bsp_lcd_WriteData(c);
}
void bsp_lcd_ShowString(uint8_t x, uint8_t y, uint8_t *string)
{
uint8_t i = 0;
while(*(string + i)) /* 在字符串沒有結(jié)束就一直顯示 */
{
bsp_lcd_ShowChar(x + i, y, *(string + i));
i++;
}
}
|
|