怎么用C语言控制16*16的LED显示汉字数字,汉字比如“欢迎光临”,数字比如“520”; 谢谢高手指点迷津!
根据显示方式而决定取字方式不同,所以有很多种的字模。
上面的字模取字方式如图
到目前为止,我们编写的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,则按设
置的颜色在屏幕的相应位置画点(用graphics.h 中的显示象素点的函数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-100*qh;
因而该汉字在汉字库中离起点的偏移位置(以字节为单位),可计算为:
offset=(94*(qh-1)+(wh-1))* 32;
注意:字库中每1 区有94 个字符。
这样,就可以找寻到文件的偏移量,读出一个char bytes[32]数组。这样bytes 数组中则
存了要显示汉字的16×16 点阵字模,然后将字模按行扫描的办法,通过循环用putpixel()函
数在屏幕设定位置显示出象点,因而组合成一个显示的汉字。
======================================
汇编的代码给你,相关的注释也写了,设计自己弄一下吧
SER EQU P1.0 ; TPIC6B595 第3脚
OE EQU P1.1;TPIC6B595 第8脚
RCK EQU P1.2;TPIC6B595 第12脚
MR EQU P1.3;TPIC6B595 第9脚
SRCLK EQU P1.4;TPIC6B595 第13脚
ORG 0000H
LJMP MAIN
ORG 0100H
;**************************主程序**********************************
MAIN: MOV SP,#70H
SETB OE
MOV 2BH,#00H
MOV 27H,#00H
START: ;初始化寄存器RAM单元
MOV R0, #30H
MOV R1,#64H ;30H~6FH单元清零
MOV A, #00H
ST: MOV @R0,A
INC R0
DJNZ R1,ST
;2Dh------寻址偏址 ;整屏四个字一起显示
LOOP:MOV DPTR,#TAB;赋查表初值
MOV R3,#56
PLAY: MOV 2DH,#00H
MOV 2FH,#10H
GG: LCALL LINE16;扫描显示一次
MOV 2DH,#00H
DJNZ 2FH,GG
MOV A,DPL
CLR C
ADD A, #16
MOV DPL ,A
MOV A, DPH
ADDC A ,#00H
MOV DPH, A
DJNZ R3,PLAY
SJMP START
LINE16: MOV 2BH,#16;扫16行,2BH放后还剩几行
FF: LCALL LINE1;扫描显示一行子程序
DJNZ 2BH,FF;扫描行直到16行扫完再转
RET
LINE1:LCALL MSTR;将显示的内容移入内存单元
LCALL SEND;发送串口子程序
LCALL XH;选通行子程序
RET
MSTR: ;显示内容移入内存单元
MOV R0,#30H
MOV R4,#9
MOV A,2DH;
BB: MOVC A,@A+DPTR
MOV @R0,A
INC R0
MOV A,2DH
ADD A,#16;加16移到下一行
MOV 2DH,A
DJNZ R4,BB
MOV A,2DH
SUBB A,#143
MOV 2DH,A
RET
;$$$$$$$$$$$$$$$$$$$$$$$$$$$发送数据到串口子程序$$$$$$$$$$$$$$$$$$$$$$$$$
SEND:MOV R0,#30H
MOV R5,#8 ;一行有8个字节,如每次显示字数不同要作相应改动
SETB OE
SETB MR
CLR SRCLK
CLR RCK
SETB P1.6
SETB P1.7
LQ: CLR C
MOV R2,#8
MOV A,@R0
; CPL A ;TPIC6B595应该不用这一步
LCALL DD1;调用显示一个字节的子程序
INC R0;指向下一个显示单元
DJNZ R5,LQ
RET
DD1: CLR SRCLK;清串行CP端
RLC A;
MOV SER,C
SETB SRCLK ;触发串行CP端
DJNZ R2,DD1;每个字节移8次够了向下执行
RET
;选通行子程序
XH: CLR RCK ;将输出CP变成低电平为上升沿做准备
NOP
SETB RCK
CLR P1.6
;CLR P1.7
MOV A,27H
MOV P0,A
CLR OE
LCALL DE25MS
INC A
SETB OE
SETB P1.6
MOV A,27H
ANL A,#0F0H
SWAP A
ADD A,#01H
SWAP A
MOV 27H,A
CLR MR
SETB MR
RET
DE25MS: MOV R5,#09H
DEL2: MOV R6,#0FH
DEL3: MOV R7,#01H
DJNZ R7,$
DJNZ R6,DEL3
DJNZ R5,DEL2
RET
TAB:
字库
END
两点说明:
1. 上述程序可以整屏四个字一起显示,要是要显示你说的那么些字,还得作半屏控制,实现汉字滚动,太麻烦,一时半会儿出不来。
2.
TAB:
字库
END
上面的字库根据你要显示的字,自己弄一下吧,给你个例子:
显示“欢迎光临”的话,字库为:
TAB: ;欢
DB 00H,20H,3CH,10H
DB 44H,08H,84H,04H
DB 04H,03H,04H,03H
DB 84H,04H,44H,08H
DB 3CH,10H,00H,20H
DB 00H,00H,07H,20H
DB 04H,10H,0F4H,0FH
DB 04H,10H,1CH,20H
;迎
DB 00H,00H,49H,20H
DB 6AH,10H,0DCH,0FH
DB 08H,10H,00H,20H
DB 0FEH,27H,02H,22H
DB 02H,21H,81H,20H
DB 00H,20H,02H,20H
DB 0FEH,2FH,02H,22H
DB 02H,22H,0FEH,21H
;光
DB 00H,00H,00H,20H
DB 22H,20H,24H,20H
DB 28H,10H,30H,08H
DB 0E0H,07H,3FH,00H
DB 20H,00H,0F0H,3FH
DB 28H,20H,24H,20H
DB 22H,20H,20H,20H
DB 00H,38H,00H,00H
;临
DB 00H,00H,0F0H,03H
DB 00H,00H,00H,00H
DB 0FFH,3FH,00H,00H
DB 40H,00H,20H,3FH
DB 10H,21H,0FH,21H
DB 14H,21H,24H,3FH
DB 44H,21H,04H,21H
DB 04H,21H,04H,3FH
DB 00H,00H,00H,00H
END ;程序结束
字模生成软件生成代码,根据你的电路给数据驱动led。
{0x14,0x20,0x24,0x10,0x44,0x4C,0x84,0x43,0x64,0x43,0x1C,0x2C,0x20,0x20,0x18,0x10},
{0x0F,0x0C,0xE8,0x03,0x08,0x06,0x08,0x18,0x28,0x30,0x18,0x60,0x08,0x20,0x00,0x00},/*"欢",0*/
{0x40,0x40,0x41,0x20,0xCE,0x1F,0x04,0x20,0x00,0x40,0xFC,0x47,0x04,0x42,0x02,0x41},
{0x02,0x40,0xFC,0x5F,0x04,0x40,0x04,0x42,0x04,0x44,0xFC,0x43,0x00,0x40,0x00,0x00},/*"迎",1*/
{0x00,0x00,0x40,0x80,0x42,0x40,0x44,0x20,0x5C,0x18,0xC8,0x07,0x40,0x00,0x7F,0x00},
{0x40,0x00,0xC0,0x3F,0x50,0x40,0x4E,0x40,0x44,0x40,0x60,0x40,0x40,0x78,0x00,0x00},/*"光",2*/
{0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00,0xFE,0x7F,0x40,0x00,0x30,0x00,0x8F,0x7F},
{0x0A,0x21,0x08,0x21,0x18,0x3F,0x68,0x21,0x08,0x21,0x88,0x7F,0x08,0x01,0x00,0x00},/*"临",3*/
c语言、浮点数怎么变成16进制
数据类型的作用是说明数据和操作的意义,换句话说给定一块内存,可以说它是int类型,也可以说它是float类型。同时C语言中输出十六进制数,必须是整型数,因此,可以使用union联合体来输出浮点数的16进制。示例代码如下:include <stdio.h>union fi{float f;int i;} ufi;int main(){ufi.f = 1.1f;...
C语言中的十六进制如何书写?
C语言中的十六进制,主要用于描述整型常量,细分而来有两类,一类是整型常量,一类是转义字符常量。1、整型常量,一般以0x开头。比如 unsigned ui = 0x3f8ccccd;2、转义字符常量,一般以\\x开头,比如 char x = '\\x31';
C语言中16进制之间的加减乘除运算怎么做?
可以参考下面的代码:int a,b;scanf("%x%x",&a,&b);printf("%x\\n%x\\n",a+b,a-b);输入:9 7 输出:10 2
1 2 3 4 8 7 6 5 9 10 11 12 16 15 14 13用c语言写出哈。
include<stdio.h> int main(){ printf("1 2 3 4 \\n8 7 6 5\\n 9 10 11 12\\n 16 15 14 13\\n");return 0;} 使用循环 include <stdio.h> int main(){ int i,j,a[4][4]={1,2,3,4,8,7,6,5,9,10,11,12,16,15,14,13};for(i=0;i<4;i++){ for(j=0;j<4;j...
C语言的问题,char型输出的16进制数值怎么输出十进制值来直接利用_百度...
1、对计算机来说,某一个变量不管是char,int,它在存储时都是二进制的数字而已,输出16进制应该是在com_putchar中控制的,对于一个数来说,输出的格式是几进制是程序来控制的,比如printf("%d", dl), 那么送到终端显示的是十进制的,如果是%x就是16进制,%o就是8进制,但是在程序里,dl就是一...
C语言输出四位16进制的数,用%X,高位为零时会不输出来,请问怎样输出高位...
这个你可以用C语言提供的输出控制来控制,printf("%4x",a);a是一个4位的16进制数 其中的4表示给它留四个空间,意思是占4位,不够的话,补零,不过你也可以根据需要填充其他字符,默认是左右对齐,即前面补零,如果是%-4x则是左对齐,后面补零,可以根据需要设置 ...
如何用C语言将一个16进制数转换成10进制数,要求用函数。
\/\/这个函数不用编写,可以直接在zhs函数里面用语句写的\/\/ { c=c%16;if(c>=0&&c<=9){c=c+48;putchar(c);} else { c=c+87;putchar(c);} } void zhs(int c){ if(c<=15)shuchu(c);else { zhs(c\/16);shuchu(c);} } void main(){ int n;printf("please enter a numb...
C语言中如何将16位结构体定义为4位和12位两部分
1、可以通过位域来实现,如下:struct int_16 { unsigned a : 4; \/\/占4位的部分变量名为a unsigned b : 12; \/\/占12位的部分变量名为b } ;2、在c语言中定义bit型变量,可以使用位域来自定义。位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:struct 位域...
...点阵LED循环显示“北京欢迎你”,这个程序用C语言该怎么写
这个图片会压小。看大图到这看 http:\/\/0e.images22.51img1.com\/6000\/kgd235143\/e4be871c454f0c1d6f7f46b964dacee7.jpg 要仿真的话我发给你,当然实际电路要三极管驱动 include <reg52.h> define uchar unsigned char uchar i,j,k=15;sbit xsi=P2^0;sbit xrck=P2^1;sbit xsck=...
如何用C语言实现两个16进制数的异或
C语言中,异或运算符是^。不管运算对象是10进制的数还是16进制的数(或其他进制的数),进行^运算时,都是将运算对象转换为二进制,按位进行异或运算。举例说明如下:int a=0x9a, b=0x56;int c = a^b; \/\/ 将a和b进行异或运算 运算过程是 a = 1001 1010 \/\/ 0x9a b = 0101 0110 ...
鬱航同铭: 当初的读点阵显示汉字的程序: int out16hz(int x, int y, int color, char *p) {Word i, QM, WM, f=0;int record, i1, i2, i3;long pointer;char Bit[32];while ((i=*p++) != 0){if (f == 0){if (i < 128) /*显示ascii码*/{pointer = i * 16L;lseek(flagasc, pointer, ...
乐至县18776559427: 滚动字幕c语言编程求一个16*16的LED点阵屏滚动字幕的C语言程序 - ?
鬱航同铭: 这算是单片机上应用吧. 先要看LED点阵屏所需参数(驱动,速度,点阵显示汉字串口),这个看懂了也就会了.当然先要会C语言 要是不会,直接用那就找差不多的改. http://blog.163.com/heaphone2010@126/blog/static/1684254352010112693739548/ 这里有一个16*128的.
乐至县18776559427: 用单片机控制的16x16点阵LED循环显示“旋影电子信息协会期待你加入”,这个程序用C语言该怎么写 - ?
鬱航同铭: 只能给你提供一个思路了!!按照这个思路写程序就可以啦!!首先,你的显示设备是点阵,所以要把你要现实的文字转换成点阵,这个需要一些软件,或者自己用画图程序画出点阵,就可以了.然后,就是显示了!!按照字符点阵的数据,看字符点阵的二进制,是1就点亮LED点阵对应的LED,是0就熄灭对应的LED,这样就出现显示汉字的效果了,以此类推,即可显示所有汉字!!
乐至县18776559427: 如何通过串口助手实现16*16LED单色点阵显示8个字,用C语言的 - ?
鬱航同铭: 串口助手? PC上的 串口助手?LED单色点阵 有控制器 嘛?应该有说明书 吧?或者 是 单片机 控制?我 猜想:串口助手 发来 字对应的 代码,单片机接收 后 点亮对应的 LED
乐至县18776559427: C语言编写程序用于16LED显示屏键盘输入汉字LED屏输出 - ?
鬱航同铭: #include<reg52.h>
乐至县18776559427: 16*16点阵显示 - ?
鬱航同铭: ;16X16LED点阵流动显示 ;逐列、逆向(低位开始)扫描 ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV DPTR,#TAB ;字码表初址
乐至县18776559427: 基于LED显示屏设计C语言编程 - ?
鬱航同铭: 本设计是在51单片机与PC机上实现基于RS232串行通讯功能的,制定和实现可靠的上下位机通讯协议,完成显示数据的下传和读取,图形和文字有静止、移入移出等多种显示方式是本设计的最大特点.第二章 系统组成与工作原理2.1系统设计...
乐至县18776559427: 用C语言编写,单片机控制LED灯并用定时器延时,每隔一秒使LED依次点亮 - ?
鬱航同铭: 定义一个引脚,用一个while,分别赋值0.1,中间用delay()
乐至县18776559427: 用74HC154控制16个LED的亮灭 - ?
鬱航同铭: 电路图是什么样的? 不然无法运行. 基本上用c语言写的话: while(1)//主函数 {P1=0xff;P2=0xff; }
乐至县18776559427: 80c51系列单片机16个LED顺序点亮的程序怎么写 - ?
鬱航同铭: 这还得看你的电路图了,不过如果用最简单,最笨的方法就是分别用P0,P1直接控制16个LED 这样的话程序为: #include<reg52.h> #include<intrins.h> #define uchar unsigned char void main() {uchar num=0x01;while(1){for(i=0;i<8;i++){ P0...