打印

【现场直播】一个数字温控仪表的实现(能显示了)

[复制链接]
楼主: 原野之狼
手机看帖
扫描二维码
随时随地手机跟帖
41
韩秋婷| | 2009-12-18 16:49 | 只看该作者 回帖奖励 |倒序浏览
硬件设计不合理
实现楼主的功能几毛钱就能搞定了

使用特权

评论回复
42
原野之狼|  楼主 | 2009-12-18 17:07 | 只看该作者
7.3.2 数码管以及LED驱动
      采用动态扫描,要注意扫描的频率,为了达到比较好的观感,间隔不少于20ms。我的板子上主窗口和副窗口用的数码管是不一样的,并且74HC595位扫描信号不够,故另外使用了3个IO信号来扫描位,这给编程带来一定的麻烦。

代码片段一:

/************************************************************
FileName: ui.h

Author: 原野之狼

Version :V1.0

Date: 2009.12.18

Description:

History:

<author> <time> <version > <desc>


************************************************************/
#ifndef _H_UI_H_
#define _H_UI_H_

#include "type.h"

#ifdef __cplusplus
extern "C" {
#endif

//define the other three bit driver signals,because hc595 has only 8 bit driver signals
//this three signals are drivered by mcu directly
#define B9_HIGH PORTE|=(0x01<<7)
#define B9_LOW PORTE&=(~(0x01<<7))
#define B10_HIGH PORTE|=(0x01<<6)
#define B10_LOW PORTE&=(~(0x01<<6))
#define B11_HIGH PORTB|=0x01
#define B11_LOW PORTB&=(~0x01)

//define some macros of operating leds
//the led ON or OFF state is mapped in the array DisplayBuf[10]
#define LED1ON do{cli();display_buf[10]|=0X20;sei();}while(0)
#define LED1OFF do{cli();display_buf[10]&=(~0X20);sei();}while(0)
#define LED2ON do{cli();display_buf[10]|=0X01;sei();}while(0)
#define LED2OFF do{cli();display_buf[10]&=(~0X01);sei();}while(0)
#define LED3ON do{cli();display_buf[10]|=0X40;sei();}while(0)
#define LED3OFF do{cli();display_buf[10]&=(~0X40);sei();}while(0)
#define LED4ON do{cli();display_buf[10]|=0X80;sei();}while(0)
#define LED4OFF do{cli();display_buf[10]&=(~0X80);sei();}while(0)

void display_init(void);
void led_scan_run(void);
void display_main(char *p);
void display_vice(char *p);
void display_main_const(const char *p);
void display_vice_const(const char *p);
void timer2_init(void);
void timer2_start(void);
void timer2_close(void);

#ifdef __cplusplus
}
#endif

#endif


使用特权

评论回复
43
原野之狼|  楼主 | 2009-12-18 17:11 | 只看该作者
代码片段二:
 
/************************************************************
FileName: ui.c
Author: 原野之狼
Version :V1.0      
Date: 2009.12.18
Description:
  
History:
      <author>      <time>      <version >      <desc>

************************************************************/
#include "includes.h"
//define the 8 segments of the number led in the window.
//you can modify these datas by considerating the architecture of the numer led
//and the hardware connections.
//here the architecture of led in the main window is different with the led in the vice window.
//define the 8 segments of the number led in the main window.
#define SEG_A 0X40
#define SEG_B 0X80
#define SEG_C 0X04
#define SEG_D 0X10
#define SEG_E 0X08
#define SEG_F 0X01
#define SEG_G 0X20
#define SEG_DP 0X02
//define the 8 segments of the number led in the vice window.
#define SEG_A_ 0X02
#define SEG_B_ 0X04
#define SEG_C_ 0X08
#define SEG_D_ 0X80
#define SEG_E_ 0X40
#define SEG_F_ 0X10
#define SEG_G_ 0X20
#define SEG_DP_ 0X01

