
不知什么
字,上一个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语言该怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)