汉字通过字模用点阵显示的问题(附代码),达人们请帮忙看一下

lgytj 2003-11-06 09:18:16
我用Vb写了个读取字模点阵显示汉字的程序,但显示出来的汉字很奇怪,不正确,我用的是ucdos的hzk16字模。下面是程序,请帮忙看一下
/////////////////////////////////
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Dim TempFile As String
Private Sub CmdCnt_Click()
Dim TempSrcFile As String
Dim TempDestFile As String
Dim HzFile As String
Dim To61202(32) As Integer
Dim p(1 To 2) As Byte
Dim C1, C2
Dim rec As Integer
Dim Location As Long '汉字在字库中的位置
Dim Hz(0 To 31) As Byte '转换完的32字节的字模数据
Dim HzAll() As Byte '存放全部字模数据的动态数组
Dim LoopAll As Integer
Dim bit, k2, k3 As Byte
Dim i, j, i1, k, k1, k4, k5, k6 As Integer
Dim i2, i3, i4, HzChar As Integer
Dim CharTo2 As String
Dim HzCol%, HzRow%
Form1.Cls
DestTxt.Text = "" 'DestTxt是目标文本框,存放转换后的16进制数据
Flag = 0
TempDestFile$ = App.Path + "\" + "TempDest.txt"
If SrcTxt.Text = "" Then '汉字输入框内无汉字则退出
MsgBox "没有可以转换的字模源文件!"
Exit Sub
End If
HzNum = Len(SrcTxt.Text) '获得汉字的个数
ReDim HzAll(0 To HzNum * 32 - 1) '重新定义动态数组的上界
Open TempFile For Output As #1
Print #1, SrcTxt.Text
Close #1

For LoopAll = 0 To HzNum - 1
Open TempFile For Binary Access Read As #1 '按二进制方式打开
Get #1, 2 * LoopAll + 1, p
Close #1

C1 = CStr(p(1)) - &HA1 '区内码
C2 = CStr(p(2)) - &HA1 '位内码
rec = C1 * 94 + C2
Location = CLng(rec) * 32 + 1 '该汉字在16*16点阵字库中字模第一个字节的位置

HzFile = App.Path + "\" + "hzk16.txt"
Open HzFile For Binary Access Read As #1 '读取该汉字在16点阵字库中的原始字模
Get #1, Location, Hz
Close #1

