74HC595测试程序
- 格式:doc
- 大小:23.00 KB
- 文档页数:2
74HC驱动程序#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit SDA = P1^0;sbit SHIFT_CP = P1^1;sbit ST_CP = P1^2;#define NOP _nop_()uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void disp(uint var,uchar rol,uchar pot); void InitSerialPort(void){SDA = 0;SHIFT_CP = 0;ST_CP = 0;}void SerialSendData(uint dat){uchar ii;uint sdata=dat;for(ii=0;ii<16;ii++){if(sdata&0x8000)SDA=1;else SDA = 0;sdata<<=1;SHIFT_CP =0;NOP;NOP;SHIFT_CP = 1;NOP;NOP;}ST_CP = 1;NOP;NOP;ST_CP = 0;}void disp(uint var,uchar rol,uchar pot) {unsigned int dx;uchar a=var/1000;uchar b=(var%1000)/100;uchar c=(var%100)/10;uchar d=var%10;if(rol==0){InitSerialPort();dx=wei[0];if(pot==0){dx=((dx<<8)|duan[a]&0x7f);}else{dx=((dx<<8)|duan[a]);}SerialSendData(dx);dx=wei[1];if(pot==1){dx=((dx<<8)|duan[b]&0x7f);}else{dx=((dx<<8)|duan[b]);}SerialSendData(dx);dx=wei[2];if(pot==2){dx=((dx<<8)|duan[c]&0x7f);}else{}SerialSendData(dx);dx=wei[3];if(pot==3){dx=((dx<<8)|duan[d]&0x7f);}else{dx=((dx<<8)|duan[d]);}SerialSendData(dx);}else if(rol==1){InitSerialPort();dx=wei[4];if(pot==0){dx=((dx<<8)|duan[a]&0x7f);}else{dx=((dx<<8)|duan[a]);}SerialSendData(dx);dx=wei[5];if(pot==1){dx=((dx<<8)|duan[b]&0x7f);}else{dx=((dx<<8)|duan[b]);}SerialSendData(dx);dx=wei[6];if(pot==2){dx=((dx<<8)|duan[c]&0x7f);}else{}SerialSendData(dx);dx=wei[7];if(pot==3){dx=((dx<<8)|duan[d]&0x7f);}else{dx=((dx<<8)|duan[d]);}SerialSendData(dx);}}void main(){while(1){disp(1234,0,0);disp(5678,1,0);}}。
74HC595按键显示程序#include<reg51.h>#include<intrins.h>sbit DS=P1^1;sbit SH_CP=P1^2;sbit ST_CP=P1^3;sbit K1=P1^4;sbit K2=P1^5;sbit K3=P1^6;sbit K4=P1^7;unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6}; unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7};char num1,num2,num3,num4,su,D,C,num_1,num_2;int A;void delay(int x)//延时{int a,b;for(a=0;a<=x;a++)for(b=0;b<=110;b++);}void num_in(char su)//数据输入{int j;for(j=0;j<8;j++){SH_CP=0;DS=su&0x80;su<<=1;SH_CP=1;_nop_();}}void num_out()//数据输出{ST_CP=0;ST_CP=1;_nop_();}void display()//显示子程序{num_in(wei[0]);num_in(duan[num_1]);num_out();delay(3);num_in(wei[1]);num_in(duan[num_2]);num_out();delay(3);num_in(wei[2]);num_in(duan[num3]);num_out();delay(3);num_in(wei[3]);num_in(duan[num4]);num_out();delay(3);}void display_1()//显示子程序1 {num_in(wei[0]);num_in(duan[num1]);num_out();delay(3);num_in(wei[1]);num_in(duan[num2]);num_out();delay(3);num_in(wei[2]);num_in(duan[num3]);num_out();delay(3);num_in(wei[3]);num_in(duan[num4]);num_out();delay(3);}void menu()//菜单程序0~9{switch(D){case 1: {num_1=10; num_2=10; num3=1; num4=11;};break;case 2: {num_1=10; num_2=10; num3=2; num4=11;};break;case 3: {num_1=10; num_2=10; num3=3; num4=11;};break;case 4: {num_1=10; num_2=10; num3=4; num4=11;};break;case 5: {num_1=10; num_2=10; num3=5; num4=11;};break;case 6: {num_1=10; num_2=10; num3=6; num4=11;};break;case 7: {num_1=10; num_2=10; num3=7; num4=11;};break;case 8: {num_1=10; num_2=10; num3=8; num4=11;};break;case 9: {num_1=10; num_2=10; num3=9; num4=11;};break;case 0: {num_1=10; num_2=10; num3=0; num4=11;};break;}}void xiugai() //修改按键{if(K2==0){delay(3);if(num1==10)num1=0;if(K2==0)num1++;while(!K2)display();}}void tuichu(){if(K1==0){delay(3);if(K1==0)A=!A;while(!K1)display();}}void shezhi() //设置按键{while(K1==1){int c,d;for(c=0;c<20;c++){xiugai();display_1();}for(d=0;d<20;d++){xiugai();display();}}}void xianshi()//显示按键{if(K1==0){delay(3);if(K1==0){while(K4==1)display_1();}while(!K1)display();}}unsigned char keyuse()//按键程序{if(K1==0){delay(3);if(K1==0)A=!A;while(!K1)display();}if(K2==0){delay(3);if(K2==0);while(!K2)display();}if(K3==0){delay(3);if(K3==0)shezhi();while(!K3)display();}if(K4==0){delay(3);if(K4==0){if(D==10)D=0;menu();D++;}while(!K4)display();}}void main()//主程序{while(1){keyuse();display();xianshi();}}。
输出第8位的位码,紧接着输出该位要显示的段码,然后使LATCH由0跳变到1使74HC595锁存并输出数据,此时第8位将显示,其它位全部都不显示。
延时一段时间。
如此循环往复,实现8位数码管显示的效果。
四、操作步骤:(1)按照IAR MSP430 项目建立与JTAG仿真设置所讲方法建立名称为M13x LED 595的项目。
(2)将如下程序拷贝粘贴到main.c文件中。
//*******************************************************************************//// 描述; 在TY-DIS1(8位数码管显示模块)上动态扫描显示 4321// ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k//// 硬件连接:如下图// MSP430F13x// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P5.0|-->LED_DOUT// | P5.2|-->LED_CLK// | P5.4|-->LED_LATCH//// 时间:2007年10月// //// 硬件电路:MSP430F135核心实验板-I型+ TY-DIS1(8位数码管显示模块)// 硬件连接://// 调试器:MSP430FET全系列JTAG仿真器// 调试软件: IAR Embedded Workbench Version: 3.41A 编译//******************************************************************************#include <msp430x13x.h>//4位LED数码管显示子程序void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//74HC595串行输出子程序void Led_out(unsigned char X);//LED数码管段码转换表const unsigned char LED_0_F[];void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdogP5DIR =0; //P5口全部设为输入口P5SEL =0; //将P5口所有的管脚设置为一般I/O口//将P5.0 P5.2 P5.4设置为输出方向P5DIR |= BIT0;P5DIR |= BIT2;P5DIR |= BIT4;for (;;){LED_595(4,3,2,1);//调用显示子程序(改变参数表,改变显示内容)}}//------------------------------------------------------// 4位LED数码管显示子程序//// 人口参数:SMG1,SMG2,SMG3,SMG4——待显示的数据//void LED_595(char SMG1,char SMG2,char SMG3,char SMG4){char z;//最高位(最左侧)LED数码管显示---------------------z = LED_0_F[SMG1];Led_out(z); //段码输出z = 0xFE; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次高位(左数第2个)LED数码管显示---------------------z = LED_0_F[SMG2];Led_out(z); //段码输出z = 0xFD; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次低位(左数第3位)LED数码管显示---------------------z = LED_0_F[SMG3];Led_out(z); //段码输出z = 0xFB; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//最低位(左数第4位)LED数码管显示---------------------z = LED_0_F[SMG4];Led_out(z); //段码输出z = 0xF7; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)}//------------------------------------------------------// 用于74HC595的LED串行移位子程序//// 人口参数:X——待输出的数据//void Led_out(unsigned char X){unsigned char i;。
74HC595串行动态数码管显示与X5045操作示例2007-3-7 11:18:00推荐;晶振工作在11.059200M赫兹;单片机为89C51;$NOMOD51;$INCLUDE (AT89X52.H);******************************************************************* ;资源定义RCLK_595 EQU P2.1 ;上升沿时移位寄存器的数据进入数据存储寄存器SRCLK_595 EQU P2.2 ;上升沿时数据寄存器的数据移位SER_595 EQU P2.3 ;串行数据输入端X5045_CS EQU P1.0 ;用于给出X5045的CS信号X5045_SCK EQU P1.1 ;用于给出X5045的SCK信号X5045_SI EQU P1.2 ;用于给出X5045的SI信号X5045_SO EQU P1.3 ;用于给出X5045的SO信号RUN_LED EQU P1.5 ;用于控制指示灯亮灭DISP_START EQU 40H ;40-47H是显示缓冲区,存放8个有效数据DSEG AT 20H;DISP_BUFFER_START DATA 57H ;存放显示缓冲区首地址DISP_P DATA 58H ;存放显示指针,012345 67DISP_CTRL DATA 59H ;存放显示位码LED_DELAY DATA 60H ;LED闪烁的延时计数器LED_DELAY_VALUE EQU 0FFH ;LED闪烁的延时计数器值;******************************************************************* ;******************************************************************* ;中断入口CSEGORG 0000HJMP START;******************************************************************* ;主程序ORG 0033HSTART:MOV R7,#00HDJNZ R7,$ ;延时MOV SP,#65H ;堆栈初始化为60HLCALL SYS_INIT ;系统初始化MOV LED_DELAY,#LED_DELAY_VALUE ;LED闪烁计数器赋初值;MOV DISP_BUFFER_START,#DISP_START ;显示第一组数据MOV DISP_P,#0 ;显示第一个数据MOV DISP_CTRL,#01111111B ;显示最高位;MOV BUFFER_P,#BUFFER_START ;初始化接收缓冲区指针;主循环MAIN_LOOP:DJNZ LED_DELAY,MAIN_LOOP_NEXT2CPL RUN_LED ;指示灯闪烁,表示正常运行MOV LED_DELAY,#LED_DELAY_VALUEMAIN_LOOP_NEXT2:;显示1MOV R1,#8MOV R0,#DISP_STARTMOV A,#01H ;1INIT_DISP_BUFFER1:MOV @R0,AINC R0DJNZ R1,INIT_DISP_BUFFER1SETB TR1DISP_1_1:CALL DISPJNB TF1,DISP_1_1CLR TF1DISP_1_2:CALL DISPJNB TF1,DISP_1_2CLR TF1DISP_1_3:CALL DISPJNB TF1,DISP_1_3CLR TF1DISP_1_4:CALL DISPJNB TF1,DISP_1_4CLR TF1DISP_1_5:CALL DISPJNB TF1,DISP_1_5CLR TF1DISP_1_6:CALL DISPJNB TF1,DISP_1_6CLR TF1CLR TR1;显示2MOV R1,#8MOV R0,#DISP_STARTMOV A,#02H ;1INIT_DISP_BUFFER2:MOV @R0,AINC R0DJNZ R1,INIT_DISP_BUFFER2SETB TR1DISP_2_1:CALL DISPJNB TF1,DISP_2_1CLR TF1DISP_2_2:CALL DISPJNB TF1,DISP_2_2CLR TF1DISP_2_3:CALL DISPJNB TF1,DISP_2_3CLR TF1CLR TR1JMP MAIN_LOOP;******************************************************************* ;******************************************************************* ;系统初始化程序SYS_INIT:MOV R0,#00HSYS_INIT_LOOP:MOV R1,#00HDJNZ R1,$DJNZ R0,SYS_INIT_LOOP ;延时0.13S;内部RAM(30H-5fH)清零MOV R1,#30HMOV A,#0ZERO_LOOP: MOV @R1,AINC R1CJNE R1,#60H,ZERO_LOOP;显示缓冲区初始化MOV R1,#8MOV R0,#DISP_STARTMOV A,#01H ;1INIT_DISP_BUFFER:MOV @R0,AINC R0DJNZ R1,INIT_DISP_BUFFER;禁止各中断MOV IE,#00HMOV IP,#00H;****************************;x5045初始化;x5045引脚输入输出初始化;????LCALL WRITE_06H ;向X5045写入WREN指令(写允许)MOV R0,#00H;1.4S复位LCALL WRITE_01H ;将R0的内容(00H)写入X5045状态寄存器LCALL WRITE_04H ;向X5045写入WRDI指令(写禁止);****************************;****************************;串行口初始化;定时器1产生波特率,方式2;MOV TMOD,#00100000BMOV TMOD,#00010000B ;方式1,16位定时器模式;串口方式3,11位,附加位作为奇偶校验位MOV SCON,#11000000B;SMOD=0ANL PCON,#01111111B;MOV TL1,#0FDH ;波特率9600;MOV TH1,#0FDH ;自动装载值MOV TL1,#LOW(65536 - 65536) ;60MSMOV TH1,#HIGH(65536 - 65536);SETB REN ;允许接收;SETB TR1 ;启动定时器1;*******************************ret;******************************************************************** ******;******************************************************************* ;******************************************************************* ;8位共阴极动态数码管显示扫描子程序DISP: MOV R5,DISP_CTRLCALL WRITE8_595 ;写入位码MOV A,#DISP_START ;显示缓冲区首地址ADD A,DISP_P ;加上缓冲区偏移MOV R0,AMOV A,@R0;转换为显示码MOV DPTR,#TABMOVC A,@A+DPTRMOV R5,ACALL WRITE8_595 ;写入段码;上升沿移位寄存器的数据进入数据存储寄存器CLR RCLK_595NOPSETB RCLK_595MOV A,DISP_CTRLCJNE A,#0FEH,FLASH_DISP;显示到最右那一位则重新循环显示MOV DISP_CTRL,#01111111BMOV DISP_P,#0JMP DISP_RETURNFLASH_DISP:;刷新位码和显示指针RR AMOV DISP_CTRL,AMOV A,DISP_PINC AMOV DISP_P,ADISP_RETURN:RET;******************************************************************* ;******************************************************************* ;向74HC595写入8位数据,低位在前;入口:R5存放8位要写入的数据;注意:但是数据并没有从移位寄存器的数据进入数据存储寄存器,调用它的程序需处理; 初始时引脚状态无影响WRITE8_595:MOV A,R5MOV R5,#8WRITE8_595_LOOP:RRC AMOV SER_595,CCLR SRCLK_595NOPSETB SRCLK_595 ;移位数据,上升沿数据移位DJNZ R5,WRITE8_595_LOOPRET;*******************************************************************TAB: DB 3FH,06H,5BH,4FH,66H ;共阴极数码管显示码 DB 6DH,7DH,07H,7FH,6FH;******************************************************************* ;******************************************************************** ******;******************************************************************** ******;功能:X5045内置看门狗复位;******************************************************************** *******WDT_RST: CLR X5045_CSNOPNOPSETB X5045_CSNOPRET;******************************************************************** ******;******************************************************************** ******;功能:向X5045的SPI接口发送8位数据;入口参数:待发送数据在A中;占用:A,R0,R1;******************************************************************** *******SPI_WRITE8: MOV R7,#08HNEXT0466: RLC AMOV X5045_SI,CNOPNOPSETB X5045_SCKNOPNOPCLR X5045_SCKDJNZ R7,NEXT0466RET;******************************************************************** ******;功能:向X5045写入WREN指令(写允许);******************************************************************** *******WRITE_06H: MOV A,#06HCLR X5045_SCKCLR X5045_CSLCALL SPI_WRITE8SETB X5045_CSRET;******************************************************************** ******;功能:向X5045写入WRDI指令(写禁止);******************************************************************** *******WRITE_04H: MOV A,#04HCLR X5045_SCKCLR X5045_CSLCALL SPI_WRITE8SETB X5045_CSRET;******************************************************************** ******;功能:将R0的内容写入X5045状态寄存器;******************************************************************** *******WRITE_01H: MOV A,#01HCLR X5045_SCKCLR X5045_CSLCALL SPI_WRITE8MOV A,R0LCALL SPI_WRITE8SETB X5045_CSRET;******************************************************************** *******END。
74HC595芯片中文资料8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。
三态。
特点8位串行输入8位串行或并行输出存储状态寄存器,三种状态输出寄存器可以直接清除100MHz的移位频率输出能力并行输出,总线驱动串行输出;标准中等规模集成电路应用串行到并行的数据转换Remote control holding register.描述595是告诉的硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SCHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
参考数据符号参数条件TYP单位HC HCtt PHL/t PLH传输延时SHcp到Q7’STcp到Qn MR到Q7’C L=15pFVcc=5V161714212019NsNsNsf max STcp到SHcp最大时钟速度10057MHzC L输入电容Notes 1 3.53.5pF C PD Power dissipation Notes2 115 pFC PD 决定动态的能耗,P D =C PD ×V CC ×f 1+∑(C L ×V CC 2×f 0)F 1=输入频率,C L =输出电容 f 0=输出频率(MHz ) Vcc=电源电压 引脚说明 符号 引脚 描述 Q0…Q7 15, 1, 7 并行数据输出 GND 8 地Q7’ 9 串行数据输出 MR 10 主复位(低电平) SH CP11移位寄存器时钟输入ST CP12存储寄存器时钟输入OE13 输出有效(低电平) D S14串行数据输入capacitance per package.130V CC16 电源功能表输入输出功能SH CP ST CP OE MR D S Q7’Q n××L ↓×L NC MR为低电平时紧紧影响移位寄存器×↑L L ×L L 空移位寄存器到输出寄存器××H L ×L Z 清空移位寄存器,并行输出为高阻状态↑×L H H Q6’NC 逻辑高电平移入移位寄存器状态0,包含所有的移位寄存器状态移入,例如,以前的状态6(内部Q6”)出现在串行输出位。
74HC595芯片资料8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。
三态。
特点8位串行输入8位串行或并行输出存储状态寄存器,三种状态输出寄存器可以直接清除100MHz的移位频率输出能力并行输出,总线驱动串行输出;标准中等规模集成电路应用串行到并行的数据转换Remote control holding register.#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit stcp1=P2^2;sbit ds1=P2^1;sbit shcp1=P2^0;sbit stcp2=P2^5;sbit ds2=P2^4;sbit shcp2=P2^3;uchar code DAT[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴数码管显示码uchar code tab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};uchar code wei[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff}; void delay(uint ms){uint x,y;for(x=ms;x>0;x--)for(y=255;y>0;y--);}void QR0_5951(uchar num1){uchar j;for (j=0;j<8;j++){num1=num1<<1 ;ds1=CY;shcp1=1;//上升沿发生移位// shcp1=0;}}void OUT_5951()//将移位寄存器内的数据锁存到输出寄存器并显示{stcp1=0;stcp1=1;//上升沿将数据送到输出锁存器stcp1=0;}void QR1_5952(uchar num2){uchar j;for (j=0;j<8;j++){num2=num2<<1 ;ds2=CY;shcp2=1;//上升沿发生移位// shcp2=0;}}void OUT_5952()//将移位寄存器内的数据锁存到输出寄存器并显示{stcp2=0;stcp2=1;//上升沿将数据送到输出锁存器stcp2=0;}void main(){uchar i;while(1){for(i=0;i<2;i++){QR0_5951(DA T[0]);OUT_5951();QR1_5952(wei[i]);OUT_5952();delay(1);}}}描述595是高速的硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
输出第8位的位码,紧接着输出该位要显示的段码,然后使LATCH由0跳变到1使74HC595锁存并输出数据,此时第8位将显示,其它位全部都不显示。
延时一段时间。
如此循环往复,实现8位数码管显示的效果。
四、操作步骤:(1)按照IAR MSP430 项目建立与JTAG仿真设置所讲方法建立名称为M13x LED 595的项目。
(2)将如下程序拷贝粘贴到main.c文件中。
//*******************************************************************************//// 描述; 在TY-DIS1(8位数码管显示模块)上动态扫描显示 4321// ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k//// 硬件连接:如下图// MSP430F13x// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P5.0|-->LED_DOUT// | P5.2|-->LED_CLK// | P5.4|-->LED_LATCH//// 时间:2007年10月// //// 硬件电路:MSP430F135核心实验板-I型+ TY-DIS1(8位数码管显示模块)// 硬件连接://// 调试器:MSP430FET全系列JTAG仿真器// 调试软件: IAR Embedded Workbench Version: 3.41A 编译//******************************************************************************#include <msp430x13x.h>//4位LED数码管显示子程序void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//74HC595串行输出子程序void Led_out(unsigned char X);//LED数码管段码转换表const unsigned char LED_0_F[];void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdogP5DIR =0; //P5口全部设为输入口P5SEL =0; //将P5口所有的管脚设置为一般I/O口//将P5.0 P5.2 P5.4设置为输出方向P5DIR |= BIT0;P5DIR |= BIT2;P5DIR |= BIT4;for (;;){LED_595(4,3,2,1);//调用显示子程序(改变参数表,改变显示内容)}}//------------------------------------------------------// 4位LED数码管显示子程序//// 人口参数:SMG1,SMG2,SMG3,SMG4——待显示的数据//void LED_595(char SMG1,char SMG2,char SMG3,char SMG4){char z;//最高位(最左侧)LED数码管显示---------------------z = LED_0_F[SMG1];Led_out(z); //段码输出z = 0xFE; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次高位(左数第2个)LED数码管显示---------------------z = LED_0_F[SMG2];Led_out(z); //段码输出z = 0xFD; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次低位(左数第3位)LED数码管显示---------------------z = LED_0_F[SMG3];Led_out(z); //段码输出z = 0xFB; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//最低位(左数第4位)LED数码管显示---------------------z = LED_0_F[SMG4];Led_out(z); //段码输出z = 0xF7; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)}//------------------------------------------------------// 用于74HC595的LED串行移位子程序//// 人口参数:X——待输出的数据//void Led_out(unsigned char X){unsigned char i;。
74HC595 74HC165程序例子(AVR)2008年03月13日星期四 10:50硬件说明:ATmega48/88/168的PB5是SPI时钟输出,接74HC595/74HC165的移位时钟输入端;PB4是SPI的MISO数据输人,接74HC165的数据输出;PB3是SPI的MOSI数据输出,接74HC595的串行数据输入端SER;PB2接74HC595/74HC165的锁存时钟输入端。
程序1:本例子是用硬件SPI接口循环发送一个变量到74HC595,并且在数据发送完毕后通过单片机的另外一个IO接口PB2输出一个“锁存”脉冲,使74HC595把移位寄存器的数据输出到锁存寄存器,并驱动8个LED输出,实现来回流水的效果。
//本程序在M8 V2.0 实验板通过// CodeWizard AVR V1.25.1// // 程序设计: CC#include#include#includevoid main(void){unsigned char data=1 , sign=1;PORTB=0;DDRB=0;PORTB|=0b00000100; //空闲时PB2=1是为了兼容74HC165,因为锁存时钟=1时74HC165才允许读数据DDRB|= 0b00101100; //PB口的2/3/5使能输出,其它口不变SPCR=80; //SPI初始化/高位先输出/空闲时时钟=0,数据=0/4分频/数据在时钟上升沿有效/主机while(1){spi(data); //输出data数据,本函数采样查询方式发送,直到数据发送完毕才运行下一条语句PORTB.2=0; PORTB.2=1; //74HC595移位寄存器的数据在锁存时钟上升沿时传送到锁存寄存器delay_ms(1000);if(data==1) sign=1; //记录顺序流水if(data==128) sign=0; //记录倒序流水if(sign) data<<=1; else data>>=1; //如果顺序流水数据就左移一位,否则数据就右移一位}}//end程序2:本程序利用硬件SPI连接74HC165采集8个按键信息,并且由75HC595驱动8个LED把按键的信息显示出来//本程序在M8 V2.0 实验板通过// CodeWizard AVR V1.25.1// // 程序设计: CC#include#include#includevoid main(void){unsigned char data=0 , x;PORTB=0;DDRB=0;PORTB|=0b00000100; //空闲时PB2=1是为了兼容74HC165,因为锁存时钟=1时74HC165才允许读数据DDRB|= 0b00101100; //PB口的2/3/5使能输出,其它口不变SPCR=80; //SPI初始化/高位先输出/空闲时时钟=0,数据=0/4分频/数据在时钟上升沿有效/主机while(1){x=spi(data); //输出data数据到74HC595,同时读取74HC165的数据,保存在变量xPORTB.2=0; PORTB.2=1; //刷新74HC595/74HC165的数据data=x;}}//end程序3:本程序把读74HC165和写74HC595分别写成一个函数,使用更方便#include#include <595-165.h>#includevoid main(void){spiinit(); //spi初始化while(1){unsigned char data,i;data=read165(); //通过硬件SPI读取74HC165的数据if(data==254) i+=1;write595(i); //通过硬件SPI把数据写入74HC595delay_ms(100);}}//end下面是头文件"595-165.h"的内容//定义一个全局变量来记忆最后一次写入74HC595的数据//目的是读74HC165时保持74HC595的数据不发生改变//变量名复杂一点目的是避免和其它变量混淆unsigned char DATA_74HC595_74HC165;void spiinit(void) //spi初始化{PORTB&=0b11000011;DDRB|= 0b00101100;SPCR=80;}void write595(unsigned char LED_DATA) //写数据到74HC595函数{SPDR=LED_DATA; //开始发送数据while((SPSR>>7)==0); //等待发送接收结束DATA_74HC595_74HC165=LED_DATA; //记忆最后一次发送的数据LED_DATA=SPDR; //读,是为了清零中断标志PORTB&=251; PORTB|=4; //PB2输出一个负脉冲,刷新74HC595的数据}unsigned char read165(void) //读74HC165函数{PORTB&=251; PORTB|=4; //PB2输出一个负脉冲,刷新74HC165的数据SPDR=DATA_74HC595_74HC165; //载入74HC595最后一次的数据,目的是读取74HC165 while((SPSR>>7)==0); //等待发送接收结束return SPDR; //返回值是SPI接收到74HC165的数据。
//74HC595测试程序,在一个数码管上循环显示1~9.
#include <reg51.h>
#include <intrins.h>
sbit sdat=P2^0; //串行数据输入端
sbit sclk=P2^1; //移位寄存器时钟输入端
sbit srck=P2^3; //存储寄存器时钟输入
sbit srst=P2^4; //主复位端,低电平复位
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90}; //共阳极编码
void delay(unsigned int z ) {
unsigned char x;
while(z--) //1ms延时程序
for(x=120;x>0;x--);
}
void txdbyte(unsigned char dat)
{
unsigned char i,j;
j=dat; //74HC595的数据串入并出子程序
for(i=0;i<8;i++)
{
sdat=(bit)(j&0x80); //从最高位开始传送
sclk=0; //发送一个上升沿信号,告诉对方读取数据发送线上的数据线
sclk=1; //锁存到移位寄存器
j<<=1;
}
srck=0; //锁存到输出并口
srck=1;
}
void main()
{ unsigned char i;
srst=0; //先复位
delay(2);
srst=1; //复位完毕
while(1)
for(i=0;i<10;i++)
{
txdbyte(~table[i]); //将0~9发送到数码管
delay(1000); //1秒钟发送一次}
}。