当前位置:文档之家› 16乘16点阵屏仿真(4个74hc595)+程序

16乘16点阵屏仿真(4个74hc595)+程序

16乘16点阵屏仿真(4个74hc595)+程序
16乘16点阵屏仿真(4个74hc595)+程序

直接上图吧,51控制,4个74hc595连接。,前面的图片是整体的,后面的是局部放大,以免看不清

直接复制代码即可运行

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define NUM 1

#define NUN 9

sbit SH_CP=P2^0;

sbit DS=P2^1;

sbit ST_CP=P2^2;

uchar temp=0x80;

uint tem=0;

uchar code tab[NUN][32]= {

0x10,0x08,0x04,0x3F,0x21,0x21,0x3F,0x21,0x21,0x3F,0x01,0x01,0xFF,0x01,0x01,0x01, //单0x10,0x20,0x40,0xF8,0x08,0x08,0xF8,0x08,0x08,0xF8,0x00,0x00,0xFE,0x00,0x00,0x00,

0x00,0x10,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x20,0x20,0x40, //片0x40,0x40,0x40,0x40,0x40,0xFC,0x00,0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,

0x10,0x11,0x11,0x11,0xFD,0x11,0x31,0x39,0x55,0x55,0x91,0x11,0x11,0x12,0x12,0x14, //机0x00,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x12,0x0E,0x00,

0x20,0x20,0x20,0x20,0xFB,0x20,0x20,0x22,0x22,0x24,0x28,0x20,0x21,0x21,0x22,0x24, //协0x80,0x80,0x80,0x80,0xF0,0x90,0x90,0x98,0x94,0x92,0x92,0x90,0x10,0x10,0x50,0x20,

0x01,0x01,0x02,0x04,0x08,0x30,0xCF,0x00,0x00,0x7F,0x02,0x04,0x08,0x10,0x3F,0x10, //会

0x00,0x00,0x80,0x40,0x20,0x18,0xE6,0x00,0x00,0xFC,0x00,0x00,0x20,0x10,0xF8,0x08,

0x00,0x00,0xFC,0x04,0x05,0x49,0x2A,0x14,0x10,0x28,0x24,0x45,0x81,0x02,0x04,0x08, //欢

0x80,0x80,0x80,0xFC,0x04,0x08,0x40,0x40,0x40,0xA0,0xA0,0x10,0x10,0x08,0x04,0x02,

0x00,0x20,0x13,0x12,0x02,0x02,0xF2,0x12,0x12,0x12,0x13,0x12,0x10,0x28,0x47,0x00, //迎

0x00,0x80,0x3C,0x24,0x24,0x24,0x24,0x24,0x24,0xB4,0x28,0x20,0x20,0x20,0xFE,0x00,

0x08,0x08,0x08,0x11,0x11,0x32,0x34,0x50,0x91,0x11,0x12,0x12,0x14,0x10,0x10,0x10, //你

0x80,0x80,0x80,0xFE,0x02,0x04,0x20,0x20,0x28,0x24,0x24,0x22,0x22,0x20,0xA0,0x40,

0x03,0x1F,0x3C,0x70,0x6E,0xDA,0xD2,0xC0,0xC0,0xC8,0x6C,0x67,0x70,0x38,0x1E,0x07, //笑脸

0xF0,0xFC,0x1E,0x06,0x3B,0x6B,0x4B,0x03,0x03,0x13,0x33,0xE3,0x06,0x0E,0x18,0xF0, };

uchar tab1[NUM][32]={0};

bit account=0;

uchar count=0;

uchar code a[ ]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void delay_ms(unsigned int ms)

{

uchar j;

while(ms--)

for(j=0;j<123;j++);

}

void WriteByte(uchar dat)

{

uchar k;

SH_CP=0;

ST_CP=0;

for(k=0;k<8;k++)

{

DS=dat&0x01;

dat=dat>>1;

SH_CP=1;

_nop_();

_nop_();

SH_CP=0;

_nop_(); }

}

void display(uchar dat[][32])

{ uchar i;

for(i=0;i<16;i++)

{

WriteByte(dat[0][i]);

WriteByte(dat[0][i+16]);

if(i<8)

WriteByte(a[i]);

WriteByte(0xff);

}

else

{

WriteByte(0xff);

WriteByte(a[i-8]);

}

ST_CP=1;

_nop_();

ST_CP=0;

delay_ms(1);

}

}

void zzh() //将移动数据存在缓冲区

