怎样用C语言实现LED点阵显示汉字 年 的移动代码

怎样用C语言实现LED点阵显示汉字 年 的移动代码,第1张

;FOR T598D
;LED 点阵显示示例程序
CSLED EQU 8000H
CSc1 EQU CSLED ;列1~8 273
CSc2 EQU CSLED+1H ;列9~16 273
CSr1 EQU CSLED+2H ;行1~8 374
CSr2 EQU CSLED+3H ;行9~16 374

ORG 0000H
MOV SP,#60H
INIT: MOV A,#0H ;关闭LED列显示
MOV DPTR,#CSc1
MOVX @DPTR,A
MOV DPTR,#CSc2
MOVX @DPTR,A
MOV A,#0FFH ;关闭LED行显示
MOV DPTR,#CSr1
MOVX @DPTR,A
MOV DPTR,#CSr2
MOVX @DPTR,A
D: MOV R5,#00H ;设定汉字表格初始值
MOV R4,#01H ;设定列扫描初始值,从第一列开始
DISP:
MOV A,R5
RL ACC
MOV DPTR,#HZKE ;此处设定所要显示的字符
MOVC A,@A+DPTR
CPL ACC ;代码取反,决定显示的阴阳
MOV DPTR,#CSr1
MOVX @DPTR,A
MOV A,R5
RL ACC
INC ACC
MOV DPTR,#HZKE ;此处设定所要显示的字符
MOVC A,@A+DPTR
CPL ACC
MOV DPTR,#CSr2
MOVX @DPTR,A
MOV DPTR,#CSc1
MOV A,R4
MOVX @DPTR,A
RL ACC
MOV R4,ACC
INC R5
LCALL DELAY
MOV A,#00H ;清上次显示值
MOVX @DPTR,A ;关闭行、列
MOV A,#0FFH
MOV DPTR,#CSR1
MOVX @DPTR,A
CJNE R5,#8H,DISP ;判是否显示到第八列
MOV R5,#08H ;设定汉字表格初始值
MOV R4,#01H ;设定列扫描初始值,从第九列开始
DISP2:
MOV A,R5
RL ACC
MOV DPTR,#HZKE ;此处设定所要显示的字符
MOVC A,@A+DPTR
CPL ACC
MOV DPTR,#CSr1
MOVX @DPTR,A
MOV A,R5
RL ACC
INC ACC
MOV DPTR,#HZKE ;此处设定所要显示的字符
MOVC A,@A+DPTR
CPL ACC
MOV DPTR,#CSr2
MOVX @DPTR,A
MOV DPTR,#CSc2
MOV A,R4
MOVX @DPTR,A
RL ACC
MOV R4,ACC
INC R5
LCALL DELAY
MOV A,#00H ;清上次显示值
MOVX @DPTR,A ;关闭行、列
MOV A,#0FFH
MOV DPTR,#CSR2
MOVX @DPTR,A
CJNE R5,#10H,DISP2 ;判是否扫描到第十六列
SJMP D
; 延时子程序,协调字符显示速度
DELAY: MOV R7,#1H
DL1: MOV R6,#00H
DL2: DJNZ R6,DL2
DJNZ R7,DL1
RET
; 字符点阵字库
; HZ16 字符编码排列
; 数 D7 R1 (0 2 --28 30)
; | |
; | |
; 据 D0 R8 (1 3 --29 31)
;
;运行zimoexe程序,在参数设置里选择“纵向取模”,1616点阵,宋体、小四号(12)
;取模方式为A51格式
;取完模之后,将16~32字节间隔插入1~15字节,详见下面示例字模
;
;ZIMO程序生成的字模
;显示“爱迪克”
;HZAI:
; DB 00H,02H,4DH,69H,59H,49H, 6FH,59H, 0C9H,89H,99H,0E9H,89H,09H,0CH,00H
; DB 02H,04H,05H,09H,32H,0E2H,54H,54H, 48H, 58H,64H,44H, 02H,03H,02H,00H
;HZDI:
; DB 02H,82H,73H, 20H,00H,0FH, 09H,09H, 09H,0FFH,09H,09H,09H,0FH,00H,00H
; DB 02H,04H,0F8H,04H,02H,0FAH,12H,12H, 12H,0F2H,12H,12H,12H,0FAH,02H,00H
;HZKE:
; DB 0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;片
; DB 0E0H,00FH,0EFH,0EFH,0EFH,0EFH,0EFH,0EFH,0DFH,0EFH,0DFH,0EFH,0BFH,0EFH,07FH,0FFH
;
; 转换后的字模
HZAI:
DB 00H,02H,02H,04H,4DH,05H,69H,09H,59H,32H,49H,0E2H,6FH,54H,59H,54H
DB 0C9H,48H,89H,58H,99H,64H,0E9H,44H,89H,02H,09H,03H,0CH,02H,00H,00H
HZDI:DB 02H,02H,82H,04H,73H,0F8H,20H,04H,00H,02H,0FH,0FAH,09H,12H,09H,12H
DB 09H,12H,0FFH,0F2H,09H,12H,09H,12H,09H,12H,0FH,0FAH,00H,02H,00H,00H

