|
要完成以下功能,要求实时性很高,数据刷新速度越高越好,大家都用什么办法?
18B20每秒刷新
4位数码管每mS刷新
LCD1602液晶两个每500mS刷新(一个是6根线驱动,1格式3根线驱动)
按键检测(支持单击双击长按)检测间隔500uS
(原文件名:截图00.jpg)
【PROTEUS仿真】
数码管显示的是18B20的温度
点击此处下载 ourdev_645759TU1MLH.rar(文件大小:23K) (原文件名:desktop.rar)
【参考资料,绝对好】
点击此处下载 ourdev_645762BPUAAF.pdf(文件大小:4.79M) (原文件名:从单片机初学者迈向单片机工程师.pdf)
目录:
一、LED 主题讨论周第一章----写在前面......................................................... 1
二、LED 主题讨论周第二章----学会释放CPU................................................. 2
三、LED 主题讨论周第三章----模块化编程初识..............................................8
四、LED 主题讨论周第四章----渐明渐暗的灯................................................25
五、LED 主题讨论周第五章----多任务环境下的数码管编程设计................. 28
六、KEY 主题讨论第一章——按键程序编写的基础..................................... 37
七、KEY 主题讨论第二章——基于状态转移的独立按键程序设计.............. 40
八、综合应用之一——如何设计复杂的多任务程序...................................... 47
九、综合应用之二——DS1320/DS18B20 应用...............................................60
【下面是主函数】
#include "includes.h"
//【文件需要都添加到工程才行】
void main(void)
{
signed temp = 0;
unsigned char i = 0;
unsigned char display_data[4]= {0,0,0,0};
static char string1[16] = "1234567890123456";//"FLYER HACKER";
static char string2[16] = "6543210987654321";//"I'm F.H.";
timer1_init();
ds18b20_init();
lcd1602_init();
lcd1602_cgram_init();
lcd1602_3p_init();
lcd1602_3p_cgram_init();
//看看字符效果
//string2[10] = 1;
//string2[11] = 2;
//string2[12] = 3;
//string2[13] = 4;
while(1) //【注意关闭中断时,需要关断时间小于中断周期】
{
temp = ds18b20_read(0); //每900mS自动刷新一次
//温度负数还没处理
display_data[3] = temp % 10;
display_data[2] = temp / 10;
//此处只是定义个最小扫描周期,具体由主循环周期决定
led7seg_display(display_data , 1*DT_MS , 1); //1mS刷新1次
P2_3 = ~P2_3 ; //可以通过示波器观察主循环周期
//实际测量500uS
button_extend(get_button); //拓展单键检测,可返回单击,双击,长按代码
//单键抗干扰采用计数1++ 或0-- 方式,未用延时
//按键响应速度由主循环周期决定,此处为500uS
if(delay_dt2(500*DT_MS , 2)) //500mS刷新数据
{
string1[15] = i&0x0f;
string2[15] = i&0x0f;
i++;
}
//【方针时 还存在时间久了, 乱码问题 或 闪烁问题】
lcd1602_display(string1 , string2 , 3); //lcd1602 每500mS自动刷新一次,四位数据
lcd1602_3p_display(string2 , string1 , 4); //3根线驱动的LCD1602
}
} |
|