//define the segment code of the number in the main window
static const prog_uchar  code_num[] = {
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,            // 0
SEG_B | SEG_C,                                            // 1
SEG_A | SEG_B | SEG_D | SEG_E | SEG_G,                    // 2
SEG_A | SEG_B | SEG_C | SEG_D | SEG_G,                    // 3
SEG_B | SEG_C | SEG_F | SEG_G,                            // 4
SEG_A | SEG_F | SEG_G | SEG_C | SEG_D,                    // 5
SEG_A | SEG_F | SEG_E | SEG_D | SEG_C | SEG_G,            // 6
SEG_A | SEG_B | SEG_C,                                    // 7
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,    // 8
SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G             // 9
};
//define the segment code of the letters
static const prog_uchar code_letter[]={
SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G,            // a
SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,                    // b
SEG_A | SEG_D | SEG_E | SEG_F,                            // c
SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,                    // d
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G,                    // e
SEG_A | SEG_E | SEG_F | SEG_G,                            // f
SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G,            // g
SEG_B | SEG_C | SEG_E | SEG_F | SEG_G,                    // h
SEG_E | SEG_F,                                            // i
SEG_B | SEG_C | SEG_D | SEG_E,                            // j
SEG_B | SEG_D | SEG_E | SEG_F | SEG_G,                    // k
SEG_D | SEG_E | SEG_F,                                    // l
SEG_A | SEG_C | SEG_E | SEG_G,                            // m
SEG_C | SEG_E | SEG_G,                                    // n
SEG_C | SEG_D | SEG_E | SEG_G,                            // o
SEG_A | SEG_B | SEG_E | SEG_F | SEG_G,                    // p
SEG_A | SEG_B | SEG_C | SEG_F | SEG_G,                    // q
SEG_E | SEG_G,                                            // r
SEG_A | SEG_F | SEG_G | SEG_C | SEG_D,                    // s
SEG_D | SEG_E | SEG_F | SEG_G,                            // t
SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,                    // u
SEG_C | SEG_D | SEG_E,                                    // v
SEG_B | SEG_D | SEG_F | SEG_G,                            // w
SEG_B | SEG_C | SEG_E | SEG_F,                            // x
SEG_B | SEG_C | SEG_D | SEG_F | SEG_G,                    // y
SEG_A | SEG_D | SEG_G                                     // z
};
static const prog_uchar code_null  =0x00;                   // ' '
static const prog_uchar code_bar = SEG_G;                   // '-'
static const prog_uchar code_dp = SEG_DP;                   // '.'

//display buf
//10 for number leds. 1 one for leds
UINT8 display_buf[11];
/***********************************************************
Description:
  intial the display sys
  
Modify Record:

***********************************************************/
void display_init(void)
{
UINT8 i;

DDRE |=0xc0; // set B9&B10 output
DDRB |=0x01; // set B11 output
for (i = 0; i < 11; i++)
{
  display_buf[i] = 0x00;
}
init_595();
timer2_init();
timer2_start();
}
/***********************************************************
Description:
  scan the led.
  this function should be called by a timer at least every 20ms/11.
  
Modify Record:

***********************************************************/
void led_scan_run(void)
{
/***********************************************
main window:
        ----    ----    ----    ----    ----
        |  |    |  |    |  |    |  |    |  |
        ----    ----    ----    ----    ----
        |  |    |  |    |  |    |  |    |  |
        ----    ----    ----    ----    ----
pos:   4        3       2       1       0  
bit sel:
       5        4       ...
buf map:
       buf[0]   ...
vice window:
        ----    ----    ----    ----    ----
        |  |    |  |    |  |    |  |    |  |
        ----    ----    ----    ----    ----
        |  |    |  |    |  |    |  |    |  |
        ----    ----    ----    ----    ----
pos:    9       8       7       6       5
bit sel:
        9       8       ...
bif map:
       buf[5]  ...
led:
          @       @       @      @
            led4    led3    led2   led1
pos:                   10
bit sel:
                        10
              buf[10]
***********************************************/
static UINT8 pos = 0;
switch (pos)
{
  case 0:
  {
   B9_LOW;
   B10_LOW;
   B11_LOW;
   driver_595(display_buf[4], 0x04);
  }
  break;
  case 1:
  {
   B9_LOW;
   B10_LOW;
   B11_LOW;
   driver_595(display_buf[3], 0x02);
  }
  break;
  case 2:
  {
   B9_LOW;
   B10_LOW;
   B11_LOW;
   driver_595(display_buf[2], 0x08);
  }
  break;
  case 3:
  {
   B9_LOW;
   B10_LOW;
   B11_LOW;
   driver_595(display_buf[1], 0x10);
  }
  break;
  case 4:
  {
   B9_LOW;
   B10_LOW;
   B11_LOW;
   driver_595(display_buf[0], 0x01);
  }
  break;
  case 5:
  {
   B9_LOW;
   B10_LOW;
   B11_LOW;
   driver_595(display_buf[9], 0x20);
  }
  break;
  case 6:
  {
   B9_LOW;
   B10_LOW;
   B11_LOW;
   driver_595(display_buf[8], 0x40);
  }
  break;
  case 7:
  {
   B9_LOW;
   B10_LOW;
   B11_LOW;
   driver_595(display_buf[7], 0x80);
  }
  break;
  case 8:
  {
   B10_LOW;
   B11_LOW;
   driver_595(display_buf[6], 0x00);
   B9_HIGH;
  }
  break;
  case 9:
  {
   B9_LOW;
   B11_LOW;
   driver_595(display_buf[5], 0x00);
   B10_HIGH;
  }
  break;
  case 10:
  {
   B9_LOW;
   B10_LOW;
   driver_595(display_buf[10], 0x00);
   B11_HIGH;
  }
  break;
  default:
   asm("nop");
}
pos++;
pos %= 11;
}