HZKE:DB 0FFH,0BFH,0EFH,0BFH,0EFH,0BFH,0EFH,0BBH,0E0H,001H,0EFH,0FFH,0EFH,0FFH,0EFH,0FFH ;片
DB 0EFH,0EFH,0EFH,0EFH,0E0H,00FH,0EFH,0EFH,0BFH,0EFH,07FH,0FFH,0DFH,0EFH,0DFH,0EFH
;
END
这是程序请求帮忙修改

#include <stdioh>
#include <stdlibh>
void main()
{
int L[8][8] = {
0,0,0,0,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
1,0,0,0,0,0,0,1};
int i,j;
for (j=0;j<8;j++)
{
for (i=0;i<8;i++) {
if (L[j][i]==1) {printf("");} else printf(" ");
}
printf("\n");
}
system("pause");
}
---------
font L[8][8]可以自己调整

除去一些特殊的字符,都可以直接打印。这些特殊字符包括%(使用%%打印),\(使用\\打印),'、"(使用\'、\"打印)。
另外,所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示,比如\081(代表A)。

分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:

这是给出的相关的材料,请教达人指点啊

我不知道如何动手,也不清楚代码要怎么写

希望高手给编写出来吧谢谢了

/ Chars are defined as 5 columns with each 8 bit, (5x8 font)
lowest 4 dots up to down 1,2,4,8 is higher nibble,

upper 4 dots up to down is lower nibble, for example:

| 123456

-+----------

|

1| xxx 1

2| x x 2

3| x x 4

4| x x __8 "A" is {0x7E,0x11,0x11,0x11,0x7E,0x00} (Last column blank)

5| xxxxx 1

6| x x 2

7| x x 4

8| 8

/

