完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
`原理图都已经发上去了。。。下面是程序 /*16*16点阵屏的显示*/ #include #include #define DATAOUT P2 //指定P2口做为输出 ***it DATA=DATAOUT^0; //列数据输出位 ***it SCLH=DATAOUT^1; //列扫描时钟位 ***it SCLT=DATAOUT^2; //列数据锁存位 ***it AB=DATAOUT^4; //行数据输出位 ***it SCK=DATAOUT^5; //行扫描时钟位 unsigned char lhj[32];//32字节RAM做为16*16点阵屏显示缓存 void display();//做为点阵扫描函数,将显示缓存的数据输出到点阵屏 void displayS(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);//延时子函数 code unsigned char SUN[32]={0x00,0x20,0x7E,0x20,0x02,0x20,0x04,0x20, 0x08,0x20,0x0A,0xB0,0x0C,0xA8,0x39,0x24, 0xC9,0x26,0x0A,0x22,0x0C,0x20,0x08,0x20, 0x08,0x20,0x08,0x20,0x28,0xA0,0x10,0x40,}; code unsigned char ZHENG[32]={ 0x00,0x08,0x7F,0xFC,0x01,0x00,0x01,0x00, 0x01,0x00,0x01,0x00,0x11,0x10,0x11,0xF8, 0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00, 0x11,0x00,0x11,0x04,0xFF,0xFE,0x00,0x00, }; code unsigned char SHUANG[32]={//电 0x00,0x00,0x00,0x04,0xFD,0xFE,0x04,0x84, 0x44,0x84,0x44,0x84,0x28,0x88,0x28,0x48, 0x10,0x48,0x10,0x50,0x28,0x20,0x28,0x30, 0x44,0x50,0x44,0x88,0x81,0x0E,0x06,0x04,}; code unsigned char SHI[32]={//子 0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0, 0x08,0x20,0x08,0x20,0x0F,0xE0,0x00,0x04, 0xFF,0xFE,0x01,0x00,0x09,0x20,0x09,0xF0, 0x09,0x00,0x15,0x00,0x23,0x06,0x40,0xFC,}; code unsigned char ZHU[32]={ 0x02,0x40,0x44,0x44,0x2B,0xF8,0x10,0x50, 0x28,0x64,0x4B,0xFE,0x88,0x80,0x09,0x08, 0x1B,0xFC,0x2D,0x08,0x49,0x08,0x89,0xF8, 0x09,0x08,0x09,0x08,0x29,0xF8,0x11,0x08}; code unsigned char [32]={ 0x04,0x80,0x0E,0xA0,0x78,0x90,0x08,0x90, 0x08,0x84,0xFF,0xFE,0x08,0x80,0x08,0x90, 0x0A,0x90,0x0C,0x60,0x18,0x40,0x68,0xA0, 0x09,0x20,0x0A,0x14,0x28,0x14,0x10,0x0C}; void main(void) //主入口函数 { unsigned char i=0,j=0; for(i=0;i<32;i++) lhj[i]=AS[i];//将图案数据复制到显示缓存 while(1){ displayS(2); //显示图案约2秒 displaymove(TANG,5,12);//将从"汤"开始的四个汉字从右向左移动 displayS(1); //等持约1秒 displaymovetb(1,0,10); //将点阵上显示的内容向下以10的速度移出,补上0,即清空显示屏 displayS(1); //等待1秒 displaymovetb(0,TANG,15); //将"汤"字以10的速度向上移动 displaymovetb(0,GONG,15); //将"工"字以10的速度向上移动 displaymovetb(0,DIAN,15); //将"电"字以10的速度向上移动 displaymovetb(0,ZI,15); //将"子"字以10的速度向上移动 displaymovetb(0,SA,15); displaymovetb(0,0,15); //以10的速度向上清空 displayS(1); //等待1秒 displaymovetb(1,TANG,10); //将"图案"以10的速度向下移动 } } void display()//显示 { unsigned char i,ia,j,tmp; //定义变量 DATAOUT=0XFF; //置位高电平做准备 AB=0; //将行数据位清0,准备移位 for(i=0;i<16;i++){ //循环输出16行数据 SCK=0; //为行移位做准备 SCLT=0; //为列锁存做准备 for(ia=2;ia>0;){ //每行16个点,循环位移两个字节 ia--; //循环两次 tmp=~lhj[i*2+ia]; //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成, //电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据 for(j=0;j<8;j++){ //循环两次,每次移一个字节, SCLH=0; //为列移位做准备 DATA=tmp&0x01; //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位 tmp>>=1; //将数据缓冲右移一位,为下次输出做准备 SCLH=1; //将DATA上的数据移入寄存器 } //移入单字节结束 } //移入两个字节结束 DATAOUT|=0X24; //此句可以用以下两句来理解,如果不将两句合为一句,将出现拖影现像 //SCK=1; //SCK拉高,行数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳) //SCLT=1; //SCLT拉高,将数据锁存输出到相应列的点阵发光管显示,显示一行后将保持到下一行显示开始 AB=1; //行数据位只在第一行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始一直移位最后一位, //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱 } j=64; while(j--); //每一行的显示,保持了两字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度 SCK=0; // SCK=1; //将最后一行数据移出 } void displayS(unsigned int timer) //指定时间扫描显示 { unsigned char i; while(timer--){ //当timer=1时,大约1秒时间 i=130; while(i--) display(); } } void displaymove(unsigned char *lp,unsigned char c,unsigned char timer)//显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数, //timer是移动的速度 { unsigned char i=0,j=0,ia=0; unsigned int tmp=0,timerc=0; unsigned char tmp2[16]; c*=2; //因一个汉字由32字节组成,而移位显示,要分开半个汉字16字节处理,因此将这里乘以2 for(i=0;i<16;i++) tmp2[1]=0; //将缓冲区清0, while(c){ //循环处理 if(lp!=0){ //当lp指向的地址为0时,直接用组缓冲0补上,效果是将当前显示的内容移出 tmp=c%2; //取余,目的是为了判断处理汉字的前半部份还是后半部份 for(i=0;i<16;i++){ tmp2[i]=lp[i*2+tmp]; //取半个汉字点阵数据,16字节 } if(tmp) //当tmp为1时,表时一个字数组处理完成,将地址转到下一个字 lp+=32; } //-------------- tmp=8; //变量再次利用 while(tmp){ //循环8次,是将下一个字的前半部份的字节数据移入显示缓冲 ia=0; //做为点阵数组的元素 for(i=0;i<16;i++){//移动是16行同时移,因此要处理16个字节 lhj[ia]<<=1; //移当前显示缓冲的前半行字节 if(lhj[ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理 lhj[ia]++; ia++; lhj[ia]<<=1; //移当前显示缓冲的后半行字节 if(tmp2[i]&0x80) //判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理 lhj[ia]++; ia++; tmp2[i]<<=1; //下一个要显示汉字的半行字节向高位移一位,准备下一次取位 } tmp--; timerc=timer; //处理完16行,调用显示函数更新点阵 while(timerc--) //循环做为处理的速度,即移动的速度 display(); } //---------- c--; //移完一半,进入下一半或下一个汉字,直到结束 } } void displaymovetb(unsigned char din,unsigned char *lp,unsigned char timer) //上下移动内容,din:1为向下,0为向上,lp指向要移入的内容,timer为移动速度 { unsigned char i=0,j=0,ia=0; unsigned int tmp=0,timerc=0; if(din){ //判断移动方向,向下 ia=32; //要移入第一个汉字的数组元素 i=16; //行索引 while(i--){ //逐行处理 j=30; while(j){ j--; lhj[j+2]=lhj[j]; //将上一行的内容复制到下一行,每两行内容相隔四个字节,复制15行 } if(lp==0){ //最后一行的处理,判断移入的内容是否为空,是用0移入 lhj[0]=0; lhj[1]=0; } else{ //否则,取字数组处理 ia--; lhj[1]=lp[ia]; ia--; lhj[0]=lp[ia]; } timerc=timer; //处理完16行,调用显示函数更新点阵 while(timerc--) //循环做为处理的速度,即移动的速度 display(); } } else{ //移动方向,向上 ia=0; //向上移动,移入汉字从低位开始 for(i=0;i<16;i++){ //处理16行 for(j=0;j<30;j++) //将下一行的内容复制到上一行,每两行内容相隔四个字节,复制15行 lhj[j]=lhj[j+2]; if(lp==0){ //最后一行的处理,判断移入的内容是否为空,是用0移入 lhj[30]=0; lhj[31]=0; } else{ //否则,取字数组处理 lhj[30]=lp[ia]; lhj[31]=lp[ia+1]; ia+=2; } timerc=timer; //处理完16行,调用显示函数更新点阵 while(timerc--) //循环做为处理的速度,即移动的速度 display(); } } } void delay(unsigned int a) //延时 { while(a--); } `
LED点阵屏(16x16点阵)原理图.pdf
(62.15 KB, 下载次数: 471
)
74hc164.pdf
(131.92 KB, 下载次数: 137
)
74hc595.pdf
(297.55 KB, 下载次数: 165
)
|
|
相关推荐
95 个讨论
|
|
|
好东西自然要收藏 好东西与您共分享
|
|
|
|
|
|
|
|
![]() ![]() {:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}{:4_95:}
|
|
|
|
|
|
|
|
准备做一个电子diy将太阳能和led结合起来,大家有什么好的创意吗?
3596 浏览 0 评论
24616 浏览 180 评论
1658 浏览 0 评论
5804 浏览 1 评论
分享一个比较好的编码器模式的程序 自己曾经做过倒立摆的程序 亲测好用
9573 浏览 24 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 05:48 , Processed in 1.396357 second(s), Total 103, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1755