{ uchar i;

for(i=0;i<16;i++)

{

if((tab1[0][16+i]&0x80)==0)

{

tab1[0][i]=(tab1[0][i]<<1)&0xfe;

}

else

{

tab1[0][i]=(tab1[0][i]<<1)|0x01;

}

if(((count%16)<8)&&(tem

{

account=tab[tem][i]&temp;

}

else if(((count%16)<16)&&(tem

{

account=tab[tem][16+i]&temp;

}

else

{

account=0;

}

if(account==0)

{

tab1[0][16+i]=(tab1[0][16+i]<<1)&0xfe;

else

{

tab1[0][16+i]=(tab1[0][16+i]<<1)|0x01;

}

}

temp=(temp>>1)&0x7f;

if(temp==0x00)

{

temp=0x80;

}

}

void willseveral() //将缓冲区数都存为0x00 { uchar i,j;

for(i=0;i

for(j=0;j<32;j++)

{

tab1[i][j]=0x00;

}

}

void main()

{

willseveral();

while(1){

display(tab1);

delay_ms(50);

tem=count/16;

zzh();

count++;

if(count==(NUN+1)*16)

{

count=0;

}

}

}

点阵屏的移动显示

点阵屏的移动显示 /*--------16*16点阵屏的移动显示------------*/ #include <reg51.h> #include <intrins.h> #define DATE_OUT P2 //指定P2口做为输出 sbit DATA=DATE_OUT^0; //列数据输出位 sbit SCLH=DATE_OUT^1; //列扫描时钟位 sbit SCLT=DATE_OUT^2; //列数据锁存位 sbit AB =DATE_OUT^3; //行数据输出位 sbit SCK =DATE_OUT^4; //行扫描时钟位 unsigned char date[32];//32字节RAM做为16*16点阵屏显示缓存void display();//做为点阵扫描函数,将显示缓存的数据输出到点阵屏void display_time(unsigned int timer); //指定时间扫描显示

void displaymove(unsigned char *lp,unsigned char c,unsigned char timer);//显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数, //timer是移动的速度 void displaymovetb(unsigned char din,unsigned char *lp,unsigned char timer); //上下移动内容,din:1为向下,0为向上,lp指向要移入的内容,timer为移动速度 void delay(unsigned int a);//延时子函数 //非常好用的字摸软件PCtoLCD2002完美版字模选项:阴码、逐行式、顺向 code unsigned char yu[32]={ 0x00,0x00,0x7E,0xFC,0x02,0x04,0x02,0x04,0x22,0x44,0x12,0x24,0x12,0x 24,0x06,0x04, 0x0A,0x14,0x12,0x24,0x62,0xC4,0x02,0x04,0x02,0x04,0x02,0x04,0x0A,0 x14,0x04,0x08/*"羽",0*/}; code unsigned char yi[32]={ 0x7E,0xF8,0x12,0x48,0x0A,0x28,0x12,0x18,0x22,0x28,0x1F,0xF0,0x11,0x 10,0x1F,0xF0,

利用74HC595实现多位LED显示的方法

1 引言 单片机应用系统中使用的显示器主要有LED和LCD两种。近年来也有用CRT显示的。前者价格低廉,配置灵活,与单片机接口方便;后者可进行图形显示,但接口较复杂,成本也较高。LED(Ling Emiting Diode)是发光二极管的缩写。实际应用非常普遍的是八段LED显示器。LED显示器在大型报时屏幕,银行利率显示,城市霓虹灯建设中,得到广泛应用。在这些需要多位LED显示的场合,怎样实现系统稳定,价格低廉的显示,成为决定其成本的关键所在。 2 74HC595实现LED静、动态显示基本原理 74HC595是美国国家半导体公司生产的通用移位寄存器芯片。并行输出端具有输出锁存功能。与单片机连接简单方便,只须三个I/O口即可。而且通过芯片的Q7引脚和SER引脚,可以级联。而且价格低廉,每片单价为1.5元左右. 2.1 静态显示 每位LED显示器段选线和74HC595的并行输出端相连,每一位可以独立显示(见图1)。在同一时间里,每一位显示的字符可以各不相同(每一位由一个74HC595的并行输出口控制段选码)。 N位LED显示要求N个74HC595芯片及N+3条I/O口线,占用资源较多,而且成本较高。这对于多位LED 显示很不利。 2.2 动态显示

在多位LED显示时,为了简化电路,降低成本,节省系统资源,将所有的N位段选码并联在一起,由一片74HC595控制(见图2)。由于所有LED的段选码皆由一个74HC595并行输出口控制,因此,在每一瞬间,N位LED会显示相同的字符。想要每位显示不同的字符,就必须采用扫描的方法,即在每一瞬间只使用一位显示字符。在此瞬间,74HC595并行输出口输出相应字符段选码,而位选则控制I/O口在该显示位送入选通电平,以保证该位显示相应字符。如此轮流,使每位分时显示该位应显示字符。由于74HC595具有锁存功能,而且串行输入段选码需要一定时间,因此,不需要延时,即可形成视觉暂留效果。 N位LED显示时,只需要一片74HC595即可完成,成本最低。但是,此种方法的最大弱点就是当LED的位数大于12位时,出现闪烁现象,这是所有动态LED显示方式共同的弱点。 3 多位LED显示方法的实现

串口通信之点阵左移

串口通信之点阵左移 (*注:图中各595 的pin10 脚相连接后与+Vcc 相连。)驱动程序可根据本人的16*16 点阵程序改编,另外还有一个本人对程序中显示数据生成函数的解 释资料一并录于此处,也欢迎切磋。语句temp=(h1>(8-tempcol));的设计原理:下面我们以程序进行左移3 位的运算为例解释一下语句temp=(h1>(8-tempcol)); 的设计原理;我们知道,在8 位二进制数据进行运算时,若要将一个3 位的二 进制数据置入另一个8 位二进制数据后3 位的空位中,(注:这里所说的数据置入,是指当一个显示数据显示后,这个数据经左移以后变成了下一个要显示的 新数据,而这个新的数据实际上就是由已显示数据的前7 位与后一个数据的前 1 位数据组合形成的,也就相当与将后面的数据置入了前一个数据。)可以采用的方法不外乎有两个,一个是加入YYYYY000+00000XXX=YYYYYXXX。另 一个方法是按位或,而后一个方法更加直观方便。本语句就是采用了按位或的 方法,详解如下:设寄存器D 中有数据D=0X33=00110011 其左移3 位后D 中的数据改变为10011000 后置入DY(数据移出后寄存器相应位自动清零);设 寄存器C 中有数据C=0XA6=10100110 其右移8-3=5 位后C 中的数据改变为00000101 后置入CY。DY|CY 运算后,结果为10011101 其结果不难看出,相当于将C(0XA6)中的前3 位数据左移进入了DY 的后3 位中。这一算式的设计,是为了适应我们的硬件系统,解决了一个8 位显示数据由当前的8 位锁存 输出芯片(595)进入下一片(595)时能够保持连贯;因为我们的硬件系统的组成为8 位单片机通过级联的8 位数字电路驱动点阵屏,假如我们的硬件无所 不有,那么,我们可以使用16 位的系统驱动16 列的屏,32 位驱动32 列,64 位驱动64 列,128 位。那么我们只要用一句简单的移位语句,即可达到目的,就不必如此费周折了。tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

74HC595工作原理及应用

74HC595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。数据在SCHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能 OE时(为低电平),存储寄存器的数据输出到总线。74HC595各个引脚的功能:Q1~7 是并行数据输出口,即储寄存器的数据输出口Q7' 串行输出口,其应该接SPI总线的MISO接口STcp 存储寄存器的时钟脉冲输入口SHcp 移位寄存器的时钟脉冲输入口OE的非输出使能端MR的非芯片复位端Ds 串行数据输入端程序说明:每当spi_shcp上升沿到来时,spi_ds 引脚当前电平值在移位寄存器中左移一位,在下一个上升沿到来时移位寄存器中的所有位都会向左移一位,同时Q7'也会串行输出移位寄存器中高位的值,这样连续进行8次,就可以把数组中每一个数(8位的数)送到移位寄存器;然后当 spi_stcp上升沿到来时,移位寄存器的值将会被锁存到锁存器里,并从Q1~7引脚输出附子程序: void hc595send_data(uint8 data)//要传输的数据,建议用数组的方法来查询{ uint8 i; IO0CLR = spi_stcp; 12 脚 for(i=0;i<8;i++) { IO0CLR = spi_shcp; 11 脚 if((data&0x80)!=0)IO0SET = spi_ds; else IO0CLR = spi_ds; data <<= 1; IO0SET = spi_shcp; } IO0SET = spi_stcp;} 1 引言 单片机应用系统中使用的显示器主要有LED和LCD两种。近年来也有用CRT 显示的。前者价格低廉,配置灵活,与单片机接口方便;后者可进行图形显示,但接口较复杂,成本也较高。LED(Ling Emiting Diode)是发光二极管的缩写。实际应用非常普遍的是八段LED显示器。LED显示器在大型报时屏幕,银行利率显示,城市霓虹灯建设中,得到广泛应用。在这些需要多位LED显示的场合,怎样实现系统稳定,价格低廉的显示,成为决定其成本的关键所在。 2 74HC595实现LED静、动态显示基本原理 74HC595是美国国家半导体公司生产的通用移位寄存器芯片。并行输出端具有输出锁存功能。与单片机连接简单方便,只须三个I/O口即可。而且通过芯片的Q7引脚和SER引脚,可以级联。而且价格低廉,每片单价为1.5元左右. 2.1 静态显示 每位LED显示器段选线和74HC595的并行输出端相连,每一位可以独立显示。在同一时间里,每一位显示的字符可以各不相同(每一位由一个74HC595的并行输出口控制段选码)。 N位LED显示要求N个74HC595芯片及N+3条I/O口线,占用资源较多,而且成本较高。这对于多位LED显示很不利。 2.2 动态显示 在多位LED显示时,为了简化电路,降低成本,节省系统资源,将所有的N位段选码并联在一起,由一片74HC595控制。由于所有LED的段选码皆由一个74HC595并行输出口控制,因此,在每一瞬间,N位LED会显示相同的字符。想

stm32使用三片74HC595级联程序代码

stm32使用三片74HC595级联程序代码 /**************************************************************** ******** Function: Read_74HC595 Description: 读取n 片74HC595 的输入数据Calls: HC595_delay;GPIO_ResetBits;GPIO_SetBits;Data Accessed: 无Data Updated: 无Input: HC595x:用户使用的595 端口,类型定义在74HC595.h 中ChipNum: 用户使用的595 端口上连接的芯片个数Output: DataBuf: 输出数据 存放缓冲区Return: 无Others: 此模块为Stm32 单片机中使用,调试时在72M 系统时钟下 ******************************************************************** *****/ void Write_74HC595(HC595 HC595x,unsigned char ChipNum,unsigned char *DataBuf){ unsigned char i = 0; unsigned char DataBufTmp = 0; GPIO_ResetBits(HC595x.Lck.Port, HC595x.Lck.Pin); //设置LCK 为低电平,上升 沿数据锁存for(; ChipNum>0; ChipNum--) { DataBufTmp = *DataBuf; for(i=0; itips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

LED点阵显示与C语言编程(精)

一、行扫描静态显示, 用51单片机实现图3静态显示的程序如下: #include #define uchar unsigned char #define uint unsigned int uchar code TAB[]={0x81,0xFD,0xFD,0xC1,0xBF,0xBF,0xBD,0xC3}; uchar i,t; delay(uchar t) { while (t--) {;} } void main(void) { while(1) { P2=0x01; for(i=0;i<8;i++) { P1=TAB[i]; delay(100); P2=P2<<1|P2>>7; } } } 二、行扫描翻页显示 字码取模方式为逐行 第一次从字码数组中取出第1~8个数据置于列上,行扫描顺序为1~8行,显示一帧,第二次取第9~16个数据,行扫描顺序仍为1~8行,显示第二帧,第三次取第17~24个数据,…… 实现图4显示效果的程序如下: /*8X8行扫描,翻页显示*/ #include #define uchar unsigned char #define uint unsigned int uchar code TAB[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //空屏 0xFD,0xF D,0xFD,0xFD,0xFD,0xFD,0xC1,0xFF, //L 0xE3,0xDD, 0xDD,0xDD,0xDD,0xDD,0xE3,0xFF, //O 0xDD,0xD D,0xDD,0xDD,0xDD,0xEB,0xF7,0xFF, //V 0xC1,0

串入并出芯片74HC595应用实例

基于proteus的51单片机仿真实例七十五、串入并出芯片74HC595应用实例 标签: proteus单片机实例芯片应用2010-02-24 00:33 1、本例中利用一片595控制一个数码管显示。实现了利用3个IO口控制8位数据的输出 2、74HC595的控制端口: 1)SH_CP(11脚):移位时钟脉冲输入端。在上升沿时移位寄存器将数据移位 2)DS(14脚):串行数据输入端。本例通过移位运算将每次移位的数据送到PWD寄存器的进位标志位CY,CY再将值传递给DS引脚,8次移位后完成一个字符的串行传送。 3)ST_CP(12脚):锁存脉冲控制端,在上升沿时移位寄存器的数据被传入存储寄存器,这时如果OE端为低电平,传入存储器的数据会直接输出到输出端Q0-Q7。本例在一个字节的移位操作完成后,通过在ST_CP端产生一个上升沿将数据送出。 4)/MR(10脚):低电平时将移位寄存器数据请0.一般情况下接VCC 5)/OE(13脚):高电平时输出端禁止输出(高阻态)。低电平时允许数据输出 使用74HC595的优点是能锁存数据,这样在移位过程中可以保持输出端的数据不变。而 74HC164则没有这种功能。 //利用74HC595实现端口扩展 #include // 寄存器头文件包含 #include // 空操作函数,移位函数头文件包含 sbit SH_CP = P2^0; //移位时钟脉冲端口 sbit DS = P2^1; // 串行数据输入端口 sbit ST_CP = P2^2; //锁存端口 unsigned char temp; unsigned char code disp_buff[] =

74HC595驱动数码管上显示数字

/******************************************************************************* * 标题: 试验74HC595驱动数码管上显示数字(C语言)* 连接方法:JP12用条线冒短接JP3和JP2 用8PIN排线连接 ******************************************************************************** * 通过本例程了解74HC595(串入并出)基本原理和使用* 请学员认真消化本例程,懂74C595在C语言中的操作* ********************************************************************************/ #include #include #define NOP() _nop_() /* 定义空指令*/ //SPI IO sbit MOSIO =P3^4; //串行数据线 sbit R_CLK =P3^5; //数据并行输出控制 sbit S_CLK =P3^6; //串行时钟线 void delay(unsigned int i); //函数声名 void HC595SendData(unsigned char SendV al); //函数声名 // 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20) unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71}; main() { unsigned char HC595SendVal; unsigned int LedNumVal = 1; while(1) { LedNumVal++; HC595SendVal = LED7Code[LedNumV al%16]; //LED7;显示0-F LedNumVal%10 显示0-9 HC595SendData(HC595SendVal); //调用595驱动函数 delay(200); } } /*******************延时函数************/ void delay(unsigned int i) { unsigned int j; for(i; i > 0; i--) //CPU循环执行i*300次 for(j = 300; j > 0; j--);

单片机LED点阵显示方法与程序代码

单片机LED点阵显示方法与程序代码 点阵的接法有共阴和共阳两种(共阳指的是对每一行LED来讲是共阳)。 由于51单片机驱动能力有限,亮度不够,所以一般需要三极管驱动,下图为一个8X8点阵原理图,仅仅是仿真,如果需要接实物的话,加上三极管才足够亮。 显示的方法有两种: 1、逐列扫描方式。如下图所示,P1口输出列码决定哪一列能亮(相当于位码),P2口输出行码(列数据)决定列上哪些LED亮(相当于段码),能亮的列从左向右扫描完8列(相当于位码循环移位8次)即显示出一帧完整的图像。 2、逐行扫描方式,与逐列扫描调换,即P2口输出位码,P1口输出段码,扫描完8行显示出一帧图像。 以逐行扫描为例,从上图可以很明了的知道点阵的显示原理了(红色表示高电平,绿色表示低电平),当把扫描速度加快,人的视觉停留,看见的就是一幅图或一个字了,如下图所示。

一、行扫描静态显示, 用51单片机实现上图静态显示的程序如下: #include #define uchar unsigned char #define uint unsigned int uchar code TAB[]={0x81,0xFD,0xFD,0xC1,0xBF,0xBF,0xBD,0xC3}; uchar i,t; delay(uchar t) { while (t--) {;} } void main(void) { while(1) { P2=0x01; for(i=0;i<8;i++) { P1=TAB; delay(100); P2=P2<<1|P2>>7; } } } 二、行扫描翻页显示 字码取模方式为逐行 第一次从字码数组中取出第1~8个数据置于列上,行扫描顺序为1~8行,显示一帧,第二次取第9~16个数据,行扫描顺序仍为1~8行,显示第二帧,第三次取第17~24个数据,…… 实现图显示效果的程序如下:

51单片机驱动两片74HC595级联动态驱动8位数码管

51单片机驱动两片74HC595级联动态驱动8位数码管 功能: 用2片74HC595驱动8位数码管, 级联的最低1片595控制位选,那么第一片控制段选 平台: STC89C52 现象: 8位数码管从第一位开始从0计数,满10进位 版本说明: 第0版本没有使用定时器中断,同时定义了一个unsigned long int 变量计数,再把这个数的每位分离出来显示,所以导致有点闪屏,此版本使用定时器中断,而且没有用unsigned long int 之类的变量,而是用数组Val[8] 来计数, 主函数只负责显示,其它的在中断函数里面处理,这样显示一点都不闪屏, 备注: 可以用ULN2003A 接在数码管的com 口来提高驱动能力,ULN2003A里面有7个NPN三极管, 可以大大提高驱动能力 #include <> sbit SCK = P1^1; // 数据输入时钟线,脉冲 sbit SI = P1^0; // 数据线 sbit RCK = P1^2; // 锁存 unsigned char code SMG[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 段码 unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选unsigned char Val[8] = {0}; // 要显示的数据 ************************ 函数声明************************ void interrupt_init(void); void timer_init(void); 控制74HC595输出数据 void Output(void) { RCK = 0; RCK = 1; } 向74HC595中写入一字节数据 void Write_Byte(unsigned char dat) { unsigned char i = 0; for(i=0; i<8; i++) { SCK = 0; SI = dat & 0x80;

51单片机 8x8点阵显示程序参考

本程序用的是51单片机控制8*8点阵显示I(心形)U #include #define uint unsigned int #define uchar unsigned char //使用的IO口要根据自己接在单片机里的情况来更改 sbit RCK = P3^6; //声明串行输出存储锁存线RCK sbit SCK = P3^5; //声明串行数据输入时钟线SCK sbit SER = P3^4; //声明串行数据输入线SER sbit HC = P0^0; //声明C信号接口 sbit HB = P0^1; //声明B信号接口 sbit HA = P0^2; //声明A信号接口 #define ROW1 HC = 0; HB = 0; HA = 0; //定义使能第1行#define ROW2 HC = 0; HB = 0; HA = 1; //定义使能第2行#define ROW3 HC = 0; HB = 1; HA = 0; //定义使能第3行#define ROW4 HC = 0; HB = 1; HA = 1; //定义使能第4行#define ROW5 HC = 1; HB = 0; HA = 0; //定义使能第5行#define ROW6 HC = 1; HB = 0; HA = 1; //定义使能第6行#define ROW7 HC = 1; HB = 1; HA = 0; //定义使能第7行#define ROW8 HC = 1; HB = 1; HA = 1; //定义使能第8行

uchar h; //显示数据,可以用取模软件来获取 uchar iloveu[] = { 0x00,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00, 0x00,0x36,0x7F,0x7F,0x3E,0x1C,0x08,0x00, 0x00,0x22,0x22,0x22,0x22,0x22,0x1C,0x00, 0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00, 0x7C,0x08,0x10,0x08,0x04,0x44,0x38,0x00, 0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00, 0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00}; void delay(uint z) //延时函数,单位ms { uint i, j; for(i = z; i > 0; i--) for(j = 110; j > 0; j--); } void ROW() //行驱动函数

51单片机+74HC595驱动数码管程序

51单片机+74HC595驱动数码管程序 这里是电路图:完整的源码和图纸下载地址:51hei/bbs/dpj-20392-1.html 下面是51 单片机驱动74hc595 芯片的程序:#include //包含51 单片机的头文 件#include #define uint unsigned int#define uchar unsigned char//sbit sin_595 =P1;//sbit rclk_595 =P1;//sb it sclk_595 =P1 ;//sbit s_clr =P1;sb it a_cp_595 =P2; //串行移位时钟脉冲sh_cp_595sbit b_cp_595 =P2;//输出锁存器控制脉冲 st_cp_595//sbit _oe_595 =P1 ; //8 位并行输出使能/禁止(高阻态)sbit ds_595 =P2 ; //串行数据输入extern uchar datas[6]; //存放6 个数码管的显示数字uchar ledcode[]={0xC0,// 00xF9,// 10xA4,// 20xB0,// 30x99,// 40x92,// 50x82,// 60xF8,// 70x80,// 80x90,// 90x88,// A0x83,// B0xC6,// C0xA1,// D0x86,// E0x8E// F};void delay(uint z){uint t1,y;for(t1=z;t1>0;t1--)for(y=110;y>0;y--);}void led_display(void){ uchar i,j; bit testb; uchar bdata movebit[6]; uchar bdata test; //_oe_595=0; //选中数码管for(i=0;i<6;i++) movebit[i]=ledcode[datas[i]]; // P1=0; delay(1); for(i=0;i<6;i++) //数据移位{ test=movebit[i]; for(j=0;j<8;j++) { testb=test&0x80; test=test<<1; if(testb) { ds_595=1; } else {ds_595=0; }a_cp_595=1; a_cp_595=0; } //数据移位} b_cp_595=0; b_cp_595=1; b_cp_595=0;} tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

proteus原理图及程序(74HC595级联点亮LED)

#include //51头文件 #include // #define uchar unsigned char #define uint unsigned int //--定义使用的IO口--// sbit DS=P2^1; //串行数据输入 sbit SHCP=P2^0; //移位寄存器时钟输入,为低电平时将595数据清零 sbit STCP=P2^2; //片选,存储寄存器时钟输入,STCP时钟上升沿时,将595数据送入存储寄存器 uchar data adata; void delayms(uint t); void Input(uchar ch); void Output(adata); /******************************************************** * * * 延时子程序* * * *********************************************************/ void delayms(uint t) { uchar i; while(t-->0){ for(i=0;i<125;i++){;}

} } /******************************************************** * * * 输入数据子程序* * * *********************************************************/ void Input(uchar ch) //将显示数据送入74HC595内部移位寄存 { uchar BitCounter=8; //位数控制 uchar tmp; do { tmp=ch; SHCP=0; if((tmp&0x80)==0x80) //如果最高位是1 DS=1; else DS=0; SHCP=1; tmp=ch<<1; //左移 ch=tmp; BitCounter--; _nop_(); STCP=0; } while(BitCounter); } /******************************************************** * * * 输出数据子程序* * * *********************************************************/ void Output(adata) //将移位寄存器内的数据锁存到输出寄存器并显示,adata为输出的数据{ STCP=0; _nop_(); _nop_(); _nop_(); STCP=1; //上升沿将数据送到输出锁存器 _nop_(); _nop_(); _nop_();

