标题: 单片机+16x16点阵,汉字滚动显示程序(带仿真) [打印本页]
作者: shige 时间: 2013-6-26 04:33
标题: 单片机+16x16点阵,汉字滚动显示程序(带仿真)
代码写的有点啰嗦,不过用起来挺好用的, 汉字取模采用最普遍的 横向左高位取模,
可以自己任意组合滚动方式,
上下左右滚,想怎么滚就怎么滚,不会的就看看哈
源码及其仿真文件下载:
16x16点阵滚动51hei.com.rar
(50.79 KB, 下载次数: 1382)
下面是源代码预览:
#include <reg51.h>
#include <intrins.h>
#define DATAOUT P2 //P2 use as data, you can change
#define SPEED 13
void ymove(char dir,unsigned char *ptr,char speed);
void xmove(char dir,unsigned char *ptr,char n,char speed);
void delay(unsigned int a);
void display();
void displaytime(char time);
void init164();
sbit ADATA= DATAOUT^0;
sbit ASCK= DATAOUT^1;
sbit LATCH= DATAOUT^2;
sbit BDATA= DATAOUT^3;
sbit BCLK= DATAOUT^4;
code unsigned char xin[32]={
0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x38, //心
0x1F,0x7C,0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,
0x1F,0xFC,0x0F,0xF8,0x07,0xF0,0x03,0xE0,
0x01,0xC0,0x00,0x80,0x00,0x00,0x00,0x00};
code unsigned char zhong[32]={
0x01,0x00,0x01,0x00,0x01,0x04,0x7F,0xFE, //中
0x41,0x04,0x41,0x04,0x41,0x04,0x41,0x04,
0x7F,0xFC,0x41,0x04,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00};
code unsigned char guo[32]={
0x00,0x04,0x7F,0xFE,0x40,0x24,0x5F,0xF4, //国
0x41,0x04,0x41,0x04,0x41,0x44,0x4F,0xE4,
0x41,0x04,0x41,0x44,0x41,0x24,0x41,0x04,
0x5F,0xF4,0x40,0x04,0x7F,0xFC,0x40,0x04};
code unsigned char dui[32]={
0x7C,0x40,0x44,0x40,0x48,0x40,0x48,0x40, //队
0x50,0x40,0x48,0x40,0x48,0x40,0x44,0xA0,
0x44,0xA0,0x44,0xA0,0x69,0x10,0x51,0x10,
0x42,0x08,0x44,0x06,0x48,0x04,0x00,0x00};
code unsigned char jia[32]={
0x10,0x00,0x10,0x00,0x10,0x04,0x12,0x7E, //加
0xFF,0x44,0x12,0x44,0x12,0x44,0x12,0x44,
0x12,0x44,0x22,0x44,0x22,0x44,0x22,0x44,
0x22,0x44,0x4A,0x7C,0x84,0x44,0x00,0x00};
code unsigned char you[32]={
0x00,0x40,0x40,0x40,0x30,0x40,0x10,0x44, //油
0x87,0xFE,0x64,0x44,0x24,0x44,0x0C,0x44,
0x14,0x44,0x27,0xFC,0xE4,0x44,0x24,0x44,
0x24,0x44,0x24,0x44,0x27,0xFC,0x24,0x04 };
code unsigned char gth[32]={
0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0, //!
0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0x80,
0x01,0x80,0x01,0x80,0x00,0x00,0x01,0x80,
0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00};
unsigned char idata buffer[32];
void main(void)
{
unsigned char i;
init164();
while(1)
{
for(i=0;i<32;i++)
buffer[ i]=xin[ i];
displaytime(1);
xmove(1,zhong,3,SPEED);
displaytime(1);
ymove(1,0,SPEED);
ymove(1,jia,SPEED);
ymove(1,you,SPEED);
ymove(1,0,SPEED);
xmove(0,jia,3,SPEED);
ymove(0,gth,SPEED);
ymove(0,0,SPEED);
xmove(1,xin,1,SPEED);
}
}
/************* 子函数 ******************/
void delay(unsigned int a)
{
while(a--);
}
void display()
{
unsigned char hang,ib,k,tmp;
DATAOUT= 0x0;
BDATA = 0;
for(hang=0;hang<16;hang++)
{
ASCK =0;
LATCH=0;
BCLK =0;
for(ib=0;ib<2;ib++)
{
tmp = buffer[hang*2+ib];
for(k=0;k<8;k++)
{
tmp <<=1;
ASCK =0;
ADATA =CY;
ASCK =1;
}
}
DATAOUT|=0x14;
//LATCH=1;
//BCLK=1;
BDATA=1;
}
delay(64);
ASCK =0;
ASCK =1;
}
void displaytime(char time)
{
unsigned char i;
while(time--)
{
i=130;
while(i--)
display();
}
}
void init164()
{
char i;
BDATA=1;
for(i=0;i<16;i++)
{
BCLK =0;
BCLK =1;
}
}
void xmove(char dir,unsigned char *ptr,char n,char speed)
{ /* 方向 n是要移动的汉字个数 移动速度*/
unsigned char i=0, ib=0;
unsigned int tmp=0, speedm=0;
unsigned char buffer2[16]; //半个汉字的缓存
n*=2; //左半字和右半字,所以要x2
for(i=0;i<16;i++) //清零
buffer2[ i]=0;
if(dir == 1)
{
/**** 向左移动 ****/
for(n;n>0;n--)
{
if(ptr != 0)
{
tmp = n%2; //判断是左半字还是右半字
for(i=0;i<16;i++)
buffer2[ i]=ptr[i*2+tmp];
if(tmp) //tmp为1时,将地址指向下一个汉字
ptr+=32;
}
for(tmp=8;tmp>0;tmp--) //要移动8列
{
ib=0;
for(i=0;i<16;i++)
{ //要移16行,共16个字节
buffer[ib] <<=1; //移第一个半字
if(buffer[ib+1] & 0x80)
buffer[ib]++;
ib++;
buffer[ib]<<=1; //移后半字
if(buffer2[ i] & 0x80)
buffer[ib]++;
ib++;
buffer2[ i]<<=1; //缓冲左半字向左移一位
}
speedm=speed; //更新点阵
while(speedm--)
display();
}
}
}
//--------------------------------------------------//
else
{
/****** 向右移动 ******/
for(n;n>0;n--)
{
if(ptr != 0)
{
tmp = (n+1) % 2 ; //判断左半字还是右半字
for(i=0;i<16;i++)
buffer2[ i]=ptr[i*2+tmp];
if(tmp == 0) //tmp为0时,将地址指向下一个汉字
ptr+=32;
}
for(tmp=8;tmp>0;tmp--) //要移动8列
{
ib=0;
for(i=0;i<16;i++)
{ //要移16行,共16个字节
buffer[ib+1] >>= 1; //移右半字
if(buffer[ib] & 0x01)
buffer[ib+1] |=0x80 ;
buffer[ib] >>= 1; //移左半字
if(buffer2[ i] & 0x01)
buffer[ib] |= 0x80;
ib+=2;
buffer2[ i] >>=1; //下个汉字的右半字向右移一位
}
speedm=speed;
while(speedm--) //更新点阵
display();
}
}
}
}
void ymove(char dir,unsigned char *ptr, char speed)
{ //dir=1上移动,dir=0为下移动
char i=0, j=0, ib=0;
unsigned int tmp=0, speedm=0;
if(dir==0)
{
/**** 向下移 ****/
ib=31;
for(i=16;i>0;i--) //下移16行
{
for(j=29;j>-1;j--)
buffer[j+2]=buffer[j]; //将上一行的内容复制到下一行
if(ptr==0)
{ //移空时,buffer的首行用0移入
buffer[0]=0;
buffer[1]=0;
}
else
{ //否则,处理buffer的首行元素
buffer[1]=ptr[ib];
buffer[0]=ptr[ib-1];
ib=ib-2;
}
speedm=speed;
while(speedm--) //更新点阵
display();
}
}
/****** 向上移 *******/
else
{
ib=0; //数组元素序号
for(i=0;i<16;i++) //上移16行
{
for(j=0;j<30;j++) //将下一行的内容复制到上一行
buffer[j]=buffer[j+2];
if(ptr==0) //移入为空,buffer的末行用0移入
{
buffer[30]=0;
buffer[31]=0;
}
else
{ //否则,处理buffer的末行元素
buffer[30]=ptr[ib];
buffer[31]=ptr[ib+1];
ib=ib+2;
}
speedm=speed; //更新点阵
while(speedm--)
display();
}
}
}
作者: 左左右右 时间: 2013-7-4 09:02
51Hei(51黑)论坛有你更精彩.
作者: 周鹏 时间: 2013-10-31 17:55
人才啊!!!
作者: kid次 时间: 2013-11-5 01:17
很好 正是需要
作者: 用户2111158 时间: 2013-12-15 20:14
学习学习,谢谢无私奉献
作者: 942770740 时间: 2013-12-29 20:39
学习了,谢谢楼主
作者: GZMNGZS 时间: 2014-1-14 16:55
很好 想问下8x8点阵屏的字怎么计算代码(16进制数),16x16的又是怎么来计算的呢 就是:code unsigned char you[32]={
0x00,0x40,0x40,0x40,0x30,0x40,0x10,0x44, //油
0x87,0xFE,0x64,0x44,0x24,0x44,0x0C,0x44,
0x14,0x44,0x27,0xFC,0xE4,0x44,0x24,0x44,
0x24,0x44,0x24,0x44,0x27,0xFC,0x24,0x04 };这里面的代码怎么计算出来的??????
作者: yhu168 时间: 2014-2-9 20:29
好好好!收了
作者: 青草漫风 时间: 2014-2-25 21:30
怎么看不懂呢
作者: 鬼谷子 时间: 2014-3-14 13:16
谢谢楼主分享,学习了
作者: 鬼谷子 时间: 2014-3-14 13:17
分数扣了,没下载成
作者: zhouyubo163 时间: 2014-4-7 18:49
看看饿了就扣扣
作者: ironludwig 时间: 2014-4-7 19:37
不错不错!
作者: 930417801 时间: 2014-4-14 17:56
手中还有器材,也想做一个,下来参考一下。
作者: 天下 时间: 2014-5-1 22:40
感觉还不错
作者: 奋斗的小草 时间: 2014-6-20 18:59
有你更精彩
作者: 瑷 时间: 2014-6-27 10:44
我的怎么仿真,没效果。。
作者: xiaozhi_cc 时间: 2014-7-4 22:33
好东西
作者: yxz1140 时间: 2014-8-12 18:52
谢谢~~~~~~~~~~~
作者: 天工 时间: 2014-8-13 04:42
给赞力赞
作者: 周安松 时间: 2014-9-13 07:53
谢谢楼主分享
作者: 周安松 时间: 2014-9-13 07:54
谢谢楼主分享
作者: xing3198 时间: 2014-9-18 23:46
很好的解释
作者: 周安松 时间: 2014-9-19 09:29
谢谢楼主分享,学习了
作者: ljhn431 时间: 2014-10-2 16:58
牛人啊
作者: 我爱偷地瓜 时间: 2014-10-4 19:26
学学楼主怎么滚 哈哈
作者: wgh008 时间: 2014-10-11 19:35
好东西,在学习
作者: 15225963685 时间: 2014-10-12 21:34
非常好的东西,超级顶!!!!
作者: p18712886438 时间: 2014-11-19 21:47
支持一个
作者: fzg63031525 时间: 2014-11-20 14:31
你好!楼主!资料不错!收藏了!顺便问一下,你现在是显示7个字,如果我要显示10个字除了要改显示的字外,程序还有哪里需要改动吗?谢谢!
作者: 流亖懵 时间: 2014-11-22 22:21
人才啊
作者: 随风雅客 时间: 2014-11-23 14:53
谢谢楼主的无私奉献!
作者: HSL199345 时间: 2014-12-10 12:39
多谢分享~~~~~~~~~谢谢楼主
作者: lsw002233 时间: 2014-12-12 01:43
看看,,,,,,,
作者: program 时间: 2015-4-23 23:46
真好


