一、原理图
二、原理分析
我们的数码管是共阳极的,当段选置0时(低电平)点亮数码管。段选A‘ -> DP'由锁存器74HC573(U7)控制,通过138译码器使能Y7C,进而将P0数据传出。位选COM1 -> COM8由U8控制,通过使能Y6C,来选择想要点亮的某一位数码管。例如若想使第一个数字为零。
(1).令P2.7、P2.6、P2.5为1、1、1,使能段选锁存器。然后令P0为0xc0,即段选输出为0使能段选锁存器。
(2).令P2.7、P2.6、P2.5为1、1、0,使能位选锁存器。然后令P0为0x01,即打开第一个数码管使能位选锁存器。
若想显示0,需将a,b,,c,d,e,f置0,其余置1。
三、代码
#include "dsp.h" DisplayStruct dsp; code unsigned char segCode[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6,0x89,0x8e,0x8c,0x86,0x88}; DisplayStruct* GetDisplayStruct(){ return &dsp; } void SegDisplay() { SEG(0xff); COM(0x01 << dsp.com); if(dsp.com != dsp.dot){ SEG(segCode[dsp.buf[dsp.com]]); }else{ SEG(segCode[dsp.buf[dsp.com]] & 0x7f); } if(++dsp.com >= 8) dsp.com = 0; } void InitDsp() { unsigned char i; for(i=0;i<8;i++) { dsp.buf[i] = 10; } dsp.dot = 255; dsp.SegDisplay = SegDisplay; }
数据导入
#include "task.h" void InitBsp() { BUZ(0x00); LED(0xff); InitDsp(); } void TaskDisplay() { DisplayStruct* seg = GetDisplayStruct(); GetDisplayStruct()->SegDisplay(); seg->dot = 6; seg->buf[0] = 17; seg->buf[1] = 10; seg->buf[2] = 10; seg->buf[3] = 10; seg->buf[4] = 10; seg->buf[5] = 10; seg->buf[6] = 1; seg->buf[7] = 1; }
#include "main.h" void main() { InitBsp(); while(1) { TaskDisplay(); } }
#ifndef __MAIN_H #define __MAIN_H #include <STC15F2K60S2.H> #include "task.h" #include "dsp.h" #define LED(x) {P0 = x;P2 = (P2 & 0x1f)|0x80;P2&=0x1f;} #define BUZ(x) {P0 = x;P2 = (P2 & 0x1f)|0xa0;P2&=0x1f;} #define COM(x) {P0 = x;P2 = (P2 & 0x1f)|0xc0;P2&=0x1f;} #define SEG(x) {P0 = x;P2 = (P2 & 0x1f)|0xe0;P2&=0x1f;} #endif