求一个16*16点阵LED显示左移的汇编程序(显示4个字的)!!拜托高手们!!

求一个16*16点阵LED显示左移的汇编程序(显示4个字的)!!拜托高手们!!,第1张

不知什么

字,上一个6

个字的。

;16X16LED点阵流动显示

;逐列、逆向(低位开始)扫描

ORG

0000H

AJMP

MAIN

ORG

0030H

MAIN:

MOV

DPTR,#TAB

;字码表初址赋值

MOV

R1,#00H

;列控制码

MOV

R4,#96

;移动"

"及"机电工程系"6个字符,共96列

CM:

MOV

R5,#5

;每屏反复显示5次

MOV

R3,#16

;列数

C1:

MOV

R2,#0

;取码指针

C16:

MOV

P0,#00H

MOV

P2,#00H

;关显示

CLR

P30

MOV

A,R2

MOVC

A,@A+DPTR

;取当前列显示字码的第一个字节

MOV

P0,A

;送1~8行控制口

INC

R2

MOV

A,R2

MOVC

A,@A+DPTR

;取当前列的显示字码的第二个字节

MOV

P2,A

;送9~15行控制口

INC

R2

MOV

P1,R1

;送列控制码

INC

R1

ACALL

D1MS

;显示2MS

ACALL

D1MS

DJNZ

R3,C16

;一屏16列是否显示完

MOV

R3,#16

DJNZ

R5,C1

;未显示5次,继续

INC

DPTR

;一屏反复显示5次完,字码表初值加2

INC

DPTR

DJNZ

R4,CM

;96列未移动完,继续

AJMP

MAIN

;96列移动完,返回,重新从"

"开始显示

D1MS:

MOV

R6,#2

MOV

R7,#248

DJNZ

R7,$

DJNZ

R6,$-4

RET

TAB:

;(0)

(1)

机(2)

电(3)

工(4)

程(5)

系(6)

DB

000H,

000H,

000H,

000H,

000H,

000H,

000H,

000H;

DB

000H,

000H,

000H,

000H,

000H,

000H,

000H,

000H;"

",0

DB

000H,

000H,

000H,

000H,

000H,

000H,

000H,

000H;

DB

000H,

000H,

000H,

000H,

000H,

000H,

000H,

000H;"

",1

DB

000H,

008H,

040H,

00CH,

040H,

006H,

0FEH,

07FH;

DB

0FEH,

07FH,

020H,

023H,

020H,

032H,

000H,

01CH;

DB

0E0H,

00FH,

0F0H,

003H,

0D0H,

00FH,

0F0H,

01FH;

DB

030H,

010H,

000H,

010H,

000H,

01CH,

000H,

01CH;"机",2

DB

000H,

000H,

000H,

000H,

0E0H,

001H,

0E0H,

007H;

DB

020H,

007H,

020H,

005H,

0FEH,

03FH,

0FEH,

07FH;

DB

090H,

042H,

010H,

042H,

0F0H,

043H,

0F0H,

041H;

DB

000H,

040H,

000H,

078H,

000H,

038H,

000H,

000H;"电",3

DB

000H,

000H,

000H,

010H,

000H,

010H,

000H,

010H;

DB

020H,

010H,

020H,

010H,

020H,

010H,

0E0H,

01FH;

DB

0F0H,

00FH,

010H,

008H,

010H,

008H,

010H,

008H;

DB

000H,

008H,

000H,

008H,

000H,

008H,

000H,

000H;"工",4

DB

080H,

010H,

080H,

018H,

090H,

00CH,

090H,

006H;

DB

0F8H,

0FFH,

0FCH,

0FFH,

04CH,

026H,

040H,

024H;

DB

070H,

025H,

078H,

025H,

048H,

03FH,

0E8H,

03FH;

DB

0B8H,

012H,

0B8H,

012H,

000H,

010H,

000H,

010H;"程",5

DB

000H,

000H,

000H,

000H,

000H,

040H,

008H,

074H;

DB

048H,

034H,

068H,

006H,

078H,

047H,

0D8H,

0FDH;

DB

0CCH,

0FEH,

066H,

002H,

026H,

00BH,

000H,

01BH;

DB

000H,

032H,

000H,

020H,

000H,

000H,

000H,

000H;"系",6

END

到目前为止,我们编写的C 程序,其用于人机交互的提示或菜单都是英文

的,那么如何在没有汉化的Turbo C 集成开发环境下编制显示汉字的程序呢?

