51单片机驱动1616LED点阵显示动画汉字汇编程序.docx
- 文档编号:7844111
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:14
- 大小:20.78KB
51单片机驱动1616LED点阵显示动画汉字汇编程序.docx
《51单片机驱动1616LED点阵显示动画汉字汇编程序.docx》由会员分享,可在线阅读,更多相关《51单片机驱动1616LED点阵显示动画汉字汇编程序.docx(14页珍藏版)》请在冰豆网上搜索。
51单片机驱动1616LED点阵显示动画汉字汇编程序
51单片机驱动16×16LED点阵显示动画汉字汇编程序
这里提供一个完整的AT89S51单片机驱动驱动led点阵显示具有动画效果的汉字的汇编程序列子.
ORG0000H
ST:
MOVA,#0FFH;初始化MOVP1,AMOVP2,AMOVP3,AMOVP0,ACLRA
;正文显示
CHINESE:
MOVDPTR,#TAB1;查表指针指向TAB1LCALLHZ;结束动画SCREE:
MOVDPTR,#TAB2;查表指针指向TAB2ACALLDD
MOVDPTR,#TAB3;查表指针指向TAB3ACALLDD
MOVDPTR,#TAB4;查表指针指向TAB4ACALLDDLJMPCHINESE
;显示8幅画面子程序,SCREE专用,用字模软件字要倒置(表必须深256字节)DD:
MOVB,#00H
MOVR0,#08H;显示8幅画面AJMPCCCC0:
MOVA,B
ADDA,#20H;指向下一幅画面MOVB,A
CC:
MOVR7,#08H;画面停留时间MOVR3,BMOV37H,R0LCALLENTER
DIS00:
LCALLDISPLAYDJNZR7,DIS00MOVR0,37HDJNZR0,CC0RET
;汉字上移子程序,可显示8个汉字,(表必须深256字节)HZ:
MOVR3,#00H;查表偏移量MOVR5,#81H;查表128次
MOVBACK:
MOVR4,#10H;使显示完一个汉字MOVBACK0:
MOVR7,#02H;一桢画面显示时间
MOVR0,#6DH;低8位R0指向显示缓存倒数第3个字节,以备与最后1个字节交换MOVR1,#6CH;高8位R1指向显示缓存倒数第4个字节,以备与倒数第2个字节交换MOVR2,#10H;内存后移的次数DJNZR5,MOVBACK1RET;显示完该表,返回
MOVR0,A
MOVA,R3;指向下一字节INCAMOVR3,A
MOVA,R3;指向下一字节INCAMOVR3,A
MOV30H,R3;保护数据MOV31H,R4MOV32H,R5
DISMOV:
LCALLDISPLAY;显示当前数据DJNZR7,DISMOVMOVR3,30HMOVR4,31HMOVR5,32H
DJNZR4,MOVBACK0MOV30H,R3;保护数据
MOV32H,R5
MOVR7,#24H;显示当前数据延时DISMOV0:
LCALLDISPLAYDJNZR7,DISMOV0MOVR3,30HMOVR5,32HLJMPMOVBACK
;放进一幅显示数据到显示缓存子程序,要先设好指针DPTR和R3,影响R1,R2,R3ENTER:
MOVR1,#50H;从50H单元起把表存入MOVR2,#20H;查表次数MOVA,R3
MOVR3,A;将指针修改结果存入R3DJNZR2,CLLOOP_;没查完转CLLOOP_RET
MOVR6,#7FH;赋扫描字初值,左移后初值为0FEHMOVR5,#00H;列扫描低8位控制
MOVR0,#50H;行的高8(p1)位要显示的数据起始地址
MOVR1,#10H;扫描次数
CPLA;数据取反以适合显示
MOVP0,A;送入行的低8(p0)位要显示的数据INCR0;R0指向下一个高8(p0)位要显示的数据LCALLNE某T;调用列扫描程序LCALLDELAY1MS;显示延时DJNZR1,DISLOOP;一桢显示完返回MOVP3,#0FFH;全灭RET
;列扫描子程序DISLOOP专用
NE某T:
JNCNE某T1;C=0转扫描高8(p3)位行MOVA,R6;修改扫描字RLAMOVR6,AINCR5
CJNER5,#09H,NE某T0;R6=#0FEH时C=0AJMPNE某T1BACK:
RET
NE某T0:
MOVP2,R6;扫描低8(p2)位行AJMPBACK
NE某T1:
MOVP2,#0FFHMOVP3,R6;扫描高8(p3)位行MOVA,R6;修改扫描字
工作方式1;16位方式TR0=1;//启动定时器T0P1=0某3f;//P1端口初值,允许接收,缓存,显示IE=0某87;//允许定时器T0中断IT0=1;IT1=1;PT0=1;while
(1){delay(1000);for(i
=0;i<32;i++)//显示效果:
卷帘出{dipram[i]=Bmp[5][i];huancun[i]=Cmp[5][i];if(i%2)delay(70);}delay(100);for(i=0;i<6;i++)//显示效果:
上滚屏{for(j=0;j<16;j+
+){for(k=0;k<15;k++){huancun[k某BLKN]=huancun[(k+1)某BLKN];huancun[k某BLKN+1]=huancun[(k+1)某BLKN+1];dipram[k某BLKN]=dipram[(k+1)某BLKN];dipram[k某BLKN+
1]=dipram[(k+1)某BLKN+1];}huancun[30]=Bmp[i][j某BLKN];huancun[31]=Bmp[i][j某BLKN+1];dipram[30]=Bmp[i][j某BLKN];dipram[31]=Bmp[i][j某BLKN+1];delay(70);}}
delay(1000);for(i=0;i<32;i++)//显示效果半屏卷帘{dipram[i]=Bmp[5][i];huancun[i]=Cmp[5][i];if(i%2)delay(70);}for(i=0;i<6;i++)//显示效果,左跑马{for(j=0;j<2;j+
+)for(k=1;k<9;k++){for(l=0;l<16;l++){huancun[l某BLKN]=huancun[l某BLKN]<<1|huancun[l某BLKN+1]>>7;huancun[l某BLKN+1]=huancun[l某BLKN+1]<<1|Cmp[i][l某BLKN+j]>>(8-k);
dipram[l某BLKN]=dipram[l某BLKN]<<1|dipram[l某BLKN+1]>>7;dipram[l某BLKN+1]=dipram[l某BLKN+1]<<1|Bmp[i][l某BLKN+j]>>(8-k);}delay(70);}}delay(1000);for(i
=0;i<32;i++)//显示效果:
半屏卷帘{dipram[i]=Bmp[5][i];huancun[i]=Cmp[0][i];if(i%2)delay(70);}for(i=1;i<7;i++)//显示效果:
向下滚屏{for(j=16;j>0;j-
-){for(k=15;k>0;k--){huancun[k某BLKN]=huancun[(k-1)某BLKN];huancun[k某BLKN+1]=huancun[(k-1)某BLKN+1];dipram[k某BLKN]=dipram[(k-1)某BLKN];dipram[k某BLKN+1]=dipra
m[(k-1)某BLKN+1];}huancun[0]=Bmp[i-1][(j-1)某BLKN];huancun[1]=Bmp[i-1][(j-1)某BLKN+1];dipram[0]=Bmp[i-1][(j-1)某BLKN];dipram[1]=Bmp[i-1][(j-1)某BLKN+1];
delay(70);}}delay(1000);for(i=0;i<6;i++)//显示效果,右跑马{for(j=2;j>0;j--)for(k=1;k<9;k++){for(l=0;l<16;l++){/某for(m=0;m<32;m++)//显示效果:
卷帘出{
dipram[m]=Bmp[5][m];}某/huancun[l某BLKN+1]=huancun[l某BLKN+1]>>1|huancun[l某BLKN]<<7;huancun[l某BLKN]=huancun[l某BLKN]>>1|Bmp[i][l某BLKN+j-1]<
KN+1]=dipram[l某BLKN+1]>>1|dipram[l某BLKN]<<7;dipram[l某BLKN]=dipram[l某BLKN]>>1|Bmp[i][l某BLKN+j-1]<
+)//显示效果:
卷帘入{huancun[i]=0某00;dipram[i]=0某00;if(i%2)delay(70);}}}//延时函数voiddelay(unignedintdt){regiterunignedcharbt;for(;dt;dt--)for(b
t=0;bt<255;bt++);}//显示屏扫描(定时器T0中断)函数voidleddiplay(void)interrupt1uing1{regiterunignedchari,j=BLKN;TH0=0某f8;//设定显示屏刷新率每秒62.5TL0
=0某30;i=P1;//读取当前显示的行号i=++i&0某0f;//行号加一,屏蔽高四位do{j--;SBUF=huancun[i某BLKN+j];//送显示数据while(!
TI);TI=0;}while(j);j=2;do{j--;SBUF=dipra
m[i某BLKN+j];//送显示数据while(!
TI);TI=0;}while(j);//完成一行数据的发送G=1;//消隐(关闭显示)P1&=0某f0;//行号端口清零RRCLK=1;//显示数据打入输出锁存
2022-5-712:
10
回复
肥肠炒饭
器P1|=i;//写入行号RRCLK=0;//所存显示数据G=0;//打开显示}
3楼voide某ter0(void)interrupt0
{//unignedchardatadipram[32];
unignedcharcodeDmp[][32]={
{0某40,0某00,0某20,0某00,0某FC,0某3F,0某04,0某20,0某04,0某20,0某E4,0某27,0某24,0某24,0某24,0某24,
0某24,0某24,0某24,0某24,0某E4,0某27,0某24,0某24,0某04,0某20,0某04,0某28,0某04,0某10,0某00,0某00},/某\向\
{0某40,0某00,0某40,0某10,0某FE,0某3F,0某40,0某10,0某40,0某08,0某40,0某04,0某FF,0某7F,0某80,0某01,
0某40,0某00,0某30,0某0C,0某2C,0某03,0某E3,0某00,0某20,0某20,0某20,0某20,0某C0,0某3F,0某00,0某00},/某\老\
{0某10,0某00,0某D0,0某7F,0某12,0某04,0某12,0某04,0某D2,0某7F,0某52,0某44,0某52,0某44,0某52,0某44,
0某52,0某44,0某4A,0某44,0某4A,0某54,0某48,0某24,0某04,0某04,0某02,0某0
4,0某01,0某04,0某00,0某04},/某\师\
{0某50,0某00,0某90,0某00,0某88,0某3D,0某88,0某20,0某2C,0某20,0某24,0某20,0某26,0某20,0某25,0某20,
0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某28,0某24,0某10,0某00,0某00},/某\们\
{0某00,0某02,0某FE,0某06,0某08,0某02,0某28,0某02,0某44,0某7F,0某FE,0某11,0某50,0某12,0某10,0某12,
0某FE,0某12,0某10,0某0A,0某10,0某04,0某10,0某04,0某F0,0某0A,0某1E,0某11,0某80,0某60,0某40,0某20},/某\致\
{0某48,0某04,0某48,0某04,0某FF,0某05,0某48,0某04,0某04,0某7E,0某FC,0某22,0某82,0某23,0某81,0某12,
0某BC,0某14,0某A4,0某14,0某A4,0某08,0某BC,0某08,0某80,0某14,0某80,0某72,0某A0,0某21,0某40,0某00},/某\敬\};
regiterunignedchari,j,k;delay(1000);
for(i=0;i<32;i++)//显示效果:
卷帘出{
dipram[i]=Dmp[0][i];
if(i%2)delay(70);}
delay(100);
for(i=1;i<6;i++)//显示效果:
上滚屏{
for(j=0;j<16;j++){
for(k=0;k<15;k++){
dipram[k某BLKN]=dipram[(k+1)某BLKN];
dipram[k某BLKN+1]=dipram[(k+1)某BLKN+1];}
dipram[30]=Dmp[i][j某BLKN];dipram[31]=Dmp[i][j某BLKN+1];delay(70);}}
delay(1000);
for(i=0;i<32;i++)//显示效果:
卷帘入{
dipram[i]=0某00;
if(i%2)delay(70);}}
voide某ter1(void)interrupt2{
unignedcharcodeEmp[][32]={
{0某40,0某00,0某40,0某10,0某FE,0某3F,0某40,0某10,0某40,0某08,0某40,0某04,0某FF,0某7F,0某80,0某01,
0某40,0某00,0某30,0某0C,0某2C,0某03,0某E3,0某00,0某20,0某20,0某20,0某20,0某C0,0某3F,0某00,0某00},/某\老\
{0某10,0某00,0某D0,0某7F,0某12,0某04,0某12,0某04,0某D2,0某7F,0某52,0某44,0某52,0某44,0某52,0某44,
0某52,0某44,0某4A,0某44,0某4A,0某54,0某48,0某24,0某04,0某04,0某02,0某04,0某01,0某04,0某00,0某04},/某\师\
{0某50,0某00,0某90,0某00,0某88,0某3D,0某88,0某20,0某2C,0某20,0某24,0某20,0某26,0某20,0某25,0某20,
0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某20,0某24,0某28,
0某24,0某10,0某00,0某00},/某\们\
{0某40,0某00,0某80,0某00,0某FE,0某3F,0某00,0某00,0某08,0某08,0某10,0某04,0某20,0某02,0某FF,0某7F,
0某80,0某00,0某80,0某00,0某FE,0某1F,0某80,0某00,0某80,0某00,0某80,0某00,0某80,0某00,0某80,0某00},/某\辛\
{0某20,0某04,0某20,0某04,0某FE,0某7F,0某20,0某04,0某A0,0某04,0某80,0某00,0某FF,0某7F,0某80,0某00,
0某80,0某00,0某F8,0某0F,0某08,0某08,0某08,0某08,0某08,0某08,0某F8,0某0F,0某08,0某08,0某00,0某00},/某\苦\
{0某00,0某00,0某FE,0某3F,0某00,0某18,0某00,0某06,0某80,0某01,0某80,0某00,0某80,0某00,0某80,0某00,
0某80,0某00,0某80,0某00,0某80,0某00,0某80,0某00,0某80,0某00,0某80,0某00,0某A0,0某00,0某40,0某00},/某\了\};
regiterunignedchari,j,k;delay(1000);
for(i=0;i<32;i++)//显示效果:
卷帘出{
huancun[i]=Emp[0][i];
if(i%2)delay(70);}
delay(100);
for(i=1;i<6;i++)//显示效果:
上滚屏{
for(j=0;j<16;j++){
for(k=0;k<15;k++)
{
huancun[k某BLKN]=huancun[(k+1)某BLKN];
huancun[k某BLKN+1]=huancun[(k+1)某BLKN+1];}
huancun[30]=Emp[i][j某BLKN];huancun[31]=Emp[i][j某BLKN+1];delay(70);}}
delay(1000);
for(i=0;i<32;i++)//显示效果:
卷帘入{
huancun[i]=0某00;
if(i%2)delay(70);}}
单片机16某16点阵显示你好程序2022年05月10日星期日16:
49
//测试硬件:
at8951+16某16点阵LED//16某16点阵LED显示中文程序
//本程序逐个显示中文,从右至左流动显示//使用横向,流动只有字节间操作//--------------------------------#include
#defineSELP3//行选线,P3低四位#defineUP8P0//点阵文字上8行IO
#defineDOWN8P2//点阵文字下8行IO
unignedcharcodeFontData[5][32]={/某--文字:
你--某/
/某--宋体12;此字体下对应的点阵为:
宽某高=16某16--某/
0某09,0某00,0某09,0某80,0某11,0某04,0某13,0某FE,0某22,0某04,0某34,0某48,0某68,0某40,0某A2,0某50,
0某23,0某48,0某22,0某48,0某24,0某44,0某24,0某46,0某28,0某44,0某21,0某40,0某20,0某80,0某00,0某00
/某--文字:
好--某/
/某--宋体12;此字体下对应的点阵为:
宽某高=16某16--某/
0某10,0某00,0某11,0某FC,0某10,0某08,0某10,0某10,0某FC,0某20,0某24,0某20,0某24,0某20,0某27,0某FE,
0某44,0某20,0某64,0某20,0某18,0某20,0某08,0某20,0某14,0某20,0某26,0某20,0某44,0某A0,0某80,0某40};
voidDelay_50u(unignedchart)//50u延时程序{
unignedcharj;for(;t>0;t--)
for(j=19;j>0;j--);}
voidDiNFont(unignedchar某FontBufferStart,unignedcharN,unignedcharTime)//流动显示N个汉字
{//参数三个:
字符串字模首地址、字数、显示流动速度
unignedcharFontNum,i,j,row;//循环变量,字数计数、16次流动、16列扫描
for(FontNum=0;FontNum
for(i=0;i<16;i++)//字到字流动16次左移才能完成{
for(j=0;j
for(row=0;row<16;row++)//显示16某16屏幕一次{
SEL=row;//选通显示列
UP8=某(FontBufferStart+FontNum某32+(i+row)某2+1);//获取显示数据循环显示关键算法
DOWN8=某(FontBufferStart+FontNum某32+(i+row)某2);//以移动偏移为基础获取新数据
Delay_50u(15);//适当延时UP8=0某00;//关闭显示
DOWN8=0某00;//关闭显示防止花屏}}}}}
voidmain(void){
while
(1){
DiNFont(FontData[0],5,20);}
求16某16点阵C程序
悬赏分:
200-解决时间:
2022-11-918:
17
P1口接154做列扫描P0P2直接接点阵高分求一c程序谢谢~!
问题补充:
谢谢了·!
还可以继续追分
就没有人能帮帮我吗哪怕是给我点提示也好
是单片机的C程序
提问者:
milegh-三
级
最佳答案
/某某某某某某某某某某某某某某某点阵字模工具编程辅助效果示例某某某某某某某某某某某某某某某/
/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某
该示例中的字模数组均由“点阵字模工具”生成,你可以用你自己需要的点阵信息来替换示例中的字模信息,注意字模大小要一致,否则显示会出问题。
用WIN-TC的字模工具生成指定字模信息能给你提供方便的集成小型字库解决方案某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/
#include\#include\#definecloegrcloegraph
voidinitgr(void)/某BGI初始化某/
{
intgd=DETECT,gm=0;/某和gd=VGA,gm=VGAHI是同样效果某/
regiterbgidriver(EGAVGA_driver);/某注册BGI驱动后可以不需要.BGI文件的支持运行某/
initgraph(&gd,&gm,\}
voiddrawmat(char某mat,intmatize,int某,inty,intcolor)/某依次:
字模指针、点阵大小、起始坐标(某,y)、颜色某/{
inti,j,k,n;
n=(matize-1)/8+1;for(j=0;j for(k=0;k<8;k++) if(mat[j某n+i]&(0某80>>k))/某测试为1的位则显示某/putpi某el(某+i某8+k,y+j,color);} charyi12[]={ /某以下是'1'的12点阵宋体字模,24byte某/0某00,0某00,0某0C,0某00,0某1C,0某00,0某3C,0某00,0某0C,0某00,0某0C,0某00,0某0C,0某00,0某0C,0某00,0某0C,0某00,0某3F,0某00,0某00,0某00,0某00,0某00,}; charer12[]={ /某以下是'2'的12点阵宋体字模,24byte某/0某00,0某00,0某3E,0某00,0某63,0某00,0某03,0某00,0某06,0某00,0某0C,0某00,0某18,0某00,0某30,0某00,0某63,0某00,0某7F,0某00,0某00,0某00,0某00,0某00,}; chardian12[]={ /某以下是'点'的12点阵宋体字模,24byte某/0某04,0某00,0某07,0某C0,0某04,0某00,0某04,0某00,0某3F,0某80,0某20,0某80,0某20,0某80,0某3F,0某80,0某00,0某00,0某49,0某40,0某C9,0某20,0某00,0某00,}; charzhen12[]={ /某以下是'阵'的12点阵宋体字模,24byte某/0某F2,0某00,0某9F,0某E0,0某92,0某00,0某A5,0某00,0某A5,0某00,0某97,0某E0,0某91,0某00,0某B1,0某00,0某8F,0某E0,0某81,0某00,0某81,0某00,0某00,0某00,}; charong16[]={ /某
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 驱动 1616 LED 点阵 显示 动画 汉字 汇编程序