QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2913|回复: 0

Learn lumit Step 11 : 7段数码管实验

[复制链接]
发表于 2005-6-11 14:27:10 | 显示全部楼层 |阅读模式
Learn lumit Step 11 :  7段数码管实验
++++++++++++++++++++++++++++++++++++++++++++++++++++++

    这一小节我们着重讲解7段数码管的驱动原理和方法。在 seg7_driver.c 文件中
我们仍然将实现和 led 驱动中类似的五个接口函数:
     
int seg7_open( void )
函数入口参数:无
    返回值:  正常返回值 0
执行流程:
    无

int seg7_read( char * buf, int count )
函数入口参数:buf   : 读缓冲的首地址
              count : 需要读的字节数
    返回值:  直接返回 count
执行流程:
    7段数码管主要用于输出,其读操作暂时不实现,意义不大。

int seg7_write( char * buf, int count )
函数入口参数:buf   : 写缓冲的首地址
              count : 需要写的字节数
    返回值:  正常返回值 count 表示已经写入的字节数, 出错则返回 -1
执行流程:
1) 根据要写入的字节数 count,每个字节代表seg7中的一个 segment led 的状态,依次设置。

int seg7_ioctl( unsigned int cmd, unsigned long arg )
函数入口参数:cmd   : ioctl 的入口命令名
              arg   : 命令所带参数
    返回值:  正常返回值 0
执行流程:
暂时实现为空操作
   
int seg7_release( void )
函数入口参数:无              
    返回值:  正常返回值 0
执行流程:
暂时实现为空操作


    这里和 led 驱动有所不同的是,led 驱动主要是依靠驱动 gpio 来实现 led 的点亮和熄灭。
而 7段数码管是将其 8 个段和数据总线的低 8 位连接在一起,依靠 cpu 对特定地址的读写,
片选上7段数码管这个设备后,实现对其的点亮和熄灭。

    由于 lumit4510 中是采用了 nECS3 和 nWE 的“与操作”作为 7段数码管的 SEG7_CS
片选信号,因此,要实现对 SEG7_CS 的片选,需要对 0x03fdc000 - 0x03fe0000 这段地址空间
进行“写”操作。(注意,这里的地址必须是 4 字节对齐的,否则无效!)

    有关每个 segment 段和其对应的位置关系,如下图所示:

/*
         ________
        |   a    |
        |        |
        |b       |g
        |________|
        |   c    |
        |d       |f
        |        |
        |________| o dp
            e
*/

     由此,我们可以根据需要拼凑出每一个 hex 数字 (从 0x0 - 0xF)的表示组合。
后面的 4 行,是我们根据需要实现的几个特殊显示需求,例如 3 个横杠,2 个竖杠等。
大家还可以定义出自己需要的其他符号。

#define        DISP_0                (SEG_F|SEG_G|SEG_A|SEG_B|SEG_D|SEG_E)
#define        DISP_1                (SEG_F|SEG_G)
#define        DISP_2                (SEG_A|SEG_C|SEG_D|SEG_E|SEG_G)
#define        DISP_3                (SEG_A|SEG_C|SEG_E|SEG_F|SEG_G)
#define        DISP_4                (SEG_B|SEG_C|SEG_F|SEG_G)
#define        DISP_5                (SEG_A|SEG_B|SEG_C|SEG_E|SEG_F)
#define        DISP_6                (SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F)
#define        DISP_7                (SEG_A|SEG_F|SEG_G)
#define        DISP_8                (SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G)
#define        DISP_9                (SEG_A|SEG_B|SEG_C|SEG_E|SEG_F|SEG_G)

#define        DISP_A                (SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G)
#define        DISP_B                (SEG_B|SEG_C|SEG_D|SEG_E|SEG_F)
#define        DISP_C                (SEG_A|SEG_B|SEG_D|SEG_E)
#define        DISP_D                (SEG_C|SEG_D|SEG_E|SEG_F|SEG_G)
#define        DISP_E                (SEG_A|SEG_B|SEG_C|SEG_D|SEG_E)
#define        DISP_F                (SEG_A|SEG_B|SEG_C|SEG_D)

#define        DISP_ALL_OFF        (0)
#define        DISP_ALL_ON        (SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G|SEG_DP)

#define DISP_ROW_3        (SEG_A|SEG_C|SEG_E)
#define DISP_COL_2        (SEG_B|SEG_D|SEG_G|SEG_F)


    另外,一个需要特别提示的地方是 Makefile 文件有了一些改动,主要是依赖关系里面需要
补充上 .h 文件的修改,对于其他包含它的文件所产生的影响,有时需要重新编译一些 .c 文件。
这里所作的修改主要是添加了以下几条新的规则。

$(OUTPUT_DIR)\main.o:                 seg7_api.h

$(OUTPUT_DIR)\seg7_api.o:         seg7_api.h
seg7_api.h:                         seg7_driver.h

$(OUTPUT_DIR)\seg7_driver.o:         seg7_driver.h

    因为 Makefile 的规则解析是可以递归的,所以我们不用特别告诉 make 说 main.o 也依赖于
seg7_driver.h ,这个关系 make 可以通过 seg7_api.h 依赖于 seg7_driver.h 同样能够得到。
这样在我们修改头文件定义的时候,依赖于它的那些源文件也会重新被编译。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-9-29 08:13 , Processed in 0.045633 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表