4 位 7 段 LED 显示 在单片机应用系统中经常使用发光二极管来显示, 发光二极管简称 LED (Light Emitting Diode) LED 的价格便宜, 而且配置比较灵活, 与单片机的接口也比较方便 在这里将讲解如何使用中颖的单片机进行 4 位 7 段 LED 显示的方法 1. 7 段 LED 的结构原理 单片机中经常使用 7 段 LED 来显示数字, 也就是用 7 个 LED 构成字型 8, 并另外用一个圆点 LED 来显示小数点, 也就是说一共有 8 个 LED, 构成了 8. 的字型 7 段 LED 分共阴级和共阳极两种, 共阴级 7 段 LED 的原理图和管脚配置图如图 1-1 所示, 共阳级 7 段 LED 的原理图和管脚配置图如图 1-2 所示 实际中, 各个型号的 7 段 LED 的管脚配置可能不会是一样的, 在实际应用中要先测试一下各个管脚的配置, 再进行电路原理图的设计 图 1-1 共阴极 7 段 LED
图 1-2 共阳极 7 段 LED 共阳极 7 段 LED 是指发光二极管的阳极连接在一起为公共端的 7 段 LED, 而共阴极 7 段 LED 是指发光二极管的阴极连接在一起为公共端的 7 段 LED 一个 7 段 LED 由 8 个发光二极管组成, 其中 7 个发光二极管构成字型 8 的各个笔划 (a~g), 另一个发光二极管为小数点 (dp) 当在某一段发光二极管上施加一定的正向电压时, 该段 LED 即被点亮 ; 不加电压则为暗 以共阳极 7 段 LED 为例, 若是要显示 5., 则需要在 VCC 上加上电压, 向 dp g f e a 送出 00010010 的信号, 就能显示出来 为了保护各段 LED 不因电流过大而损坏, 需在各个段上外加限流电阻保护 共阳极 7 段 LED 显示 0~F 的编码表如表 1-1 所示 ( 以 dp 为最高位,a 为最低位 ) 表 1-1 显示字符 dp g f e d c b a 段选码 0 1 1 0 0 0 0 0 0 C0H 1 1 1 1 1 1 0 0 1 F9H 2 1 0 1 0 0 1 0 0 A4H 3 1 0 1 1 0 0 0 0 B0H 4 1 0 0 1 1 0 0 1 99H 5 1 0 0 1 0 0 1 0 92H 6 1 0 0 0 0 0 1 0 82H 7 1 1 1 1 1 0 0 0 F8H 8 1 0 0 0 0 0 0 0 80H 9 1 0 0 1 0 0 0 0 90H
A 1 0 0 0 1 0 0 0 88H B 1 0 0 0 0 0 1 1 83H C 1 1 0 0 0 1 1 0 C6H D 1 0 1 0 0 0 0 1 A1H E 1 0 0 0 0 1 1 0 86H F 1 0 0 0 1 1 1 0 8EH 2. 7 段 LED 动态显示原理 LED 的静态显示虽然有编程容易 管理简单等优点, 但是静态显示所要占的 I/O 口资源很多, 所以在显示的 LED 点较多的情况下, 一般都采用动态显示方式 在多位 7 段 LED 显示中, 为了简化电路, 降低成本, 则将所有位的段选线并联在一起, 刚好由 8 个 I/O 口来控制 8 个段 而公共端 ( 共阳极 / 共阴极 ) 则分别由相应的 I/O 口控制, 以实现各个位的分时选通 原理图如图 1-3 所示 由于所有的段选线并联到同一个 I/O, 由这个 I/O 口来控制, 因此, 若是所有的 4 位 7 段 LED 都选通的话,4 位 7 段 LED 将会显示相同的字符 要使各个位的 7 段 LED 显示不同的字符, 就必须采用动态扫描方法来轮流点亮每一位 7 段 LED, 即在每一瞬间只选通一位 7 段 LED 进行显示单独的字符 在此段点亮时间内, 段选控制 I/O 口输出要显示的相应字符的段选码, 而位选控制 I/O 口则输出位选信号, 向要显示的位送出选通电平 ( 共阴极则送出低电平, 共阳极则送出高电平 ), 使得该位显示相应字符 这样将四位 7 段 LED 轮流去点亮, 使得每位分时显示该位应显示的字符 由于人眼的视觉暂留时间为 0.1 秒, 当每位显示的间隔未超过 33ms 时, 并在显示时保持直到下一位显示, 则由于人眼的视觉暂留效果眼睛看上去就像是 4 位 7 段 LED 都在点亮 设计时, 要注意每位显示的间隔时间, 由于一位 7 段 LED 的熄灭时间不能超过 100ms, 也就是说点亮其它位所用的时间不能超过 100ms, 这样当有 N 位的 7 段 LED 用来显示时, 每一位间隔的时间 t 就必须符合下面的式子 : t 100ms/(N-1) 比如, 现在使用 4 位, 也就是 N=4, 则由式子可以算出 t 33ms, 就是每一位的间隔时间不能超过 33ms 当然时间可以也设得短一些, 比如 5ms 或 1ms 也可以
段 選 位選 图 1-3 7 段 LED 动态显示原理图 3. 7 段 LED 与中颖单片机的接口及应用程序 电路原理图 以 SH69P43 控制芯片为例,4 位 7 段 LED 动态显示的电路原理图如图 4 所示 使用 4MHz 晶振作为主振荡器,PE 口和 PF 口控制 4 位 7 段 LED 的段选,PB 口控制 4 位 7 段 LED 的位选 将 4 个共阳极的 7 段 LED 的段选线并联起来接到 PE 口和 PF 口,dp g f 和 e 段选线接到 PF3~PF0 上,d c b 和 a 段选线接到 PE3~ PE0 上 ; 将 4 个公共端 VCC 分别接到 PB 口上 由于 SH69P43 的 I/O 口电流较小, 所以在位选端要使用三极管来进行 7 段 LED 的推动, 向 7 段 LED 提供足够大的电流来点亮 LED 在中颖单片机中, 有些芯片的 I/O 口是可以提供至少 200mA 的反向电流, 比如 SH69P26 和 SH69P55, SH69P26 有 6 个大电流 I/O 口 (PORTA 和 PORTD1~PORTD0),SH69P55 也是有 6 个大电流 I/O 口 (PORTD 和 PORTE1~PORTE0) 当使用这些有大驱动电流的 I/O 口的芯片来做 7 段 LED 显示时, 当显示电路的位数不超过芯片所带有的大驱动电流 I/O 数时, 比如在 SH69P26 和 SH69P55 中做 6 位以内的 7 段 LED 显示时, 就无需使用三极管, 而可以直接去驱动 LED 了 要注意的是, 由于这些 I/O 口是提供大的反向电流, 也就是说, 电流是流向 I/O 的, 所以只能使用共阴极的 7 段 LED, 而不能使用共阳极的 7 段 LED
图 1-4 4 位 7 段 LED 显示电路原理图 程序 如图 1-4 的电路原理图, 现以程序来举个例子 以 SH69P43 为控制芯片,4M 晶振为主振荡器, 以动态扫描方式驱动 4 位 7 段 LED,1ms 扫描一个位,4 位循环扫描 程序中有个加载数据的地方只是为了测试显示设定的, 实际应用中可在那里更新所要显示的数据 当全速运行程序时, 就能从 4 位 7 段 LED 中看到所要显示的字符 例 [1-1] 4 位 7 段 LED 显示 LIST P=69P43 ROMSIZE=3072 ; 系统寄存器 IE EQU 00H ; 中断使能标志 IRQ EQU 01H ; 中断请求标志 TM0 EQU 02H ;Timer0 模式寄存器 TL0 EQU 04H ;Timer0 装入 / 记数寄存器低四位 TH0 EQU 05H ;Timer0 装入 / 记数寄存器高四位
TBR EQU 0EH ; 查表寄存器 PORTB EQU 09H ;Port B 数据寄存器 PORTE EQU 0CH ;Port E 数据寄存器 PORTF EQU 0DH ;Port F 数据寄存器 INX EQU 0FH ; 间接寻址伪索引寄存器 DPL EQU 10H ;INX 数据指针低四位 DPM EQU 11H ;INX 数据指针中三位 DPH EQU 12H ;INX 数据指针高三位 PBCR EQU 19H ;PortB 输入 / 输出控制寄存器 PECR EQU 1CH ;PortE 输入 / 输出控制寄存器 PFCR EQU 1DH ;PortF 输入 / 输出控制寄存器 ; 用户定义寄存器 AC_BAK EQU 30H ;AC 值备份寄存器 PB_BAK EQU 32H ;PortB 数据备份寄存器 PE_BAK EQU 35H ;PortE 数据备份寄存器 PF_BAK EQU 36H ;PortF 数据备份寄存器 ;-------------------------------------- ; 用于 TIMER 定时 T1MS_CT EQU 37H ; 计数值 =04H, 定时 1ms ;-------------------------------------- F_TIMER EQU 39H ;bit0=1, 1ms 到 FLAG1 EQU 3AH ;bit0=1, 按键未松开 ;-------------------------------------- ; Used for display DISP_R1 EQU 3BH ; 第一位 7 段 LED 显示的字符 DISP_R2 EQU 3CH ; 第二位 7 段 LED 显示的字符 DISP_R3 EQU 3DH ; 第三位 7 段 LED 显示的字符 DISP_R4 EQU 3EH ; 第四位 7 段 LED 显示的字符 DISP_PT EQU 3FH ; 位选指针 ; 程序 ORG 0000H RESET RTNI TIMER0_ISP ;TIMER0 中断程序入口地址
RTNI RTNI ;********************************************* ; TIMER0 中断服务程序 ;********************************************* TIMER0_ISP: STA AC_BAK,00H ; 备份 AC 值 ANDIM IRQ,1011B ; 清 TIMER0 中断请求标志 J1MS: SBIM T1MS_CT,01H BNZ TIMER0_ISP_END ; 未到 1ms, 跳转 T1MS_CT,04H ; 重置 1ms 计数器 ORIM F_TIMER,0001B ; 设置 "1ms 到 " 标志 TIMER0_ISP_END: IE,0100B ; 打开 TIMER0 中断 AC_BAK,00H ; 取出 AC 值 RTNI ;******************************************* ; 主程序 ;******************************************* RESET: NOP ;------------------------------------------------ ; 清用户寄存器 ;------------------------------------------------- POWER_RESET: DPL,00H DPM,02H DPH,00H POWER_RESET_1: ADIM ADCM BA3 INX,00H DPL,01H TBR,00H DPM,00H POWER_RESET_2 POWER_RESET_3 POWER_RESET_2: ADIM DPH,01H
POWER_RESET_3: SBI BNZ SBI BNZ DPH,01H POWER_RESET_1 DPM,04H POWER_RESET_1 ;---------------------------------------------- ; 初始化系统寄存器 ;----------------------------------------------- SYSTEM_INITIAL: ;TIMER0 初始化 TM0,07H ; 设置 TIMER0 预分频为 /1 TL0,06H TH0,00H ; 设置中断时间为 250us T1MS_CT,04H ; 定时 1ms ;I/O 口初始化 PORTB,00H PBCR,0FH ; 设置 PortB 作为输出口 PORTE,0FH PECR,0FH ; 设置 PortE 作为输出口 PORTF,0FH PFCR,0FH ; 设置 PortF 作为输出口 ;-------------------------------------- MAIN_PRE: IRQ,00H IE,0100B ; 打开 Timer0 中断 MAIN: ADI F_TIMER,0001B BA0 HALTMODE ; 未到 1ms, 跳转 ANDIM F_TIMER,1110B ; 清 "1ms 到 " 标志 ;------------------------------------------------------------ ; 加载显示数据 ( 用于测试 7 段 LED 显示模块 ) ;----------------------------------------------------------- DISP_R1,03H DISP_R2,07H DISP_R3,09H DISP_R4,0FH ****************************************************************************** * 模块 : 4 位 7 段 LED 显示模块 *
* 输入变量 : DISP_R1,DISP_R2,DISP_R3,DISP_R4 * * 使用变量 : DISP_PT,TBR,PB_BAK,PE_BAK,PF_BAK * * 输出变量 : PORTB,PORTE,PORTF * ***************************** DISPLAY: DISP_1: ADIM DISP_PT,01H ; 指针加一 SBI DISP_PT,01H BAZ DISP_11 ; 显示位 1 数码管, 跳转 SBI DISP_PT,02H BAZ DISP_12 ; 显示位 2 数码管, 跳转 SBI DISP_PT,03H BAZ DISP_13 ; 显示位 3 数码管, 跳转 ;------------------------------------------------------------- ; 显示位 4 数码管 ;------------------------------------------------------------- DISP_14: DISP_PT,00H ; 指针清零 PB_BAK,0001B ; 预设位选码 CALL STA TBR,0FH DISP_R4,00H 07EFH PE_BAK,00H TBR,00H STA PF_BAK,00H ; 由字符查表得预设段选码的值 DISPLAY_END ;--------------------------------------------------------- ; 显示位 3 数码管 ;--------------------------------------------------------- DISP_13: PB_BAK,0010B ; 预设位选码 CALL STA TBR,0FH DISP_R3,00H 07EFH PE_BAK,00H TBR,00H STA PF_BAK,00H ; 由字符查表得预设段选码的值 DISPLAY_END
;---------------------------------------------------------- ; 显示位 2 数码管 ;------------------------------------------------------------ DISP_12: PB_BAK,0100B ; 预设位选码 CALL STA TBR,0FH DISP_R2,00H 07EFH PE_BAK,00H TBR,00H STA PF_BAK,00H ; 由字符查表得预设段选码的值 DISPLAY_END ;------------------------------------------------------------------ ; 显示位 1 数码管 ;------------------------------------------------------------------- DISP_11: PB_BAK,1000B ; 预设位选码 CALL STA TBR,0FH DISP_R1,00H 07EFH PE_BAK,00H TBR,00H STA PF_BAK,00H ; 由字符查表得预设段选码的值 DISPLAY_END DISPLAY_END: PORTB,00H ; 关闭显示 STA PE_BAK,00H PORTE,00H PF_BAK,00H STA PORTF,00H ; 送出预设的段选码到 I/O 口 PB_BAK,00H STA PORTB,00H ; 送出预设的位选码到 I/O 口, 显示该位 ;******************************************* HALTMODE: NOP HALT NOP
NOP NOP MAIN ORG 07EFH T ;------------------------------------------- ; 显示段选码数据表 ( 共阳极 ) ORG 07F0H ;dp g f e, d c b a RTNW 1100B,0000B ;0 RTNW 1111B,1001B ;1 RTNW 1010B,0100B ;2 RTNW 1011B,0000B ;3 RTNW 1001B,1001B ;4 RTNW 1001B,0010B ;5 RTNW 1000B,0010B ;6 RTNW 1111B,1000B ;7 RTNW 1000B,0000B ;8 RTNW 1001B,0000B ;9 RTNW 1000B,1000B ;A RTNW 1000B,0011B ;B RTNW 1100B,0110B ;C RTNW 1010B,0001B ;D RTNW 1000B,0110B ;E RTNW 1000B,1110B ;F END