作者: 右手写爱 时间: 2015-5-9 09:42
楼主好人!
作者: freshwater 时间: 2015-5-11 13:46
真厉害啊
作者: 蝴蝶花 时间: 2015-5-14 23:23
学习学习!
作者: wanghaiguang888 时间: 2015-5-20 09:23
这个得顶,就找他呢
作者: 念念念念念念 时间: 2015-5-21 10:05
学习一下
作者: 龙之骨 时间: 2015-5-23 23:15
好厉害!
作者: 东东东510 时间: 2015-5-24 23:38
里面有没论文
作者: 2043530005@qq.c 时间: 2015-6-15 17:08
好厉害 顶一个
作者: cccao 时间: 2015-6-16 21:32
支持一个
作者: icepoint 时间: 2015-6-23 20:26
是挺罗嗦的
作者: Asmodeus丶 时间: 2015-6-24 12:04
赞!!!
作者: 532415834 时间: 2015-6-24 14:30
怎么可以不用黑币就直接下载了
作者: 532415834 时间: 2015-6-24 14:31
赞赞赞
作者: kaixinjiuhaoha 时间: 2015-6-25 22:10
谢谢楼主的程序分享,收了
作者: 发晨不冥 时间: 2015-9-23 23:16
仿真在那里啊
作者: 发晨不冥 时间: 2015-9-23 23:16
哦哦,没看到,原来在的
作者: 吴小枫 时间: 2015-9-23 23:57
大神,初学单片机小白,不知可否请教??
作者: Yx丷 时间: 2015-10-16 11:10
想问你这个AT89C55能用AT89C51代替么
作者: 315616464 时间: 2015-10-16 15:06
求知 这个黑币太难弄了
作者: 油炸热干面 时间: 2015-10-21 21:37
51Hei(51黑)论坛有你更精彩.
作者: 腾飞的龙 时间: 2015-10-22 12:22
用的什么型号单片机。晶振多大。驱动芯片是什么型号?
作者: 邰夏留 时间: 2015-10-28 12:18
正在学习点阵。表示这个贴有用,不错
作者: gct125 时间: 2015-10-28 19:24
试下能不能用,先谢了。
作者: mhx321 时间: 2015-10-29 01:29
顶你,谢谢楼主了,学习学习
作者: 腾飞的龙 时间: 2015-10-29 10:49
不少计算,是用的取模软件
作者: 腾飞的龙 时间: 2015-10-29 10:51
看看8*8的点阵怎么显示的就知道这些码是怎么出来的啦。
作者: 腾飞的龙 时间: 2015-10-29 10:52
楼主:你用的什么驱动芯片驱动点阵屏,是595吗?
作者: 邰夏留 时间: 2015-10-29 12:40
新手表示,就算下载 了还是看不懂啊。
哎,感觉都没信心了。学了半年了,连点阵都还没学到。。。。。
作者: 落尘 时间: 2015-12-24 15:55
字模提取软件就可以,在网上有好多
作者: 张无忌1987 时间: 2016-2-19 10:57
强烈顶一个
作者: 是懂得飞快哈佛 时间: 2016-3-20 17:21
好帮啊
作者: 北京方便面 时间: 2016-4-1 11:46
亲,我黑币不够,急需查看资料,能给我一份吗,qq2061964742@qq.com
作者: 风中老炮 时间: 2016-4-18 12:59
学习了,楼主
作者: 12331054 时间: 2016-4-25 09:11
afasfwfqfs
作者: liu07611 时间: 2016-4-26 12:34
牛人啊
作者: 我的信仰 时间: 2016-5-5 13:01
应该不错吧
作者: 莫名的月光 时间: 2016-5-6 23:06
那个大神教教我字模怎么提取的啊。我用的字模提取软件提取出来跟楼主的不一样啊
作者: haoshijie 时间: 2016-5-7 00:31
好厉害,学习学习
作者: wyl94 时间: 2016-5-11 20:08
正需要
作者: wyl94 时间: 2016-5-11 20:13
谢谢楼主
作者: 123啥电视v 时间: 2016-5-15 15:19
6666hg
作者: 123啥电视v 时间: 2016-5-15 15:39
为什么下载后打不开
作者: trol 时间: 2016-6-11 15:01
很好,学习一下
作者: wen1993 时间: 2016-6-19 09:28
为什么没有原理图??
作者: wen1993 时间: 2016-6-19 09:29