74HC595测试程序

//74HC595测试程序,在一个数码管上循环显示1~9. #include #include 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发送到数码管

最新点阵 左移 上移 右移 下移 下拉 等花样显示

#include #define uint unsigned int #define uchar unsigned char #define sudu 20 /***各种声明的声明*****/ sbit LAT_port=P2^0; sbit CLK_port=P2^1; sbit DI_port=P2^2; sbit G_port=P2^3; sbit A_port=P2^4; sbit B_port=P2^5; sbit C_port=P2^6; sbit D_port=P2^7; uchar move; //上移下移用的全局变量 uchar temp; //缓冲用的 uchar han; uchar zi; uchar code ziku[]={ 0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F, 0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/ 0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F, 0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/ 0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0, 0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/ 0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7, 0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00, }; uchar code ziku1[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,

74hc595和74hc165级连c51程序

#include #define uchar unsigned char #define uint unsigned int sbit DS=P1^0 ; //595 sbit SH=P1^1 ; sbit ST=P1^2 ; //sbit MR=P1^3; sbit CLK=P1^4;//165 sbit INH=P1^5; sbit LD=P1^6; sbit SO=P1^7; //msec(511);0.5s //msec(2);2ms //msec(1021);//1s void msec(unsigned long x) //延时{ unsigned char j; while(x!=0) { x--; for(j=0;j<116;j++) {;} } } void hc595(uchar *p,n) { uchar i,j; for(;n>0;n--) { i=*p; for(j=0;j<8;j++) { DS=i&0x80; i=i<<1; SH=0; SH=1; } ST=0;