/***********************************************************
Description:
  display contents in the main window
Input:
  contens in char.
  for example:
   99.999
   abcde
   sys-1
   8.8.8.8.8.
  
Others:
  for safety considerations,the input para must be checked.
  but not done here.

Modify Record:

***********************************************************/
void display_main(char *p)
{
UINT8 i = 0,j = 0;
do
{
  if (*(p + i) >= '0' && *(p + i) <= '9')
  {
   cli();
   display_buf[j++] = pgm_read_byte(&code_num[*(p + i) - '0']);
   sei();
  }
  if (*(p + i) >= 'a' && *(p + i) <= 'z')
  {
   cli();
   display_buf[j++] = pgm_read_byte(&code_letter[*(p + i) - 'a']);
   sei();
  }
  if (*(p + i) == ' ')
  {
   cli();
   display_buf[j++] = pgm_read_byte(&code_null);
   sei();
  }
  if (*(p + i) == '.')
  {
   cli();
   display_buf[j -1] |= pgm_read_byte(&code_dp);
   sei();
  }
  
  if (*(p + i) == '-')
  {
   cli();
   display_buf[j++] = pgm_read_byte(&code_bar);
   sei();
  }
  i++;
} while (*(p + i));
}

使用特权

评论回复
44
原野之狼|  楼主 | 2009-12-18 17:13 | 只看该作者
噢啦,显示部分基本完成了,只贴了部分代码,完整代码打包上传:
out.rar (90.69 KB)

使用特权

评论回复
45
xlsbz| | 2009-12-18 19:05 | 只看该作者
:victory:

使用特权

评论回复
46
爱学小生| | 2009-12-18 20:12 | 只看该作者
先mark 以后看。。

使用特权

评论回复
47
天雨粟| | 2009-12-19 09:55 | 只看该作者
知道595可以驱动点阵之类,没想到尚可用之驱动LED数码管,想请教狼兄一个问题:
图中用的共阴管,9013用于位控,高电平有效
MCU可用模拟串口的办法驱动595,6个I/O口可扩得十六个输出口
据说595内部有小限流电阻,显示部分图看不清,想请教,串在笔划(字段)上的限流电阻为多大?谢谢!

使用特权

评论回复
48
原野之狼|  楼主 | 2009-12-19 11:16 | 只看该作者
回复48楼:
我是共用了595的移位时钟和锁存时钟,也就是4个IO扩展了16个输出。
限流电阻用的是330欧姆。

使用特权

评论回复
49
xwj| | 2009-12-19 11:27 | 只看该作者
呵呵,这个要顶,
这个也可以顶~


只是,你呀也太会浪费了吧?
大手大脚的可不好哦~:)

使用特权

评论回复
50
天雨粟| | 2009-12-19 13:30 | 只看该作者
谢谢楼主!

使用特权

评论回复
51
原野之狼|  楼主 | 2009-12-19 23:03 | 只看该作者
新做的板子到了 需要忙了 所以更新会比较慢
很不幸 今天新焊的板子 被我弄坏了 4块芯片全崩了

使用特权

评论回复
52
xwj| | 2009-12-19 23:09 | 只看该作者
牛叉!


咋崩的?

使用特权

评论回复
53
原野之狼|  楼主 | 2009-12-20 00:08 | 只看该作者
一念之间 把12V加到了5V上 然后芯片就工作不正常了 所以不得不把和5V有关的芯片全卸下来

使用特权

评论回复
54
aihe| | 2009-12-20 17:44 | 只看该作者
造门大**打蚊子
不过还是赞一个

使用特权

评论回复
55
huangqi412| | 2009-12-21 08:54 | 只看该作者
牛.12V...

使用特权

评论回复
56
comelon| | 2009-12-21 11:01 | 只看该作者
1# 原野之狼
LZ的代码风格不错,学习!

使用特权

评论回复
57
icecut| | 2009-12-21 13:08 | 只看该作者
代码不错.

使用特权

评论回复
58
yangjichun| | 2009-12-21 17:26 | 只看该作者
顶下,原理图发下更好,初次介入嵌入式行业,需要用AD转换+数码管显示做个模拟信号显示输出设备。

使用特权

评论回复
59
my1693| | 2009-12-22 10:50 | 只看该作者
:D不错,
加个电压采样,改成电压表+温度显示 另外在搞个模拟量输出

使用特权

评论回复
60
andy2003hu| | 2009-12-22 13:06 | 只看该作者
代码比较规范。顶一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则