const byte prime_char_map[][6] = { {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ Block for test at startup / {0xFF,0xFF,0xFF,0xFF,0xFF,0x00}, \

/ 02 / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 03 / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 04 / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 05 / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 06 / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 07 / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 08 / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 09 / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 0A / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 0B / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 0C / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 0D / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 0E / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 0F / {0x00,0x00,0x00,0x00,0x00,0x00}, \

/ 10 / {0x00,0x7F,0x3E,0x1C,0x08,0x00}, \

/ 11 / {0x08,0x1C,0x3E,0x7F,0x00,0x00}, \

/ 12 / {0x44,0x66,0x77,0x66,0x44,0x00}, \

/ 13 / {0x11,0x33,0x77,0x33,0x11,0x00}, \

/ 14 / {0x48,0x77,0x49,0x41,0x42,0x00}, \

/ 15 / {0x30,0x48,0x45,0x40,0x20,0x00}, \

/ 16 / {0x00,0x00,0x7D,0x00,0x00,0x00}, \

/ 17 / {0x40,0xE0,0xE0,0x7F,0x06,0x00}, \

/ 18 / {0x24,0x42,0x81,0x42,0x24,0x00}, \

/ 19 / {0x0F,0xF0,0x00,0xF0,0x0F,0x00}, \

/ 1A / {0x20,0x40,0x20,0x10,0x08,0x00}, \

/ 1B / {0x7C,0x82,0x82,0x83,0x44,0x00}, \

/ 1C /

解析:

你的材料不全吧,看样子应该是prime_char_map[][6]第一维应该有256个元素的,你给出来的只是前面的一小部分,这里面很多都不是可显示的字符。下面是根据你的材料写的显示字符的程序:#include <stdioh>const byte prime_char_map[][6] = {{0x00,0x00,0x00,0x00,0x00,0x00}}; 这个地方你得把你的材料里的prime_char_map定义全都粘进来void Display(char c);void main(){Display('A');Display('b');}void Display(char c){int i, j;byte bit = 0x01;for (i = 0; i < 8; i++){for (j = 0; j < 6; j++){if (prime_char_map[c][j] & bit)printf("x");elseprintf(" ");}printf("\n");bit = 2;}}

这基本是一个不可能看成的任务,按照变成的思路,你应该为每一个单独的汉子进行编写一个相应的函数,然后读入txt文档之后,进行每个字的对应比对。简单一点你可以按照五笔的想法把汉字进行分解,但是你读入的汉字就需要结构辨识,这也是很麻烦的。

我只弄过汇编的。
就一层循环,控制行,对于每一行,按照 显示——延时——全灭,然后处理下一行

具体结果就像这样。一边的端口按照1, 2, 4, 8, 16, 32, 64, 128, 1, 2, 4, 8, ……输出下去

另一边配合着输出每一行的信号,即可

记得更改行之前要把输出清零,不然整个led点阵一下子全亮起来了的样子

#include <stdioh>
#include <alloch>
#include <ctypeh>
#include <dosh>
#include <dirh>
#include <ioh>
#include <graphicsh>
#define GETADR(n,str) (str ) calloc (n,sizeof(str)) // 申请N个指定字符串长度的地址
#define W16 16
#define C16 32
unsigned char bit[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
FILE fi;
char dot,str[20];
main(int argc,char argv[])
{
int i,j,nn,xc,yc,MaxX,MaxY,menul[1000];
int graphdriver=DETECT,graphmode;
if(argc!=2){ //检测是否输入了2个参数
puts("LT16<N4>");
exit(0);
}
dot=GETADR(C16,char); //获取16个char长度的内存地址
fnmerge(str,"","",argv[1],"N4"); //建立str 为路径 ,文件名是 第一个参数N4 的文件(这里可能有bug,str没初始化)
if((fi=fopen(str,"r"))==NULL){ //打开这个文件用于输入
puts("Can't open DATA");
exit(0);
}
fscanf(fi,"%d",&nn); //读取一个整数
if(nn<=0||nn>1000) //这个数字必须在 0~1000之间
exit(0);
for (i=0;i<nn;i++)
fscanf(fi,"%d",&menul[i]); //根据这个数字来决定继续读取的数字数量
fclose(fi);
if((fi=fopen("CLIB16DOT","rb"))==NULL){ //打开 CLIB16DOT 这个文件
puts("Can't open CLIB16DOT");
exit(0);
}

initgraph(&graphdriver,&graphmode,""); // 初始化图形模式
MaxX=getmaxx(); // 获得屏幕最大坐标范围
MaxY=getmaxy();
xc=0;
yc=20;
for(j=0;j<nn;j++){
i=readlibdot(menul[j]); //读取点阵数据
putchar16(xc,yc); //显示到对应的坐标系
xc+=20;
if(xc>MaxX-20){
yc+=20;
xc=0;
if(yc>MaxY-20){
getch();
clearviewport();
yc=0;
}
}
}
getch(); //按任意键继续
closegraph(); //关闭图形模式
}
readlibdot(int j)
{
int i0,j1,j2;
long order,k1;
j1=j/100;
j2=j-j1100;
if(j1>=9)
j1=j1-6;
k1=94j1+j2-95;
order=C16k1;
fseek(fi,order,SEEK_SET);
i0=fread(dot,C16,1,fi);
return(i0);
}
putchar16(int bx,int by) //显示readlibdot 得到的汉字(保存在dot 里面)的每个象素点阵
{
int i,j,kk,k,x1,y1;
unsigned char marker;
kk=0;
y1=by;
for(i=0;i<16;i++,y1++){
for(j=0;j<2;j++){
x1=bx+j8;
marker=(dot+kk);
kk++;
for(k=0;k<8;k++){
if(!(marker&bit[k]))
continue;
putpixel(x1+k,y1,YELLOW);
}
}
}
return;
}
点阵字库
一般我们使用1616的点阵宋体字库,所谓1616,是每一个汉字在纵、横各16点的区域内显示的。
不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。
虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。
每一个区记录94个汉字,位号则为该字在该区中的位置。
因此,汉字在汉字库中的具体位置计算公式为:94(区号-1)+位号-1。
减1是因为数组是以0为开始而区号位号是以1为开始的。
这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?
只需乘上一个汉字字模占用的字节数即可,
即:(94(区号-1)+位号-1)一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。
以1616点阵字库为例,计算公式则为:(94(区号-1)+(位号-1))32。
汉字库文该从该位置起的32字节信息即记录了该字的字模信息。
了解点阵汉字及汉字库的构成原理后,显示汉字就变得简单。以1616点阵字库为例,
通常的方法是:将文件工作指针移到需要的汉字字模处、将汉字库文件读入一216数组再用for循环一位位地显示。
#include "graphicsh"
#include "stdioh"
main()
{ int i=VGA,j=VGAHI,k;
unsigned char mat[16][2],chinease[3]="我";
FILE HZK;
if((HZK=fopen("hzk16","rb"))==NULL)exit(0);
initgraph(&i,&j,"");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /获得区码与位码/
fseek(HZK,(94(i-1)+(j-1))32l,SEEK_SET);
fread(mat,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i]&(0x80>>k)) /测试为1的位则显示/
putpixel(i8+k,j,WHITE);
getch();
closegraph();
fclose(HZK);
}


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

原文地址: http://outofmemory.cn/yw/13211484.html

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

发表评论

登录后才能评论

评论列表(0条)

保存