PIC单片机-LED阵列的使用

编写程序,在Led阵列上依次循环显示自己的学号及姓名拼音的缩写

/*******************************************************************************
* 标    题: LED点阵显示
* 功能描述: LED点阵循环显示"141270049ZRJ"
*******************************************************************************/
#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

void DelayUS(uint8 delay);
void HC595_Init(void);
void HC595_Write_Byte(uint8 data);
uint8 LED_Datachage(uint8 data);

const uint8 dot[12][8] =
{
    {0x00, 0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x00},   //"1"
    {0x00, 0x08, 0x18, 0x28, 0x7E, 0x08, 0x08, 0x00},   //"4"
    {0x00, 0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x00},   //"1"
    {0x00, 0x18, 0x24, 0x08, 0x10, 0x3C, 0x00, 0x00},   //"2"
    {0x00, 0x3C, 0x04, 0x08, 0x10, 0x20, 0x20, 0x00},   //"7"
    {0x00, 0x18, 0x24, 0x24, 0x24, 0x24, 0x18, 0x00},   //"0"
    {0x00, 0x18, 0x24, 0x24, 0x24, 0x24, 0x18, 0x00},   //"0"
    {0x00, 0x08, 0x18, 0x28, 0x7E, 0x08, 0x08, 0x00},   //"4"
    {0x00, 0x18, 0x24, 0x24, 0x1C, 0x08, 0x10, 0x00},   //"9"
    {0x00, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x00},   //"Z"
    {0x00, 0x70, 0x48, 0x70, 0x60, 0x50, 0x48, 0x00},   //"R"
    {0x00, 0x7C, 0x10, 0x10, 0x10, 0x50, 0x20, 0x00}    //"J"
};

/*******************************************************************************
* 函 数 名: DelayUS(uint8 delay)
* 函数功能: 微秒延时   for 20MHZ
* 入口参数: delay
* 返    回: 无
*******************************************************************************/

void DelayUS(uint8 delay)
{
    while(--delay);
}

/******************************************************************************
* 函 数 名: 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;
}

/******************************************************************************
* 函 数 名: LED_Datachage(uint8 data)
* 函数功能: 将8位数据的bit0和bit7、bit1和bit6,bit2和bit5,bit3和bit4互相对换
* 入口参数: data:待对换的数据
* 返    回: 无
*******************************************************************************/
uint8 LED_Datachage(uint8 data)
{
    uint8 temp, temp1;
    temp = (data & 0x01) << 7;
    temp1 = (data & 0x80) >> 7;
    data = (data & 0x7E) | temp | temp1;
    temp = (data & 0x02) << 5;
    temp1 = (data & 0x40) >> 5;
    data = (data & 0xBD) | temp | temp1;
    temp = (data & 0x04) << 3;
    temp1 = (data & 0x20) >> 3;
    data = (data & 0xDB) | temp | temp1;
    temp = (data & 0x08) << 1;
    temp1 = (data & 0x10) >> 1;
    data = (data & 0xE7) | temp | temp1;
    return data;
}

/*******************************************************************************
* 函 数 名: main(void)
* 函数功能: LED点阵循环显示0~9数字
*******************************************************************************/
void main(void)
{
    uint8 i, j;
    uint16 k;
    TRISA &= 0xE3;      //RA2、RA3、RA4设置成输出模式
    PORTA |= 0x1C;      //RA2 = 1、RA3 = 1、RA4 = 1,不选通任何数码管,则关掉数码管显示

    TRISE &= 0xEF;      //配置PORTD为普通IO口,对PORTD的操作务必加上这句
    TRISD = 0x00;       //设置PORTD为输出
    HC595_Init();       //74HC595初始化
    while(1)
    {
        for(j = 0; j < 12; j++) //"141270049ZRJ"
        {
            for(k = 0; k < 1500; k++)   //每个数字重复显示次数
            {
                for(i = 0; i < 8; i++)  //8行
                {
                    HC595_Write_Byte((0x01 << i));  //选择行
                    PORTD = ~LED_Datachage(dot[j][i]);  //送字
                    DelayUS(50);    //延时50us
                    PORTD = 0xFF;   //关显示
                }
            }
        }
    }
}

 

发表评论

电子邮件地址不会被公开。