ST=1; ST=0; p++; } } void hc165(uchar *d,n) { uchar i=0,j,c=0; LD=1; LD=0; LD=1; INH=0; for(j=0;j<(n*8);j++) { CLK=1; i=i<<1; i=i|SO; CLK=0; c++; if(c==8){*d=i;c=0;d++;} } } main() {uchar *P,*D; uchar i,a[5]={0x00,0x00,0x00,0x00,0x01},b[5]={0x0ff,0x0ff,0x0ff,0x0ff,0x0ff}; P=a; D=b; hc595(P,5); hc165(D,5); P3=b[4]; while(1); for(i=0;i<34;i++) { if(i==8){a[3]=0x01; a[4]=0x00;} if(i==16){a[2]=0x01;a[3]=0x00;} if(i==24){a[1]=0x01;a[2]=0x00;} if(i==32){a[0]=0x01;a[1]=0x00;} P=a; hc595(P,5); a[0]<<=1; a[1]<<=1; a[2]<<=1;

点阵屏显示原理及实验详解

标题:LED点阵屏学习攻略共享资料

LED点阵屏学习攻略 在经历了将近一个学期断断续续的点阵屏学习后,最后终于在AVR平台下完成了128*32点阵屏的无闪烁显示。现把整个学习过程总结如下: 无论是51单片机还是AVR单片机,点阵屏的显示原理是一样的,所以首先从51讲起。 说明:以下所有试验如无特殊说明均在Keil uVision3 + Proteus 6.9 SP5下仿真完成。 一.基于51的点阵屏显示:(1)点亮第一个8*8点阵: 1.首先在Proteus下选择我们需要的元件,AT89C52、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-GREEN,MATRIX-8*8-BLUE,MATRIX-8*8-ORANGE ,MATRIX-8*8-RED。 在这里请大家牢记:红色的为上列选下行选;其它颜色的为上行选下列选!而所有的点阵都是高电平选中列,低电平选中行!也就是说如果某一个点所处的行信号为低,列信号为高,则该点被点亮!此结论是我们编程的基础。 2.在选择完以上三个元件后,我们开始布线,具体如下图: 这里P2是列选,P3连接38译码器后作为行选。 选择38译码器的原因:38译码器每次可输出相应一个I/O口的低电平,正好

与点阵屏的低电平选中行相对,并且节省了I/O口,大大方便了我们的编程和以后的扩展。 3.下面让我们把它点亮,先看一个简单的程序: (将奇数行偶数列的点点亮,效果如下图) 下面是源代码: /************8*8LED点阵屏显示*****************/ #include void delay(int z) //延时函数 { int x,y; for(x=0;x

利用74HC595实现多位LED显示的新方法

利用74HC595实现多位LED显示的新方法 摘要:本文介绍了应用移位寄存器芯片74HC595实现LED动、静态显示的基本原理。提出了一种用74HC595实现多位LED显示的新方法。同时对该系统的硬件组成和软件实现作了详细说明。实际应用表明,此方法连线简单方便,成本低廉,可用于24位LED或更多位LED显示。 关键词:LED 74HC595 动态显示静态显示 1 引言 单片机应用系统中使用的显示器主要有LED和LCD两种。近年来也有用CRT显示的。前者价格低廉,配置灵活,与单片机接口方便;后者可进行图形显示,但接口较复杂,成本也较高。LED(Ling Emiting Diode)是发光二极管的缩写。实际应用非常普遍的是八段LED 显示器。LED显示器在大型报时屏幕,银行利率显示,城市霓虹灯建设中,得到广泛应用。在这些需要多位LED显示的场合,怎样实现系统稳定,价格低廉的显示,成为决定其成本的关键所在。 2 74HC595实现LED静、动态显示基本原理 74HC595是美国国家半导体公司生产的通用移位寄存器芯片。并行输出端具有输出锁存功能。与单片机连接简单方便,只须三个I/O口即可。而且通过芯片的Q7引脚和SER引脚,可以级联。而且价格低廉,每片单价为1.5元左右. 2.1 静态显示 每位LED显示器段选线和74HC595的并行输出端相连,每一位可以独立显示(见图1)。在同一时间里,每一位显示的字符可以各不相同(每一位由一个74HC595的并行输出口控制段选码)。 N位LED显示要求N个74HC595芯片及N+3条I/O口线,占用资源较多,而且成本较高。这对于多位LED显示很不利。 2.2 动态显示

两片74HC595级联驱动8个数码管

两片74HC595级联动态驱动8位数码管 51单片机 #include sbit SCK = P1^1; // 数据输入时钟线,脉冲 sbit SI = P1^0; // 数据线 sbit RCK = P1^2; // 锁存 unsigned char code SMG[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 段码 unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选unsigned char Val[8] = {0}; // 要显示的数据 ************************ 函数声明************************ void interrupt_init(void); void timer_init(void); 控制74HC595输出数据 void Output(void) { RCK = 0; RCK = 1; } 向74HC595中写入一字节数据 void Write_Byte(unsigned char dat) { unsigned char i = 0; for(i=0; i<8; i++)

{ SCK = 0; SI = dat & 0x80; SCK = 1; dat <<= 1; } } 显示函数 void Display(unsigned char * p) { unsigned char * pt = Wei; Write_Byte(*(pt+0)); Write_Byte(SMG[*(p+7)]); Output(); Write_Byte(*(pt+1)); Write_Byte(SMG[*(p+6)]); Output(); Write_Byte(*(pt+2)); Write_Byte(SMG[*(p+5)]); Output(); Write_Byte(*(pt+3)); Write_Byte(SMG[*(p+4)]);

相关主题
文本预览
相关文档 最新文档