''''''''''''''''''''''''''''''''''
HzCol% = Form1.ScaleLeft
HzRow% = 0
For i4 = 0 To 15 '字模垂直方向16行点

For i2 = 0 To 1 '每行16个点对应的两个字节

'HzChar = Asc(Mid$(Hz, i4 * 2 + i2 + 1, 1)) '每个字节的ASCII值
HzChar = Asc(Hz(i4 * 2 + i2))

CharTo2 = Ten2Two(HzChar) '转为二进制(字符串格式)

For i3 = 0 To 7 '每个字节的8位

'If (HzChar(2 & (7 - i3))) And &H1 Then '若该位是1
If (Val(Mid(CharTo2, i3 + 1, 1))) And &H1 Then '若该位是1
Form1.PSet ((i2 * 8 + i3) * 100, i4 * 100), RGB(Red, 0, 0)
End If

Next i3

Next i2

Next i4

HzCol% = HzCol% + 16 '将光标置于下一个字符的左上角


Next LoopAll

Open TempDestFile For Binary Access Write As #1 '转换结果保存到TempDestFile中

Put #1, 1, HzAll

Close #1

MsgBox "OK!"


End Sub

Private Sub Form_Load()
Dim LocaleID As Long
LocalID = GetSystemDefaultLCID

TempFile = App.Path + "\" + "TempSrc.txt"

End Sub

Private Sub SrcTxt_Change()
Static SStr As String

Dim LocaleID As Long
LocalID = GetSystemDefaultLCID

Dim i As Integer

' Dim TempFile, TempFileBinary As String
Dim TempFileBinary As String

TotalNum = 0

l = Len(SrcTxt.Text)

For i = 1 To l

'tmpStr = StrConv(Mid$(SrcTxt.Text, i, 1),vbWide, 2052)


If Asc(Mid$(SrcTxt.Text, i, 1)) < 0 Then

TotalNum = TotalNum + 1

SStr = SrcTxt.Text

Else

MsgBox "写入的不是汉字!"

SrcTxt.Text = Left(SrcTxt.Text, Len(SrcTxt.Text) - 1)

Exit Sub

End If

Next i

LblNum.Caption = Str$(TotalNum) + "个汉字"


'TempFileBinary = App.Path + "\" + "TempSrcBinary.txt"

Open TempFile For Output As #1

Print #1, SrcTxt.Text

Close #1


End Sub
Public Function Ten2Two(ByVal varNum As Integer)
'将十进制数转化为定长8位的二进制串
'输入参数可以为&h类的十六进制
Dim returnString As String, ModNum As Integer
If varNum > 0 Then
Do While varNum > 0
ModNum = varNum Mod 16
varNum = Fix(varNum / 16)
returnString = Trim(Str(ModNum)) + returnString
Loop

Dim i As Integer
For i = 1 To 8 - Len(returnString)
'不足8位时,在前面补上0
returnString = 0 & returnString
Next
Ten2Two = returnString
ElseIf varNum < 0 Then
Do While Abs(varNum) > 0
ModNum = Abs(varNum) Mod 16
varNum = Fix(varNum / 16)
returnString = Trim(Str(ModNum)) + returnString
Loop

Dim j As Integer
For j = 1 To 8 - Len(returnString) - 1
'不足8位时,在前面补上0
returnString = 0 & returnString
Next

Ten2Two = 1 & returnString
End If
End Function
...全文
492 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiyunhui 2003-11-06
  • 打赏
  • 举报
回复
帮你顶一下。
笨狗先飞 2003-11-06
  • 打赏
  • 举报
回复
会不会是高低位反的?
lgytj 2003-11-06
  • 打赏
  • 举报
回复
BigFatBear(笨熊),你好
我那句
'HzChar = Asc(Mid$(Hz, i4 * 2 + i2 + 1, 1)) '每个字节的ASCII值
HzChar = Asc(Hz(i4 * 2 + i2))

CharTo2 = Ten2Two(HzChar) '转为二进制(字符串格式)
之所以要转换是因为HzChar = Asc(Hz(i4 * 2 + i2))得到的值与前面注释掉的一句'HzChar = Asc(Mid$(Hz, i4 * 2 + i2 + 1, 1))的结果不同
并且这一句 If (HzChar(2 & (7 - i3))) And &H1 括号里的操作我看不懂,您能解释一下吗?谢谢
rainstormmaster 2003-11-06
  • 打赏
  • 举报
回复
你是参考这个写的吧:
http://tech.sina.com.cn/c/754.html

看看下面这段话:
与在西文DOS中显示汉字不同的是,图形点阵液晶并不是简单地用画点的方式来描出汉字。以常用的HD61202图形点阵液晶显示控制模块为例,它能控制64×64点阵液晶的显示,其显示RAM共64行,分8页,每页8行,每一页的数据寄存器分别对应液晶屏幕上的8行点,对显示RAM的一个字节单位赋值就是对当前列的8行(一页)的像素点是否显示进行控制。连续16列和相邻的2页的32字节显示RAM就可以控制一个汉字的显示区域。对这些显示RAM赋以相应的值就可以显示出一个汉字。
HD61202图形点阵液晶显示控制模块的汉字字模的排列实际上是标准汉字字模排列形式旋转而成的。对标准汉字字模转换的目的就是在单片机系统的数据存储器中(如E2PROM)存储经过调整的连续32字节的16进制数。
gpo2002 2003-11-06
  • 打赏
  • 举报
回复
你可以参考TC里面DOS下显示汉字程序
BigFatBear 2003-11-06
  • 打赏
  • 举报
回复

'HzChar = Asc(Mid$(Hz, i4 * 2 + i2 + 1, 1)) '每个字节的ASCII值
HzChar = Asc(Hz(i4 * 2 + i2))

CharTo2 = Ten2Two(HzChar) '转为二进制(字符串格式)
//不知为啥要转还??

For i3 = 0 To 7 '每个字节的8位

'If (HzChar(2 & (7 - i3))) And &H1 Then '若该位是1
If (Val(Mid(CharTo2, i3 + 1, 1))) And &H1 Then '若该位是1
//CharTo2 类型改为字节数组更处理好吧
Form1.PSet ((i2 * 8 + i3) * 100, i4 * 100), RGB(Red, 0, 0)
End If

从字库取出的字节数组按下列顺序排列各位的值显示出来就应改是汉字的(假设取得的数组位TempBuff)
TempBuff(0),TempBuff(1)
TempBuff(2),TempBuff(3)
TempBuff(4),TempBuff(5)
TempBuff(6),TempBuff(7)
TempBuff(8),TempBuff(9)
TempBuff(10),TempBuff(11)
TempBuff(12),TempBuff(13)
TempBuff(14),TempBuff(15)

不知能否有帮助?
Boris1981 2003-11-06
  • 打赏
  • 举报
回复
又是看代码
头疼
内容概要:本文提出了一种基于加权稀疏矩阵恢复与加速交替方向乘子法(ADMM)的单通道盲解混响算法,并提供了完整的Matlab代码实现。该方法旨在从仅有的单路接收信号中有效分离出原始声源信号,克服传统多通道方法对硬件的依赖。核心技术结合了信号在时频域的稀疏性先验,通过构建加权机制以增强稀疏矩阵恢复的准确性,并引入加速ADMM算法来优化求解过程,显著提升了算法的收敛速度与计算效率。该算法特别适用于麦克风阵列受限或无法部署的复杂声学环境,能够有效抑制混响干扰,从而显著提升语音信号的清晰度与后续语音识别系统的性能。; 适合人群:具备扎实的数字信号处理、凸优化理论及稀疏表示基础,从事音频信号处理、语音增强、盲源分离或相关领域研究与开发工作的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决单麦克风场景下的语音混响去除难题,提升语音通信质量;②应用于智能助听器、车载语音系统、远程视频会议、人机交互等存在严重混响的实际应用场景;③为盲解卷积、稀疏信号恢复等领域的研究提供一种高效的算法实现范例与优化思路。; 阅读建议:建议读者在深入理解信号稀疏性、ADMM优化框架等理论基础上,结合所提供的Matlab代码进行实践,重点分析加权策略的设计原理及其对恢复性能的影响,并通过调整正则化参数、权重因子等关键变量,探究其在不同混响强度和噪声条件下的鲁棒性与泛化能力。

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