PIC单片机-七段数码管的使用

一、编写子程序LED_Display,根据入口参数在某一位7段码LED显示一个数字。点亮的LED位的位数在W寄存器中,该位显示的数字在变量wdata中。变量wdata的位置由用户自行设定。调用该子程序后,选中的数码管持续显示所需的数字100微秒,之后将数码管关闭,退出子程序。

/*******************************************************************************
* 函 数 名: Choose_and_light_shumaguan(uint8 position, unit16 i);
* 函数功能: 选择并显示七段数码管
* 入口参数: position,i
* 返    回: 无
*******************************************************************************/
void Choose_and_light_shumaguan(uint8 position, uint16 i)
{
    PORTA  = (PORTA & 0xE3) | position;
    PORTD = disp[i];
}

二、编写Main主程序,循环调用子程序LED_Display,动态点亮4位数码管,使得数码管的显示为“0123”。

/******************************************************************************
* 函 数 名: main(void)
* 函数功能: 数码管静态显示循环显示数字0到9
* 入口参数: 无
* 返    回: 无
*******************************************************************************/

void main(void)
{
    HC595_Init();               //74HC595初始化
    HC595_Write_Byte(0x00);     //写0x00数据,关掉LED点阵显示

    ADCON1 = 0x86;  //10000110  PORTA口设置为数字IO口
    TRISA &= 0xE3;  //RA2,RA3,RA4设置为输出
    TRISE &= 0xEF;      //配置PORTD为普通IO口,对PORTD的操作务必加上这句
    TRISD = 0x00;       //设置PORTD为输出
    while(1)
    {
        Choose_and_light_shumaguan(0x0C, 0); //第一个数码管显示0
        DelayMS(1);     //延时1ms
        Choose_and_light_shumaguan(0x10, 1); //第二个数码管显示1
        DelayMS(1);     //延时1ms
        Choose_and_light_shumaguan(0x14, 2); //第三个数码管显示2
        DelayMS(1);     //延时1ms
        Choose_and_light_shumaguan(0x18, 3); //第四个数码管显示3
        DelayMS(1);     //延时1ms
    }
}

 附

完整程序:

/*******************************************************************************
* 标    题: 静态数码管显示
* 跳线接法:断开P14上的短接帽
* 功能描述: 数码管显示“0123”
*******************************************************************************/
//#include <pic16f877a.h>
#include <htc.h>

#define uint8 unsigned char
#define uint16 unsigned int

__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF);    //设置配置位
//WDTE_OFF:disable watchdog timer       看门狗禁止
//LVP_OFF:low voltage programming disabled  低电压编程禁止
//FOSC_HS:high speed crystal/resonator  4M以上晶振选择HS高速
//PWRTDIS:disable power up timer
//BOREN_OFF:disable brown out reset

#define     SCK_595     RA5
#define     RCK_595     RE0
#define     SER_595     RC0

/*************************定义全局变量******************************************/

uint8 disp[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //0~9共阳数码管段码表

/************************声明函数***********************************************/
void DelayMS(uint16 delay);
void HC595_Init(void);
void HC595_Write_Byte(uint8 data);
void Choose_and_light_shumaguan(uint8 position, uint16 i);

/*******************************************************************************
* 函 数 名: DelayMS(uint delay)
* 函数功能: 毫秒延时    for 20MHZ
* 入口参数: delay
* 返    回: 无
*******************************************************************************/

void DelayMS(uint16 delay)
{
    uint16 i;
    for(; delay > 0; delay--)
        for(i = 0; i < 453; i++);
}

/******************************************************************************
* 函 数 名: HC595_Init(void)
* 函数功能: 74HC595初始化
* 入口参数: 无
* 返    回: 无
*******************************************************************************/
void HC595_Init(void)
{
    ADCON1 = 0x8E;
    TRISA5 = 0;
    TRISE0 = 0;
    TRISC0 = 0;
}

/******************************************************************************
* 函 数 名: HC595_Write_Byte(uint8 data)
* 函数功能: 74HC595写8位数据
* 入口参数: 无
* 返    回: 无
*******************************************************************************/
void HC595_Write_Byte(uint8 data)
{
    uint8 i;
    for(i = 0; i < 8; i++)
    {
        if(data & 0x80)
        {
            SER_595 = 1;
        }
        else
        {
            SER_595 = 0;
        }
        SCK_595 = 0;
        data <<= 1;;;
        SCK_595 = 1;
    }
    RCK_595 = 0;
    ;;
    RCK_595 = 1;
}

/*******************************************************************************
* 函 数 名: Choose_and_light_shumaguan(uint8 position, unit16 i);
* 函数功能: 选择并显示七段数码管
* 入口参数: position,i
* 返    回: 无
*******************************************************************************/
void Choose_and_light_shumaguan(uint8 position, uint16 i)
{
    PORTA  = (PORTA & 0xE3) | position;
    PORTD = disp[i];
}

/******************************************************************************
* 函 数 名: main(void)
* 函数功能: 数码管静态显示循环显示数字0到9
* 入口参数: 无
* 返    回: 无
*******************************************************************************/

void main(void)
{
    HC595_Init();               //74HC595初始化
    HC595_Write_Byte(0x00);     //写0x00数据,关掉LED点阵显示

    ADCON1 = 0x86;  //10000110  PORTA口设置为数字IO口
    TRISA &= 0xE3;  //RA2,RA3,RA4设置为输出
    TRISE &= 0xEF;      //配置PORTD为普通IO口,对PORTD的操作务必加上这句
    TRISD = 0x00;       //设置PORTD为输出
    while(1)
    {
        Choose_and_light_shumaguan(0x0C, 0); //第一个数码管显示0
        DelayMS(1);     //延时1ms
        Choose_and_light_shumaguan(0x10, 1); //第二个数码管显示1
        DelayMS(1);     //延时1ms
        Choose_and_light_shumaguan(0x14, 2); //第三个数码管显示2
        DelayMS(1);     //延时1ms
        Choose_and_light_shumaguan(0x18, 3); //第四个数码管显示3
        DelayMS(1);     //延时1ms
    }
}