用定时器实现数码管从10到0的递减,步长为1
二:74HC595脚位图及说明
管脚说明:
14脚:DS(SER),串行数据输入引脚
13脚:OE,输出使能控制脚,它是低电才使能输出,所以接GND
12脚:RCK(STCP),存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存到存储寄存器。
11脚:SCK(SHCP),移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit(从SER输入)。
10脚:MR,低电平时,清空移位寄存器中已有的bit数据,一般不用,接 高电平即可。
9 脚 :串行数据出口引脚。当移位寄存器中的数据多于8bit时,会把已有的bit“挤出去”,就是从这里出去的。用于595的级联。
Q0~Q7:并行输出引脚
使用参数:
VCC:2V~6V,5V最好
IQn:± 35mA
三:代码编写
#include "ti_msp_dl_config.h" void delay(uint32_t cnt); void DispNum(unsigned char num, unsigned char pos); /* This results in approximately 0.5s of delay assuming 32MHz CPU_CLK */ #define DELAY (16000000) // 500ms #define ms50 (1600000) // 50ms #define s1 (32000000) // 1s #define ms1 (320) // delay0.01ms unsigned char TAB_SEG[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x77, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xFF, 0xBF }; //显示位置,自左向右 unsigned char TAB_POS[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; // 发送数据给数码管模块用的串行时钟,时钟上升沿有效 #define SCLK_0 DL_GPIO_clearPins(GPIO_LED_PORT, GPIO_LED_1_PIN) #define SCLK_1 DL_GPIO_setPins(GPIO_LED_PORT, GPIO_LED_1_PIN) // 使数码管唯一寄存器数据被锁存到存储寄存器用的锁存信号,上升沿有效 #define RCLK_0 DL_GPIO_clearPins(GPIO_LED_PORT, GPIO_LED_2_PIN) #define RCLK_1 DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LED_2_PIN) // 发送数据给数码管用的串行数据位 #define DIO_0 {DL_GPIO_clearPins(GPIO_LED_PORT, GPI_LED_3_PIN);} #define DIO_1 {DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LED_3_PIN);} void delay(uint32_t cnt) { uint32_t d=cnt; while(d--); } /** * 显示一位数码管数据 * chr : 显示的数值字符(‘0’-‘9’,‘A’-‘F’) * pos :显示的位置(最左侧开始:0-7, 对应的位置数据:0x80, 0x40,0x20,0x10,0x08,0x04,0x02,0x01) * 暂时不考虑小数点的处理。数字后面有小数点的场合,相当于该数字的小数点笔段位清0 */ void DispNum(unsigned char chr, unsigned char pos) { unsigned char i, num; // 根据字符,获取对应的段位码数据 if (chr>=0 && chr<16) { num=TAB_SEG[chr]; } else if (chr>=' ') { // 空格,所有笔段都不显示 num = 0xFF; } else if (chr>='-') { num = 0xBF; } else { return; } for(i=0;i<8;i++) { // 输出笔段对应的数据位 if ((num & 0x80)>0) { // 笔段数据为1 的,DIO对应GPIO口输出高电平 DIO_1; } else { // 笔段数据为0 的,DIO对应GPIO口输出低高电平 DIO_0; }四:效果