驱动数码管程序
- 格式:docx
- 大小:13.93 KB
- 文档页数:3
实验四单片机驱动数码管显示一实验目的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;}}}数码管动态显示电路图(位选信号为高电平,段选信号为高电平):。
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。
苦心人,天不负,三千炎黄甲可灭倭苦心人,天不负,三千炎黄甲可灭倭谁也没有权力代表那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字节的命令字。
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在实际应用中驱动数码管常用的方式分动态扫描和静态驱动。
单片机驱动LED数码管电路及编程单片机I/O的应用最典型的是通过I/O口与7段LED数码管构成显示电路,我们从常用的LED显示原理开始,详尽讲解利用单片机驱动LED数码管的电路及编程原理,目的在于通过这一编程范例,让初学者了解I/O口的编程原理,意在起举一反三,抛砖引玉的作用。
左图为实验电路图,我们使用80C51单片机,电容C1、C2和CRY1组成时钟振荡电路,这部分基本无需调试,只要元件可靠即会正常起振。
C3和R1为单片机的复位电路,80C51的并行口P1.0-P1.7直接与LED数码管的a-f引脚相连,中间接上限流电阻R3-R10。
值得一提的是,80C51并行口的输出驱动电流并非很大,为使LED有足够的亮度,LED数码管应选用高亮度的器件。
此外,图中的80C51还可选用C51系列的其它单片机,只要它们的指令系统兼容C51即可正常运行,程序可直接移植,例如选用低价Flash型的AT89C1051或2051(详细技术手册)等,它们的ROM可反复擦写,非常适合作实验用途。
程序清单:01 START: ORG 0100H ;程序起始地址02 MAIN: MOV R0,#00H ;从“0”开始显示03 MOV DPTR,#TABLE ;表格地址送数据指针04 DISP: MOV A,R0 ;送显示05 MOVC A,@A+ADPTR ;指向表格地址06 MOV P1,A ;数据送LED07 ACALL DELAY ;延时08 INC R0 ;指向下一个字符09 CJNE R0,#0AH,DISP ;未显示完,继续10 AJMP MAIN ;下一个循环11 DELAY: MOV R1,#0FFH ;延时子程序,延时时间赋值12 LOOP0: MOV R2,#0FFH13 LOOP1: DJNZ R2,LOOP114 DJNZ R1,LOOP015 RET ;子程序返回16 TABLE: DB 0C0H ;字型码表17 DB 0F9H18 DB 0A4H19 DB 0B0H20 DB 99H21 DB 92H22 DB 82H23 DB 0F8H24 DB 80H25 DB 90H26 END ;程序结束。
电子世界2003年11期35・・相约单片机图1图2现在驱动LED数码管流行采用单片机设计电路,但发现一些显示(LED数码管)电路设计复杂,没有充分利用单片机的电气特点、没有采用“硬件软化”的方法。
这里向大家介绍几种89C2051驱动LED数码管的方法,并附软件,可直接移植到其它电路中使用。
1.直接驱动5位LED数码管(1)由于89C2051的I/O脚吸入电流可达20mA,故可直接驱动LED数码管,但LED数码管必须采用高亮、共阴型。
由P1口输出段码,P3口输出位选码。
R1~R8为LED数码管提供工作电流(电路见图1)。
(2)在89C2051的RAM中建一个5字节的数码管缓存区,将每一个数码管要显示的数字存入。
输出时采用查表法,将数字对应的段码值送到P1口;位选信号输出,采用直接位寻址方式(程序见本刊网站上的附1)。
2.驱动8位LED数码管(1)在电路中添加一片74LS164串入并出的锁存器,用于锁存输出的段码,R1~R8是限流电阻(电路见图2)。
(2)此软件与附1(见本刊网站)基本相同,只是在段码输出时,要做一段模拟串口发送程序,将段码串行输入到74LS164中(程序见本刊网站上的附2)。
89C2051驱动LED数码管的方法・李 杰・3.驱动24位LED数码管(1)电路使用了3片74LS164(HC164)做位选码输出用,共可驱动8×3=24位,段码由P1口输出。
74LS164的驱动电流可达20mA,可直接驱动LED数码管(电路见图3)。
(2)此时89C2051的绝大部分时间被扫描LED数码管的程序所占用,胜任其它费时的操作已不可能,否则LED数码管会闪烁。
要确保主程序的执行周期<20ms(程序见本刊网站上的附3)。
4.LED数码管的亮度控制LED数码管的亮度控制非常重要,它直接影响LED数码管的使用寿命。
如果采用硬件控制,则电路复杂。
可采用“硬件软化”的方法,由软件控制(程序见本刊网站上的附3)。
说明:本程序配合电路为:使用STC89C52、2个74hc138和1个74hc164完成16位数码管的检测任务。
其中74HC164完成数码管段码的输出,2个74HC138完成16个数码管位码的选择。
/*********************************接线关系:P0.0---164(P1、P2) DATP0.1---164(P8) CLKP0.2---138a(P6)GP2.3---138b(P6)G特别说明:本程序位码表所对应74hc138(a、b、c)接线为:P2.2---138(P1) aP2.1---138(P2) bP2.0---138(P3) C*****************************************************/c语言程序如下:#include <reg52.h>#include <absacc.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ON 0#define OFF 1sbit DAT_164=P0^0;sbit CLK_164=P0^1;sbit G_138a=P0^2;sbit G_138b=P2^3; //数码管显示开关uchar code seg[]={ //七段码表0x3f,0x06,0x5b,0x4f,0x66,0x6d, //0-5 00H-05H0x7d,0x07,0x7f,0x6f,0x77,0x7c, //6-b 06H-0BH0x39,0x5e,0x79,0x71,0x40,0x46, //c- -1 0CH-11H0x76,0x00,0x80,}; //H 全灭 . 12H-16Hunsigned char code wma3[]={0x00,0x04,0x02,0x06,0x01,0x05,0x03,0x07}; //此为位码表对应于138a-P2.2;138b-P2.1;138c-P2.0。
//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;
}。