驱动数码管程序
基于51单片机的74HC164驱动六位数码管显示程序与仿真

P2=0xff; //数码"灭"
}
}
main()
{
separateData(123456);
while(1)
{
display();
}
}
DS_data[2]=dat/100%10;
DS_data[3]=d4]=dat/10000%10;
DS_data[5]=dat/100000%10;
}
void write_164(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
sbit MOSI=P1^1;//符号DSA引脚1数据输入符号DSB引脚2数据输入
unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴数码管
基于51单片机的74HC164驱动六位数码管显示程序与仿真
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//74HC164
sbit CLK=P1^0;//符号CP引脚8时钟输入(低电平到高电平边沿触发)
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
max7219数码管驱动程序库函数

函数说明:初始化MAX7219芯片,MAX7219芯片按照顺序级联,
测试模式显示寄存器没有配置,若希望配置,应在max7219.h中将MAX7219_TestModeDisp_EN预定义为1,
并注意配置测试模式显示的时间,
若时间太短,将较难看到显示效果。
输入参数:n-----初始化芯片个数(n>=1,注意:第1个为第0号芯片,显示函数中有具体描述;
for(i=0;i<8;i++);//短延时
MAX7219_LOAD=0;
for(i=0;i<n;i++)//初始化几个MAX7219芯片,做几次设置操作
MAX7219_WriteAddrData (0x09,MAX7219_InitStructure.DecodeMode);//设置译码模式
MAX7219_LOAD=1;//LOAD上升沿锁存数据
*/
//#define DecodeMode0x09 //译码模式寄存器
//#define Intensity0x0a //亮度寄存器
//#define ScanLimit0x0b //扫描位数寄存器
//#define ShutDown0x0c //关机模式寄存器
//#define DisplayTest0x0f //显示测试寄存器
sbit MAX7219_DIN= P0^3; //串行数据输入
sbit MAX7219_CLK= P0^4; //串行时钟
sbit MAX7219_LOAD= P0^5; //显示数据锁存控制
/*****************************************************************
实验四--单片机驱动数码管显示

实验四单片机驱动数码管显示一实验目的1 学习单片机驱动数码管动态显示的电路设计和编程方法二实验原理1、单片机系统中常用的显示器有:发光二极管LED(Light Emitting Diode)显示器、液晶LCD(Liquid Crystal Display)显示器、CRT显示器等。
LED、LCD显示器有两种显示结构:段显示和点阵显示。
七段数码管显示为了显示数字或字符,必须对数字或字符进行编码。
七段数码管加上一个小数点,共计8段。
因此为LED显示器提供的编码正好是一个字节。
字母一般用米字型。
编码表:0x3f 0x06 0x5b 0x4f 0x66 0x6d0 1 2 3 4 50x7d 0x07 0x7f 0x6f 0x77 0x7c6 7 8 9 A B0x39 0x5e 0x79 0x71 0x00C D E F 无显示七段数码管对应八位由低到高:a,b,c,d,e,f,g,dp例:数码管显示2则要点亮a,b,g,e,d段,对应的八位是01011011数码管动态显示方式是将所有显示位的段选择线并联在一起,有统一的I/O资源来控制。
各个数码管公共端也有I/O资源来控制,分时的选通各个数码管进行动态显示。
每个瞬间只能选通一个数码管,人眼的暂留时间为,每个数码管的选通时间必须在以内,通常选择15ms~20ms。
电路图见实验附图。
三实验内容理解动态显示电路图,参考驱动程序,单片机P0口作段码输出控制,P1口作位码控制,使单片机驱动6个7段数码管输出实验当天年、月、日六位数字。
四、实验步骤(1)单片机最小应用系统1的P0口接段码口a~h,P1口接位码口S1~S6。
(2)在KEIL软件下编写程序并调试,完成实验内容要求。
(3)下载程序,通过实验箱验证设计电路和编写的程序是否达到实验要求。
下载程序,通过实验箱验证设计电路和编写的程序是否达到实验要求。
五参考程序与电路汇编语言参考程序:ORG 0000HLJMP STARTORG 0030HSTART: MOV R0,#30HMOV R1,#40HMOV 30H,#1MOV 31H,#2MOV 32H,#1MOV 33H,#1MOV 34H,#2MOV 35H,#0START1: MOV DPTR,#TABMOV R3,#6LOOP: MOV A,@R0MOVC A,@A+DPTRMOV @R1,AINC R0INC R1DJNZ R3,LOOPMOV R3,#6MOV R1,#40HMOV A,#20HLOOP1: MOV P1,@R1MOV P2,AACALL DELAYMOV P2,#00HRR AINC R1DJNZ R3,LOOP1LJMP START1TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,58H,5EH,7BH,71H,00H,40H DELAY: MOV R4,#100LOOP2: DJNZ R4,LOOP2RETENDC语言参考程序:#include <reg51.h>#include <intrins.h>unsigned char code table[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};unsigned char date[]={1,2,1,1,2,0};void delay(){unsigned char j;for(j=0;j<=100;j++);}void main(){unsigned char i,a;while(1){a=0x40;for(i=0;i<6;i++){P1=table[date[i]];a=_cror_(a,1);P2=a;delay();P2=0x00;}}}数码管动态显示电路图(位选信号为高电平,段选信号为高电平):。
max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)

SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位MSB在先
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态,时钟悬空高
*功能:STM32_SPI1硬件配置初始化
*入口参数:无
*出口参数:无
*说明:STM32_SPI1硬件配置初始化,使用3V3
****************************************************************************/
void SPI1_Init(void)
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
SPI1_InitStructure.SPI_NSS = SPI_NSS_Soft;CPolynomial = 7;//CRC值计算的多项式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//SPI1相关引脚
c51单片机驱动三位8段数码管显示0.00-9.99,c语言程序

unsigned char temp[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
unsigned char table[3];
unsigned iபைடு நூலகம்t num;
void display(unsigned int num)
TH0 = 0xfc;
TL0 = 0x18;
j++;
if(i < 3)
{
P2 = 0xf8;
P1 = 0x00;
P2 = ~(1 << i);
P1 = table1[i];
i++;
}
else
i = 0;
if(j >= 1000)
{
num++;
if(num > 999)
num = 0;
j = 0;
}
用的是共阴极数码管,定时器延时,不会出现数码管抖动现象
定时器自动加,会从0.00-9.99自动显示,9.99以后又清0.00
追问
我是从ADC0908中传出的8位数字量到单片机上,用单片来动态显示到数码管上的,不知道是不是要标定一下?(传感器输出1-5v,量程是0-10米经AD转换后给单片机用数码管显示0-10米,且在1米和8米处要求报警)
是不是该用单片机不断地循环查询?
回答
不知道这个有没的AD转换中断,如果有可以在每次转换成功以后查下,没有的话,估计要不断查询
TL0 = 0x18;
ET0 = 1;
52单片机驱动1位共阳数码管

52单片机驱动1位共阳数码管52单片机是一种常用的单片机型号,其具有丰富的外设资源和强大的功能。
在实际应用中,驱动数码管是一项常见且重要的任务。
本文将介绍使用52单片机驱动1位共阳数码管的原理、步骤以及相关注意事项。
1.数码管的工作原理数码管是一种能够显示数字和一些特定字符的显示器件。
常见的数码管有共阳(共阳极)和共阴(共阴极)两种类型。
共阳数码管的工作原理是,在特定的引脚上施加高电平时,对应的数码管段会被点亮,从而显示相应的数字或字符。
2.硬件连接开始之前,我们需要将数码管与52单片机正确地连接起来。
共阳数码管一般有7段,分别对应a、b、c、d、e、f、g。
此外,还有一个引脚用于控制小数点。
在连接时,需要将各个段引脚与52单片机的IO 口相连接,小数点引脚则与GND(地)相连接。
此外,还需要为数码管接上限流电阻。
3.编写程序接下来,我们需要编写程序来实现对数码管的驱动。
以C语言为例,以下是一个简单的程序示例:```#include <reg52.h>#include <intrins.h>sbit SDA = P1^0;sbit SCL = P1^1;void delay(){unsigned char i;for(i=0; i<100; i++);}void start()SCL = 1; SDA = 1; delay(); SDA = 0; delay(); SCL = 0;}void stop() {SDA = 0; SCL = 1; delay(); SDA = 1;void writeByte(unsigned char byte) {unsigned char i;for(i=0; i<8; i++){SDA = (byte&(0x80>>i)) ? 1 : 0; delay();SCL = 1;delay();SCL = 0;}}void display(unsigned char num)unsigned char NumSegCode[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };start();writeByte(0x44);stop();start();writeByte(0xC4);writeByte(NumSegCode[num]);stop();}void main()unsigned char number = 5;while(1){display(number);}}```在程序中,首先定义了数据和时钟引脚的控制位。
数码管驱动程序实例
数码管驱动程序实例介绍数码管是一种常见的显示设备,通常用于显示数字和部分字母。
为了控制数码管的显示内容,我们需要编写一段驱动程序来控制数码管的工作。
本文将介绍一个数码管驱动程序的实例,包括硬件连接、代码编写和运行效果展示。
通过学习这个实例,你将了解到如何使用Arduino来驱动数码管进行数字显示。
硬件连接首先,我们需要准备以下硬件组件:•Arduino开发板•数码管(常见的有共阳极和共阴极两种类型)接下来,按照以下步骤进行硬件连接:1.将Arduino开发板与电脑连接,并打开Arduino IDE。
2.将数码管的引脚与Arduino开发板上的数字引脚相连。
具体连接方式取决于你使用的数码管类型,请参考相关资料或数据手册。
3.使用面包板或杜邦线等工具完成引脚连接。
代码编写完成硬件连接后,我们可以开始编写代码了。
以下是一个简单的数码管驱动程序示例:// 引入库#include <SevSeg.h>// 创建一个SevSeg对象并指定引脚SevSeg sevseg;void setup() {// 初始化数码管sevseg.begin(COMMON_CATHODE, 4, 3, 2, 1, 0, 6, 7, 5, 8);}void loop() {// 显示数字0-9for (int i = 0; i < 10; i++) {sevseg.setNumber(i);sevseg.refreshDisplay();delay(1000);}}代码解析:1.首先,我们引入了一个名为SevSeg的库,该库提供了控制数码管的函数和方法。
2.在setup()函数中,我们初始化了一个SevSeg对象,并指定了数码管的引脚连接方式。
这里使用的是共阳极数码管,如果你使用的是共阴极数码管,则需要将COMMON_CATHODE改为COMMON_ANODE。
3.在loop()函数中,我们通过一个循环来显示数字0-9。
CH451键盘、数码管驱动程序及电路
苦心人,天不负,三千炎黄甲可灭倭苦心人,天不负,三千炎黄甲可灭倭谁也没有权力代表那3500万死去的同胞原谅日本!!--------- "我们要记取的不仅是南京大屠杀到底有多少人罹难,更要谨记这些人是如何惨死的。
" --张纯如主页博客相册|个人档案 |好友查看文章CH451键盘、数码管驱动程序及电路(8051、凌阳61)2009-06-17 15:442.1. 显示驱动● 内置大电流驱动级,段电流不小于25mA,字电流不小于150mA。
● 动态显示扫描控制,直接驱动 8位数码管或者 64 只发光管LED。
● 可选数码管的段与数据位相对应的不译码方式或者 BCD 译码方式。
● 数码管的字数据左移、右移、左循环、右循环。
● 各数码管数字独立闪烁控制。
● 通过占空比设定提供16级亮度控制。
● 支持段电流上限调整,可以省去所有限流电阻。
● 扫描极限控制,支持1到8个数码管,只为有效数码管分配扫描时间。
2.2. 键盘控制● 内置64 键键盘控制器,基于8×8矩阵键盘扫描。
● 内置按键状态输入的下拉电阻,内置去抖动电路。
● 键盘中断,低电平有效输出。
● 提供按键释放标志位,可供查询按键按下与释放。
2.3. 其它● 高速的 4线串行接口,支持多片级联,时钟速度从0 到 10MHz。
● 串行接口中的DIN和DCLK信号线可以与其它接口电路共用,节约引脚。
● 完全内置时钟振荡电路,不需要外接晶体或者阻容振荡。
● 内置上电复位和看门狗Watch-Dog,提供高电平有效和低电平有效复位输出。
详细资料下载地址如果迅雷下载不成功,就用IE下(文件另存为)/axsdffffproteus/filebox/down/fc/010eddef4a38fbcf956375013504d54 7/filebox/down/fc/1bf2b8ae32d118285755d332543cadb c部分程序如下:#define CH451_RESET 0x0201 //复位#define CH451_LEFTMOV 0x0300 //设置移动方式-作移#define CH451_LEFTCYC 0x0301 //设置移动方式-左循#define CH451_RIGHTMOV 0x0302 //设置移动方式-右移#define CH451_RIGHTCYC 0x0303 //设置移动方式-右循#define CH451_SYSOFF 0x0400 //关显示、键盘、看门狗#define CH451_SYSON1 0x0401 //开显示#define CH451_SYSON2 0x0403 //开显示、键盘#define CH451_SYSON3 0x0407 //开显示、键盘、看门狗功能#define CH451_DSP 0x0500 //设置默认显示方式#define CH451_BCD 0x0580 //设置BCD译码方式#define CH451_TWINKLE 0x0600 //设置闪烁控制#define CH451_DIG0 0x0800 //数码管位0显示#define CH451_DIG1 0x0900 //数码管位1显示#define CH451_DIG2 0x0a00 //数码管位2显示#define CH451_DIG3 0x0b00 //数码管位3显示#define CH451_DIG4 0x0c00 //数码管位4显示#define CH451_DIG5 0x0d00 //数码管位5显示#define CH451_DIG6 0x0e00 //数码管位6显示#define CH451_DIG7 0x0f00 //数码管位7显示//须主程序定义的参数sbit ch451_dclk=P2^5; //串行数据时钟上升延激活sbit ch451_din=P2^6; // 串行数据输出,接CH451的数据输入sbit ch451_load=P2^7; //串行命令加载,上升延激活sbit ch451_dout=P3^3; //INT1,键盘中断和键值数据输入,接CH451的数据输出unsigned char ch451_key; // 存放键盘中断中读取的键值//********************************************//初始化子程序void ch451_init(){ch451_din=0; //先低后高,选择4线输入ch451_din=1;IT1=1; //设置下降沿触发PX1=1; //设置低优先级EX1=1; //开中断EA=1;//*****************************************************//输出命令子程序//定义一无符号整型变量存储12字节的命令字。
74HC164应用实例:驱动数码管两例(电路图和源程序)
4HC164应用实例:驱动数码管两例(电路图和源程序)文章编号:8文章分类:电路>电子元件点击:... 关键词:74HC164文章来源:百合电子工作室收集整理摘要:74HC164应用实例:驱动数码管的两个实例分别提供了汇编源程序和C源程序...实例174HC164是串行输入,并行输出接口器件,可用在单向的并行输出/并行地址锁存等. 74HC164因为价格便宜,容易使用特别适合使用在在需要用到数码管显示IO口又比较紧张的电子产品中,下面浅谈使用方法:1. 首先先了解他的引脚功能和逻辑图,如下图:图1 引脚名称和用途图2 真值表通过真值表我们可以了解到,A,B两个输入端是互锁的,CLK上升沿时数据移入移位寄存器中,CLEAR为清零用的,接低电平时所有端口都输出低电平,了解了真值表之后开始运用了,先给出如下原理图:图3 原理图图中,采用义隆的EM78P153作为控制芯片,P50作为CLK时钟信号,注意平时数据不传输时,时钟信号是不发送的应一直保持低电平或者高电平,数据需要传输的时候才输出时钟信号^_^ ,继续P51作为移位数据输出端,接到74HC164的B端,A端接高电平,当然也可以AB端短路,然后连接到DATA移位数据端,P52作为数码管的选通信号(也可以叫消隐^_^), 作用是使数据传输过程暂时关闭显示,以免显示出不需要的数据,原因是应为164不带锁存功能,数据传输过程是一位一位的向高位移位输出的,所以要等数据全部移入后才打开始点亮数码管.注意了哦,通过查看164的规格书发现,164输出高电平电流比输出低电平电流要小,亦称灌电流大,扇出电流弱,所以适合选用共阳数码管,如图,本人偷懒没有画出那个数码管的8字该介绍的介绍的差不多了,废话少说,该开始干活了,任务是: 显示0-9 每秒+1 ,到9后又返回0,一直循环显示,根据任务得到如下流程图:1. 显示部分:将需要显示的数值送入A ==>查表求得显示段码==>将段码逐位移入164==>8位移完后点亮数码管==>延时==>返回第一步执行2. 中断部分:进入中断==>保存现场(以备调查取证,送你入狱^_^)==>重置TCC==>够1秒钟将需要显示的数据+1,并重置,不够就退出;根据以上要求就开始写代码调试了,要注意一点,数据移位时一定要记得高位在前哦,否则显示错误别怪我没有说清楚,我当年实验时就因为这个数据移位方向反了排查了半天,甚至以为是时钟频率不对,又以为时许不对.....搞了半天,NND后来重看DATASHEET才发现,原来是低级错误啊,呜呼哀哉.......,希望你不要重蹈我覆辙,哎哟!! 谁! 谁! 谁扔砖头上来? 啥? 你扔的? 我废话太多.........,那俺少来两句,继续上菜, 咦好像没啥可说的了,上源程序吧1.;中断部分:2.3.;;;;;;;;;;中断;;;;;;;;4.INTPUT:5.MOV TEMPA, A;6.MOV A,@130;7.MOV TCC,A;255-130=1258.CLR RF;9.;;;;;此处填写250Us处理程序10. BS WKREG,T500US11.;;;;;;;;;;;;;;;;;;;;;;;;;12. DJZ R1MS13.JMP INTEXT;14.MOV A,@415.MOV R1MS,A;重置16. BS WKREG,T1MS17.;;;;;;;此处填写1ms处理程序18.19.;;;;;;;;;;;;;;;;;;;;;;;;;;20. DJZ R20MS21.JMP INTEXT;22.MOV A,@2023.MOV R20MS,A;重置24.;;;此处填写1秒处理程序25. BS WKREG,T20MS26.;;;;;;;;;;;;;;27. DJZ R1S28.JMP INTEXT;29.MOV A,@5030.MOV R1S,A;31.;;;;;;;;;32.INC NUMBER33.MOV A,NUMBER34. SUB A,@1035. JBS SR,236.JMP INTEXT37.MOV A,@038.MOV NUMBER,A39.40.41. INTEXT:42.MOV A,TEMPA;43.RETI;;;;;;;;;;;;;;;;;;;;;44.45.46.47.48.49.;显示部分:50.51.;==============TXDATA==============52.TXDATA:53. BS P5,CC154.MOV A,@855.MOV DATALOP,A;56.TXLOP:57. BC WKREG,T500US58. BS P5,CLK;clk=高59.NOP;60.NOP61. JBS DATA_BUF,762.JMP $+363. BS P5,DATA;64.JMP $+265. BC P5,DATA66.DD1MS: JBS WKREG,T500US67.JMP $-168. BC P5,CLK69. BC WKREG,T500US70. JBS WKREG,T500US71.JMP $-1;72.RLC DATA_BUF73. DJZ DATALOP74.JMP TXLOP75.;;;;;;;;;;76. BC WKREG,T500US77. BS P5,CLK;clk=高78. BC WKREG,T500US79. JBS WKREG,T500US80.JMP $-1;81. BC P5,CLK82.;;;;;;;;83. BC P5,CC184.85.RET;;;;;;;86.87.;数据查表88.;===============DSPTBL============89.DSPTBL: ADD PC,A90. RETL @0B;091. RETL @0B;192. RETL @0B;293. RETL @0B;394. RETL @0B;495. RETL @0B;596. RETL @0B;697. RETL @0B;798. RETL @0B;899. RETL @0B;9100.101.102.;循环体部分;103.104.;;;;;;;;;;主程序;;;;;;;;;;;105.MLOOP:106.MOV A,NUMBER107.CALL DSPTBL108.MOV DATA_BUF,A109.CALL TXDATA110. BC WKREG,T1MS111. JBS WKREG,T1MS112.JMP $-1113.NOP;114.115.JMP MLOOP;;;;;;;;;;;;;;;;;;;;实例2在实际应用中驱动数码管常用的方式分动态扫描和静态驱动。
MAX7219驱动数码管显示程序
}
/*-------------------------------------------------
主函数
-------------------------------------------------*/
#define DisplayTest 0x0f /*显示测试*/
#define ShutdownMode 0x00 /*掉电方式工作*/
#define NormalOperation 0x01 /*正常操作方式*/
#define DecodeDigit 0xff /*译码位数设置*/
#define IntensityGrade 0x01 /*显示亮度级别设置*/ //0-10
#define ScanDigit 0x07 /*扫描位数设置*/
#define TestMode 0x01 /*显示测试方式*/
#define TextEnd 0x00 /*显示测试结束,正常工作*/
void InitDis (void)
{
WriteWord (ScanLimit,ScanDigit); /*设置扫描界限*/
WriteWord (DecodeMode,DecodeDigit); /*设置译码模式*/
WriteWord (Intensity,IntensityGrade); /*设置亮度*/
void WriteWord (unsigned char addr,unsigned char num)
{
dis_LOAD=0;
_nop_();
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//GPIO define
//FUNCTION:用595完成八位数码管显示
-------------------------------------------------------------------------- */
#include <stm32f10x_lib.h> /* STM32F10x Library Definitions */
#include "UET_GPIO.h"
//unsigned
char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e ,0x8c,0xc1,0xce,0x91,0x89,0xc7,0xff};
unsigned char seg[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,0x78,0x5c,0x54,
0x40,0x81,0x88,0x3e,0x70,0x00
} ;
//0,1,2,3,4,5,6,7,8,9,
//A,b,C,d,E,F,P,t,o,n,
//-,~,_,U,r,SP,
//unsigned char DAT[]={0x7f,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选择unsigned char BitSelect_Code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //因为ULN2803驱动反相,所以位码要用共阳极的位码
//COM1 COM2 COM3 COM4 COM5 COM6 COM7 COM8
//
B0 B1 B2 B3 B4 B5 B6 B7
unsigned char Disp_buffer[]={0,1,2,3,4,5,6,7}; //段缓冲区
unsigned char Bit_NO=0 ; // 选择第Bit_NO 位数码管
unsigned char Buffer_NO=0; // 缓冲区的第Buffer_NO
u32 LED_DATA=01234567;
#define SER(x) GPIOA->ODR=(GPIOA->ODR&~GPIO_Pin_7) | (x ? GPIO_Pin_7 : 0)
#define SCK(x) GPIOA->ODR=(GPIOA->ODR&~GPIO_Pin_5) | (x ? GPIO_Pin_5 : 0)
#define RCK(x) GPIOA->ODR=(GPIOA->ODR&~GPIO_Pin_6) | (x ? GPIO_Pin_6 : 0)
/******************************************************************************* * Function Name : void WR_595(unsigned char segdata)
* Description : 595串行输入
* Input : 段码
* Output : None
* Return : None
*******************************************************************************/ void WR_595(unsigned char segdata) //输入一字节数码管数据进595
{
unsigned char i,temp;
temp=segdata;
for(i=0;i<8;i++) //循环移入8位数据,
{
SCK(0);
if(temp&0x80) // 取数码的最高位
SER(1);
else
SER(0);
temp=temp<<1;
SCK(1); //上升沿把一位数据移入595
}
}
/******************************************************************************* * Function Name : void OUT_595(void)
* Description : 595锁存输出
* Input : 段码
* Output : None
* Return : None
*******************************************************************************/ void OUT_595(void) //上升沿将数据送到输出锁存器
{unsigned i;
RCK(0);
for(i=0;i<10;i++) ;
RCK(1);
RCK(0);
}
/******************************************************************************* * Function Name : void LED_Brush(u32 LED_DATA)
* Description : 数码管缓冲数据刷新
* Input : u32 LED_DATA
* Output : None
* Return : None
*******************************************************************************/
void LED_Brush(u32 LED_DATA)
{
Disp_buffer[0]=LED_DATA/1000%10;
Disp_buffer[1]=LED_DATA/100%10;
Disp_buffer[2]=LED_DATA/10%10;
Disp_buffer[3]=LED_DATA%10;
Disp_buffer[4]=LED_DATA/10000000;
Disp_buffer[5]=LED_DATA/1000000%10;
Disp_buffer[6]=LED_DATA/100000%10;
Disp_buffer[7]=LED_DATA/10000%10;
}
/******************************************************************************* * Function Name : void Display(void)
* Description : 显示
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Display(void)
{
LED_Brush(12345678);//调用显示函数
WR_595(BitSelect_Code[Bit_NO]); // 位码
WR_595(seg[Disp_buffer[Buffer_NO]]); //段码
OUT_595();
Bit_NO++;
Buffer_NO++;
if( Buffer_NO>7) Buffer_NO=0;
if(Bit_NO>7)Bit_NO=0;
}。