来个原理图??
作者: 1563257180 时间: 2016-6-25 22:24
感觉代码不够精炼
作者: MX安心 时间: 2016-6-26 19:20
这个有意思
作者: 我没上过学 时间: 2016-8-17 07:58
学习学习
作者: 我是小勇 时间: 2016-10-17 22:43
楼主,有个毕业设计需要你帮忙 能否联系
作者: lids 时间: 2016-10-26 12:13
下载了,学习学习
作者: 245059728 时间: 2016-10-30 09:48
看下一下高手水平
作者: lslzx63 时间: 2016-10-30 15:34
正需要,谢谢了!!
作者: a1184569302 时间: 2016-11-28 14:25
不需要三极管吗
作者: 轩漠阳 时间: 2016-12-1 15:04
共阳还是共阴的啊?
作者: yoou 时间: 2016-12-19 10:54
楼主 有汇编语言吗?
作者: chong111 时间: 2017-1-4 16:53
好厉害
作者: yrkygdf 时间: 2017-1-14 17:59
学习学习,谢谢无私奉献
作者: 1130555300 时间: 2017-4-6 19:06
代码是第一个点阵先扫描第一行,在扫描第二个点阵一一行,在扫描第一个点阵第二行,依次循环
作者: wangyufeng 时间: 2017-4-6 20:12
下载学习学习
作者: 单片机哎呀 时间: 2017-4-12 21:29
感谢分享,然而并没有下载
不知道是否可以直接套用在单片机上自带的点阵?
作者: 单片机哎呀 时间: 2017-4-12 21:52
感谢楼主分享,然而并没什么卵用
作者: mxa001 时间: 2017-5-5 16:58
很好 正是需要
作者: learning 时间: 2017-5-5 22:14
有点厉害啊,我只会会变汇编,这要怎么做?
作者: danpianjihi 时间: 2017-5-16 17:11
非常感谢楼主分享
作者: Zlover96 时间: 2017-5-25 20:58
支持楼主!!1
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |