一、编写子程序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
#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
}
}