在线时间372 小时
UID3135871
注册时间2016-10-9
NXP金币20
TA的每日心情 | 怒 2024-2-5 12:06 |
---|
签到天数: 627 天 [LV.9]以坛为家II
版主
- 积分
- 4429
- 最后登录
- 2024-2-5
|
本帖最后由 胤幻1988 于 2020-11-7 14:51 编辑
今天写一个数码管显示的程序,数码管在开发板上出现的概率越来越低了,仅在低端的51上还能看见。但是在节约成本的场合还是用的比较频繁的一个器件。论坛有位朋友想要一份数码管的显示程序,我手头整合有旺宝的LCP1768的板子,加一个老的51板上有数码管模块,硬件还算齐全,那么就开干吧。并没有完全切合那位朋友的电路,但流程大致都相同,还是能参考参考的。请只看数码管相关的,其他外设请忽略。这里用的573锁存器,锁存控制引脚高电平时同步数据,低电平时锁存。用138译码器,就控制ABC3个选通端来控制位选,然后在定时器中断程序里面
一位一位的显示。
硬件连接:
数码管电路:
MCU(LPC1768)引脚部分:
位锁存器控制引脚:
位码 :A-->1.0
段锁存器控制引脚:
段码 : B-->1.1
段码对应引脚(PA00~PA07为上图数码管控制引脚标号):
PA00-->2.0
PA01-->2.1
PA02-->2.2
PA03-->2.3
PA04-->2.4
PA05-->2.5
PA06-->2.6
PA07-->2.7
思路:主函数while里面变化显示的变量,在定时器里面刷新数码管的显示:
smg.c:
- #include "smg.h"
- #include "timer.h"
- // 当前数码管为共阴极数码管
- // 显示段码值01234567 +''
- unsigned char dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
- //分别对应相应的数码管点亮,即位码
- unsigned char dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- //当前要显示的数值
- uint32_t smgdata=0;
- //显示数值分析后的数组
- uint8_t showbuf[8]={0};
- void SMG_Config(void)
- {
- //段码、位码
- Chip_GPIO_Init(LPC_GPIO);//打开GPIO外设时钟
- Chip_IOCON_PinMux(LPC_IOCON, 2, 0, IOCON_MODE_INACT, IOCON_FUNC0);//设置P2.0为GPIO功能
- Chip_IOCON_PinMux(LPC_IOCON, 2, 1, IOCON_MODE_INACT, IOCON_FUNC0);
- Chip_IOCON_PinMux(LPC_IOCON, 2, 2, IOCON_MODE_INACT, IOCON_FUNC0);
- Chip_IOCON_PinMux(LPC_IOCON, 2, 3, IOCON_MODE_INACT, IOCON_FUNC0);
- Chip_IOCON_PinMux(LPC_IOCON, 2, 4, IOCON_MODE_INACT, IOCON_FUNC0);
- Chip_IOCON_PinMux(LPC_IOCON, 2, 5, IOCON_MODE_INACT, IOCON_FUNC0);
- Chip_IOCON_PinMux(LPC_IOCON, 2, 6, IOCON_MODE_INACT, IOCON_FUNC0);
- Chip_IOCON_PinMux(LPC_IOCON, 2, 7, IOCON_MODE_INACT, IOCON_FUNC0);
- Chip_GPIO_SetPinDIR(LPC_GPIO,2, 0, true);//设置输出模式
- Chip_GPIO_SetPinDIR(LPC_GPIO,2, 1, true);//设置输出模式
- Chip_GPIO_SetPinDIR(LPC_GPIO,2, 2, true);//设置输出模式
- Chip_GPIO_SetPinDIR(LPC_GPIO,2, 3, true);//设置输出模式
- Chip_GPIO_SetPinDIR(LPC_GPIO,2, 4, true);//设置输出模式
- Chip_GPIO_SetPinDIR(LPC_GPIO,2, 5, true);//设置输出模式
- Chip_GPIO_SetPinDIR(LPC_GPIO,2, 6, true);//设置输出模式
- Chip_GPIO_SetPinDIR(LPC_GPIO,2, 7, true);//设置输出模式
- Chip_GPIO_SetPortValue(LPC_GPIO,2,0XFFFFFF00);//设置输出低电平 P2.0~P2.7
- //锁存器控制
- Chip_IOCON_PinMux(LPC_IOCON, 1, 0, IOCON_MODE_INACT, IOCON_FUNC0);//设置P1.0为GPIO功能
- Chip_IOCON_PinMux(LPC_IOCON, 1, 1, IOCON_MODE_INACT, IOCON_FUNC0);
- Chip_GPIO_SetPinDIR(LPC_GPIO,1, 0, true);//设置输出模式
- Chip_GPIO_SetPinDIR(LPC_GPIO,1, 1, true);//设置输出模式
- //初始状态
- LAT_W_A(0);
- LAT_D_B(0);
- }
复制代码 smg.h:
- #ifndef _SMG_H_
- #define _SMG_H_
- #include "chip.h"
- //X的值等于0,GPIO低电平。X的值等于1,GPIO高电平。
- //Chip_GPIO_SetPinOutHigh(LPC_GPIO,2,0) //设置P2.0输出高电平
- //Chip_GPIO_SetPinOutLow(LPC_GPIO,2,0) //设置P2.0输出低电平
- //位码 :A-->1.0 段码 : B-->1.1
- #define LAT_W_A(x) ((x) ? (Chip_GPIO_SetPinOutHigh(LPC_GPIO,1,0)) : (Chip_GPIO_SetPinOutLow(LPC_GPIO,1,0)));
- #define LAT_D_B(x) ((x) ? (Chip_GPIO_SetPinOutHigh(LPC_GPIO,1,1)) : (Chip_GPIO_SetPinOutLow(LPC_GPIO,1,1)));
- //#define DataPort(x) (Chip_GPIO_SetPortValue(LPC_GPIO,2,0XFFFFFF00&x));//设置输出低电平 P2.0~P2.7
- #define DataPort(x) (Chip_GPIO_SetPortValue(LPC_GPIO,2,0XFFFFFF00|x));//设置输出低电平 P2.0~P2.7
- extern unsigned char dofly_DuanMa[11];
- extern unsigned char dofly_WeiMa[8];
- extern uint32_t smgdata;
- extern uint8_t showbuf[8];
- //
- void SMG_Config(void);
- void SMG_WRITEONEBIT(uint8_t pos,uint8_t data);
- void SMG_ANALYSISDATA(uint32_t tmpdata);
- #endif
复制代码 timer.h
- #ifndef __TIMER_H_
- #define __TIMER_H_
- #include <stdint.h>
- extern uint32_t cnt;
- void Time_Init( uint32_t arr, uint32_t psc) ;
- void my_delay(uint32_t delay);
- #endif
复制代码 timer.c
- #include "chip.h"
- #include "timer.h"
- #include "led.h"
- #include "smg.h"
- uint32_t cnt=0;
- /************************************************************************************************
- 函数名: void TIMER0_IRQHandler (void)
- 函数功能:定时器中断服务函数
- 参数:无
- 返回值:无
- *************************************************************************************************/
- <font color="#ff0000">void TIMER0_IRQHandler (void)
- {
- static uint16_t i=0;
- Chip_TIMER_ClearMatch(LPC_TIMER0,0);//清除定时中断标志
- cnt++;
- //LPC_GPIO2->PIN ^= 0xff;
- DataPort(dofly_WeiMa[i]); //取位码
- LAT_W_A(1); //位锁存
- my_delay(5);
- LAT_W_A(0);
- my_delay(5);
- DataPort(dofly_DuanMa[showbuf[i]]); //取显示数据,段码
- LAT_D_B(1); //段锁存
- my_delay(5);
- LAT_D_B(0);
- my_delay(5);
- //my_delay(10000);//扫描间隙延时,时间太长会闪烁,太短会造成重影
- i++;
- if(8==i) //检测8位扫描完全结束?如扫描完成则从第一个开始再次扫描8位
- i=0;
- }</font>
- /********************************************************************************************
- 函数名称:TIMR_init()
- 函数功能:定时器初始化
- 参数:预分配值,定时器时间
- 返回值:无
- *********************************************************************************************/
- void Time_Init( uint32_t arr, uint32_t psc)
- {
- Chip_TIMER_Init(LPC_TIMER0);//设置外设功率
- //Chip_TIMER_SetMatch(LPC_TIMER0,0,(100000000/4)*psc-1);//设置匹配值
-
- Chip_TIMER_SetMatch(LPC_TIMER0,0,(100000/4)*psc-1);//设置匹配值 x ms
-
- Chip_TIMER_MatchEnableInt(LPC_TIMER0,0);//设置and定时器中断
- Chip_TIMER_ResetOnMatchEnable(LPC_TIMER0,0);//设置定时器MR0复位
- Chip_TIMER_PrescaleSet(LPC_TIMER0,arr-1);//设置设置分频系数
- Chip_TIMER_Enable(LPC_TIMER0);//使能TIMER0
- NVIC_EnableIRQ(TIMER0_IRQn);//使能中断
- }
- void my_delay(uint32_t delay)
- {
- while(--delay);
- }
复制代码 main.c:
- #include "chip.h"
- #include "led.h"
- #include "key.h"
- #include "uart.h"
- #include "timer.h"
- #include "smg.h"
- int main(void){
-
- SystemCoreClockUpdate(); //系统时钟初始化
- UARTInit(0,115200);//串口0初始化
- Time_Init( 1 ,2); //定时器2ms中断 刷新时间可适当调整
- //LED_Config(); //LED初始化
- SMG_Config();
-
- smgdata=0;
-
- while(1){
- // //如果不用定时器就只能while
- // DataPort(dofly_WeiMa[i]); //取位码
- // LAT_W_A(1); //位锁存
- // my_delay(5);
- // LAT_W_A(0);
- // my_delay(5);
- // DataPort(dofly_DuanMa[i]); //取显示数据,段码
- // LAT_D_B(1); //段锁存
- // my_delay(5);
- // LAT_D_B(0);
- // my_delay(5);
- // my_delay(10000);//扫描间隙延时,时间太长会闪烁,太短会造成重影
- // i++;
- // if(8==i) //检测8位扫描完全结束?如扫描完成则从第一个开始再次扫描8位
- // i=0;
-
- //把数据拆分成数码管对应位的数字
- SMG_ANALYSISDATA(smgdata);
- my_delay(10000000);//显示的时间
- smgdata=smgdata+10;
- if(smgdata>100000000) smgdata=0;
- }
- }
复制代码 编译下载,查看现象:
代码下载:
【08】LPC1768_定时器实验.rar
(4.26 MB, 下载次数: 28)
|
|