解决这一编程问题,我们首先必须了解有关汉字编码及字库的知识。根据对汉字使

用频率的研究,可把汉字分成高频字(约100 个),常用字(约3000 个),次常用字(约4000 个),

罕见字(约8000 个)和死字(约45000 个),即正常使用的汉字达15000 个。我国1981 年公布

了《通讯用汉字字符集(基本集)及其交换码标准》GB2312-80 方案,把高频字、常用字、和

次常用字集合成汉字基本字符集(共6763 个),在该集中按汉字使用的频度,又将其分为一

级汉字3755 个(按拼音排序)、二级汉字3008 个(按部首排序),再加上西文字母、数字、图

形符号等700 个。

汉字编码:

区位码

国家标准的汉字字符集(GB2312—80)在汉字 *** 作系统中是以汉字库的形式提供的。汉

字库结构作了统一规定,即将字库分成94 个区,每个区有94 个汉字(以

位作区别)每一个汉字在汉字库中有确定的区和位编号(用两个字节),这就是所谓的区位码

(区位码的第一个字节表示区号,第二个字节表示位号,因而只要知道了区位码,就可知道

该汉字在字库中的地址,每个汉字在字库中是以点阵字模形式存储的,如一般采用16×16

点阵形式,每个点用一个二进位表示,存1 的点,当显示时,可以在屏上显示一个亮点,存

0 的点,则在屏上不显示,这样把存某字的16×16 点阵信息直接用来在显示器上按上述原

则显示,则将出现对应的汉字。

内码

汉字使用两字节表示,国家制定了统一标准,称为国标码。国标码规定,每个字节使用

后面7 位,第一位为0。为了区别于英文的ASCII 码,国标码在计算机上使用的时候,规定

汉字每个字节第一位设置为1,以表示该两字节为汉字,称为内码。以“大”字为例子:

国标码3473H: 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 1

内码B4F3H: 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 1

国标码与内码有一定的转换公式,即16 进制的区位码,两个字节各加80H,就成为了

国标码。

汉字字模在字库中存放的位置根据汉字的区位码来确定,内码是汉字在机内的表示。由

于区位码和内码存在固定的转换关系,所以当在支持汉字输入的系统中,键盘输入的汉字内

码即在程序中存在,将其转换为区位码,再从字库中找到对应的汉字字模,然后再用有关的

位 *** 作和循环语句,对每个字节的每一位进行判断,如同过滤一样,如果某位是1,则按设

置的颜色在屏幕的相应位置画点(用graphicsh 中的显示象素点的函数putpixel()),若某位

为0,则不画点,这样就可按预先设置的颜色在相应位置显示出该汉字来。

内码到区位码的转换

若汉字内码为十六进制数h2h1l2l1,则区号qh 相位号wh 分别为:

qh= h2h1-0xa0;

wh= l2l1-0xa0;

若用十进制表示内码为dld2,则

qh=dl-l60;

wh=d2-160;

即区位码qw 为:

qw=100(d1-160)十(d2-160);

反过来,若已经知道了区位码qw。则也可求得区号和位号:

qh=qw/100;

wh=qw-100qh;

因而该汉字在汉字库中离起点的偏移位置(以字节为单位),可计算为:

offset=(94(qh-1)+(wh-1)) 32;

注意:字库中每1 区有94 个字符。

这样,就可以找寻到文件的偏移量,读出一个char bytes[32]数组。这样bytes 数组中则

存了要显示汉字的16×16 点阵字模,然后将字模按行扫描的办法,通过循环用putpixel()函

数在屏幕设定位置显示出象点,因而组合成一个显示的汉字。

这个会压小。看大图到这看

>

要仿真的话我发给你,当然实际电路要三极管驱动

#include <reg52h>

#define uchar unsigned char

uchar i,j,k=15;

sbit  xsi=P2^0;

sbit  xrck=P2^1;

sbit  xsck=P2^2;

sbit  ysi=P2^3;

sbit  yrck=P2^4;

sbit  ysck=P2^5;

sbit kg= P3^2;

uchar code zbm[][32]={

{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,},

{0xFF,0xFF,0xFF,0xF7,0xBF,0xF7,0xBF,0xFB,0xBF,0xFD,0x03,0xE0,0xFF,0xFF,0xFF,0xFF,

0x01,0xF0,0x7F,0xEF,0xBF,0xEF,0x9F,0xEF,0xDF,0xEF,0xFF,0xF1,0xFF,0xFF,0xFF,0xFF},/"北",0/

{0xF7,0xFF,0xF7,0xFF,0xF7,0xEF,0xF7,0xF3,0x37,0xFF,0xB7,0xFE,0xB6,0xDE,0xD5,0x80,

0xDB,0xFE,0x5B,0xFF,0x9B,0xFB,0xFB,0xF7,0xFB,0xE7,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF},/"京",1/

{0xFF,0xEF,0x5F,0xF7,0xDF,0xFA,0xEF,0xFD,0x0F,0xFA,0xFF,0xDF,0xBF,0xEF,0xC7,0xF3,

0x58,0xFC,0xEF,0xFB,0xAF,0xF7,0xCF,0xEF,0xEF,0xCF,0xFF,0xDF,0xFF,0xDF,0xFF,0xFF},/"欢",2/

{0xBF,0xF7,0xBF,0xF7,0xBB,0xF6,0x37,0xF1,0xFF,0xF7,0x07,0xF6,0xF7,0xF6,0x7B,0xF7,

0xF9,0xEF,0x0F,0xE8,0xF7,0xEF,0x77,0xCF,0x07,0xCF,0xFF,0xEF,0xFF,0xEF,0xFF,0xFF},/"迎",3/

{0xFF,0xFE,0x7F,0xFF,0xBF,0xFF,0x0F,0xC0,0xF1,0xFF,0xFF,0xF7,0xBF,0xF9,0xCF,0xEF,

0xD1,0xDF,0x5F,0xC0,0xEF,0xFF,0xAF,0xFD,0xCF,0xFB,0xFF,0xF3,0xFF,0xFF,0xFF,0xFF},/"你",4/

0x87,0xFF,0x03,0xFF,0x01,0xFE,0x00,0xF8,0x01,0xF0,0x01,0xE0,0x03,0x80,0x07,0x00,

0x07,0x00,0x03,0x80,0x01,0xE0,0x01,0xF0,0x00,0xF8,0x01,0xFE,0x03,0xFF,0x87,0xFF,/"心",5/

{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,},

};

uchar code zbm1[][16]={

{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},

{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,},

{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xC0,0x6F,0xDB,0x63,0xEB,0x6C,0xEB},

{0xEF,0xEF,0xEF,0xDF,0x0F,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/"自",0/

{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3B,0xF0,0xBB,0xEF,0xBB,0xEF,0xBB,0xEF,0xDD,0xEF},

{0xCD,0xEF,0xF1,0xEF,0xFF,0xEF,0xFF,0xEF,0xFF,0xEF,0xFF,0xF1,0xFF,0xFF,0xFF,0xFF},/"己",1/

{0x7F,0xFF,0xBF,0xFF,0x0F,0xC0,0xD1,0xFF,0xDF,0xF1,0x01,0xF6,0xEF,0xF6,0xEF,0xE8},

{0x3F,0xF7,0xCF,0xFA,0xD1,0xFD,0x1F,0xFA,0xEF,0xE7,0xEF,0xEF,0xFF,0xEF,0xFF,0xFF},/"做",2/

{0xFF,0xFF,0x3F,0xF8,0x9F,0xE6,0xAF,0xF6,0xD3,0xF7,0x1F,0xE0,0x7F,0xFF,0xBF,0xFF},

{0x5F,0xFF,0xC7,0xFC,0xD9,0xEF,0xEF,0xDF,0x0F,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/"的",3/

{0xFF,0xFF,0x3F,0xCF,0x3F,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/":",4/

{0xF7,0xDF,0x07,0xC0,0xF7,0xDF,0xFF,0xDF,0xFF,0xDF,0xFF,0xDF,0xFF,0xCF,0xFF,0xFF},/"L",0/

{0xF7,0xDF,0x07,0xC0,0x77,0xDF,0x77,0xDF,0x17,0xDC,0xF7,0xDF,0xEF,0xE7,0xFF,0xFF},/"E",1/

{0xF7,0xDF,0x07,0xC0,0xF7,0xDF,0xF7,0xDF,0xF7,0xDF,0xEF,0xEF,0x1F,0xF0,0xFF,0xFF},/"D",2/

{0xFF,0xDF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFF,0x7F,0xF4,0x7F,0xED,0x81,0xFD,0xB7,0xFD},

{0xB7,0xF5,0xBB,0xED,0x3B,0xFE,0xFF,0xF7,0xFF,0xEF,0xFF,0xCF,0xFF,0xFF,0xFF,0xFF},/"点",3/

{0xFF,0xFF,0x03,0xE0,0xBB,0xFF,0x6D,0xFF,0x11,0xFB,0xFF,0xFB,0x37,0xFB,0x57,0xFB},

{0x67,0xFB,0x19,0x80,0xBB,0xFD,0xBB,0xFD,0xBF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFF},/"阵",4/

{0xFF,0xEF,0xFF,0xF7,0xFF,0xF9,0x7F,0xFE,0x81,0xBD,0x75,0xDD,0x65,0xE5,0x55,0xF8},

{0xB6,0xFD,0x9A,0xFD,0x28,0x80,0xBC,0xFE,0xBF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFF},/"屏",5/

{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},

{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,},

};

void ys (uchar a) //延时

{

uchar b;

for (;a>0;a--)

for (b=100;b>0;b--) ;

}

void yfs() //Y轴发数

{

ysck=0;

yrck=0;

k++;

if (k==16)

 {

k=0;

ysi=0;

 }

 else

ysi=1;

ysck=1;

yrck=1;

}

void xfs(uchar a)   //X轴发数

{

uchar b,a1,a2;

a1=~zbm[6][a2+1];

a2=~zbm[6][a2];

xsck=0;

xrck=0;

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

{

a1=a1<<1;

xsi=CY;

xsck=1;

xsck=0;

}

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

{

a2=a2<<1;

xsi=CY;

xsck=1;

xsck=0;

}

xrck=1;

}

void  fs(uchar a)      //X轴发数

{

uchar b;

xsck=0;

xrck=0;

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

{

a=a<<1;

xsi=CY;

xsck=1;

xsck=0;

}

xrck=1;

}

void gdhs(uchar zz,uchar N,uchar Time) //流动显示N个汉字    滚动函数

{ //参数三个:字符串字模首地址、字数、显示流动速度

uchar FontNum,i,j,row; //循环变量,字数计数、16次流动、16列扫描

for(FontNum=0;FontNum<N;FontNum++)

{

for(i=0;i<16;i++) //字到字流动 16次左移才能完成

{

for(j=0;j<Time;j++) //显示延迟,决定流动速度

{

k=15;

for(row=0;row<16;row++) //显示1616屏幕一次

{

yfs(); //选通显示列  //行选线,P3 低四位

fs (~(zz+FontNum32+(i+row)2+1)); //以移动偏移为基础获取新数据 

fs(~(zz+FontNum32+(i+row)2)); //获取显示数据 循环显示关键算法

ys (12); //适当延时

}

}

}

}

}

void wbzd ()  interrupt   0   //外部中断

{

  j++;

  if (j>1)

  j=0;

  ys(10);

  while (!kg)

  {

   k=15;

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

  {

   yfs();

   xfs(i);

ys(10);

   }

  }

if (j==0)

   gdhs(zbm,8,2);

if (j==1)

gdhs(zbm1,10,1);

}

void main ()

{

EA = 1; //打开总中断

EX0=1;

IT0=1;

while (1)

{

  if (j==0)

   gdhs(zbm,8,5);

  if (j==1)

     gdhs(zbm1,10,3);

}

}

#include <REG51H>

#include <intrinsh>

#define NOP() _nop_() // 定义空指令 ,这个函数在库 <intrinsh> 中

//--重定义函数变量--//

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

//--定义SPI要使用的 IO--//

sbit MOSIO = P3^4;

sbit R_CLK = P3^5;

sbit S_CLK = P3^6;

//---全局变量声明--//

ulong column; //点阵列

ulong row; //点阵行

ulong dt;

//点阵显示数组

uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,

0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00};

//你的字,这个只是举例

//uchar code tab1[] = {

//0X0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,

//0X0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF};

//函数声明

void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0);

void delay(unsigned short s)

{

for(s;s>0;s--);

}

/主函数/

void main(void)

{

int k, i, ms;

i = 80; //显示时间

while(1)

{

delay(1000);

HC595SendData(0xff,0xff,0,0);

for(ms = i; ms > 0; ms--)

{

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

{

//输出字

HC595SendData(~tab1[2k +1],~tab1[2k],tab0[2k],tab0[2k + 1]);

}

}

}

}

/

函 数 名 : HC595SendData

函数功能 : 通过595发送四个字节的数据

输 入 : BT3:第四个595输出数值

BT2: 第三个595输出数值

BT1:第二个595输出数值

BT0:第一个595输出数值

输 出 : 无

/

void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0)

{

uchar i;

//--发送第一个字节--//

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

{

MOSIO = BT3 >> 7 ; //从高位到低位

BT3 <<= 1;

S_CLK = 0;

S_CLK = 1;

}

//--发送第一个字节--//

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

{

MOSIO = BT2 >>7; //从高位到低位

BT2 <<= 1;

S_CLK = 0;

S_CLK = 1;

}

//--发送第一个字节--//

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

{

MOSIO = BT1 >> 7; //从高位到低位

BT1 <<= 1;

S_CLK = 0;

S_CLK = 1;

}

//--发送第一个字节--//

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

{

MOSIO = BT0 >> 7; //从高位到低位

BT0 <<= 1;

S_CLK = 0;

S_CLK = 1;

}

//--输出--//

R_CLK = 0; //set dataline low

R_CLK = 1; //片选

}

//与硬件有关的定义:数据口用的是P3口,控制口用的是P2口,

//如果不同,可以更改以下定义。

#include "msp430x44xh"

#define LCD_CON_DIR P2DIR

#define LCD_CON_OUT P2OUT

#define LCD_DI BIT0

#define LCD_RW BIT1

#define LCD_EN BIT2

#define LCD_CS1 BIT3

#define LCD_CS2 BIT6

#define LCD_RST BIT7

#define LCD_DATA_DIR P3DIR

#define LCD_DATA_IN P3IN

#define LCD_DATA_OUT P3OUT

#define LCD_DATA_BIT0 BIT0

#define LCD_DATA_BIT1 BIT1

#define LCD_DATA_BIT2 BIT2

#define LCD_DATA_BIT3 BIT3

#define LCD_DATA_BIT4 BIT4

#define LCD_DATA_BIT5 BIT5

#define LCD_DATA_BIT6 BIT6

#define LCD_DATA_BIT7 BIT7

//

//以下为LCD的命令字

#define DISPLAY_ON 0x3F //显示屏开命令字

#define DISPLAY_OFF 0x3E //显示屏关命令字

#define SET_SHOW 0xC0 //设定显示起始行命令字

#define SET_X 0xB8 //设定显示行命令字

#define SET_Y 0x40 //设定显示列命令字

--------------------------------------------------------------------------------------------------------

#include "LCD_DEFINEH"

void lcd_init(void)

{

LCD_DATA_OUT = 0x00;

LCD_DATA_DIR = 0xFF;

LCD_CON_OUT = LCD_CS1+LCD_CS2+LCD_RST;

LCD_CON_DIR |= LCD_DI+LCD_RW+LCD_EN+LCD_CS1+LCD_CS2+LCD_RST;

LCD_CON_OUT &= ~LCD_RST;

_NOP();

_NOP();

LCD_CON_OUT |= LCD_EN;

_NOP();

_NOP();

LCD_CON_OUT &= ~LCD_EN;

_NOP();

_NOP();

LCD_CON_OUT |= LCD_RST;

_NOP();

_NOP();

}

void write_command(unsigned char command)

{

LCD_DATA_DIR = 0xFF;

LCD_CON_OUT |= LCD_CS1 + LCD_CS2;

LCD_CON_OUT &= ~(LCD_RW + LCD_DI);

LCD_DATA_OUT = command;

LCD_CON_OUT |= LCD_EN;

LCD_CON_OUT &= ~LCD_EN;

}

void write_data( unsigned char data, unsigned char CS1, unsigned char CS2 )

{

LCD_DATA_DIR = 0xFF;

if(CS1) LCD_CON_OUT |= LCD_CS1;

else LCD_CON_OUT &=~LCD_CS1;

if(CS2) LCD_CON_OUT |= LCD_CS2;

else LCD_CON_OUT &=~LCD_CS2;

LCD_CON_OUT |= LCD_DI;

LCD_CON_OUT &=~LCD_RW;

LCD_DATA_OUT = data;

LCD_CON_OUT |= LCD_EN;

LCD_CON_OUT &=~LCD_EN;

}

void clear_lcd(void)

{

unsigned char i,j;

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

{

write_command(SET_X|i);

write_command(SET_Y);

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

{

if(j<=63)write_data(0,1,0);

else write_data(0,0,1);

_NOP();

}

}

}

void display( unsigned char chr, unsigned char nRow, unsigned char nCol,

unsigned char highth,unsigned char wideth )

//chr 显示数据的地址,nRow 在显示屏上第几行,nCol 在显示屏上第几列

//highth 字体的高度,wideth 字体的宽度

//12864有8行,128列

{

unsigned char i,tmpCol,tmpRow,h,m;

unsigned int j;

tmpRow = nRow;

m=0;

for(h=0;h<highth;h=h+8)

{

write_command(SET_X|tmpRow);

tmpCol=nCol;

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

{

if(tmpCol<64)

{write_command(SET_Y|tmpCol);write_data(chr[i+j],1,0);}

else

{write_command(SET_Y|(tmpCol-64));write_data(chr[i+j],0,1);}

tmpCol++;

}

m++;

j=mwideth;

tmpRow++;

}

}

我也不怎么会,还在学习中

下面有一个1616的C程序

参考一下。。。

字模软件你要的话我可以给你

共同学习。。。

#include<reg51h>

sbit P20=P2^0;

sbit P22=P2^2;

unsigned char code text[]={

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x80,0x00,0x80,0xFC,0x80,0x05,0xFE,0x85,0x04,0x4A,0x48,0x28,0x40,0x10,0x40,

0x18,0x40,0x18,0x60,0x24,0xA0,0x24,0x90,0x41,0x18,0x86,0x0E,0x38,0x04,0x00,0x00,/"欢",0/

0x40,0x00,0x21,0x80,0x36,0x7C,0x24,0x44,0x04,0x44,0x04,0x44,0xE4,0x44,0x24,0x44,

0x25,0x44,0x26,0x54,0x24,0x48,0x20,0x40,0x20,0x40,0x50,0x00,0x8F,0xFE,0x00,0x00,/"迎",1/

0x01,0x00,0x21,0x10,0x19,0x18,0x0D,0x10,0x09,0x20,0x01,0x04,0x7F,0xFE,0x04,0x40,

0x04,0x40,0x04,0x40,0x04,0x40,0x08,0x42,0x08,0x42,0x10,0x42,0x20,0x3E,0x40,0x00,/"光",2/

0x01,0x00,0x09,0x80,0x09,0x00,0x49,0xFE,0x4A,0x20,0x4A,0x10,0x4C,0x10,0x49,0x04,

0x49,0xFE,0x49,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x09,0xFC,0x09,0x04,0x00,0x00,/"临",3/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

void Delay(unsigned char i)

{

unsigned char j;

for(;i>0;i--)

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

{;}

}

void main()

{

unsigned int a,e;

unsigned char b,c,d=0;

SCON=0;

while(1)

{

for(e=0;e<160;e=e+32)

{

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

{

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

{

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

{

SBUF=~(text[e+c+32]>>(8-a)|text[e+c+1]<<a);

while(TI==0);

TI=0;

SBUF=~(text[e+c+1]>>(8-a)|text[e+c]<<a);

while(TI==0);

TI=0;

c++;

P20=1;

P1=d;

P22=0;

Delay(3);

P20=0;

P22=1;

d++;

if(d==16)d=0;

}

}

}

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

{

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

{

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

{

SBUF=~(text[e+c+1+32]>>(8-a)|text[e+c+32]<<a);

while(TI==0);

TI=0;

SBUF=~(text[e+c+32]>>(8-a)|text[e+c+1]<<a);

while(TI==0);

TI=0;

c++;

P20=1;

P1=d;

P22=0;

Delay(3);

P20=0;

P22=1;

d++;

if(d==16)d=0;

}

}

}

}

for(a=0;a<160;a=a+2)

{

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

{

for(c=1;c<32;c++)

{

if(a+c<160){

SBUF=~text[a+c];

while(TI==0);

TI=0;

SBUF=~text[a+c-1];

while(TI==0);

TI=0;}

else {

SBUF=~text[a+c-160];

while(TI==0);

TI=0;

SBUF=~text[a+c-1-160];

while(TI==0);

TI=0;}

P1=c/2;

c++;

P20=1;

P22=0;

Delay(3);

P22=1;

P20=0;

}

}

}

}

}

取负得正。

程序与硬件电路反了。解决方式最好的方式是改字模。字模就是反着取。字就正了。改程序,改电路。

程序是按行来处理的,每行是16个点阵,需要2个字节来存储,根据程序表达的意思,点阵表也是按行来建立的,而每次取数只能一个字节,所以i这个行号需要乘以2,ia是每行的字节位置,取值范围为12。

以上就是关于求一个16*16点阵LED显示左移的汇编程序(显示4个字的)!!拜托高手们!!全部的内容,包括:求一个16*16点阵LED显示左移的汇编程序(显示4个字的)!!拜托高手们!!、C语言是如何用16点阵方法输出汉字的、用单片机控制的16x16点阵LED循环显示“北京欢迎你”,这个程序用C语言该怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zz/9268193.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存