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

2019-04-15 11:38发布

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