Freescale家芯片的Keyboard Interrupt的配置

操作环境:CodeWarrior V10.5

使用芯片:MKE02Z32VLC(后简称KE02)、S08QB8CWL(后简称S08QB8)

1.1 选择KBI模块或Init_KBI模块

KE02和S08QB8等芯片都有KBI外设。但是由于PE的设计的原因,某些芯片,例如KE02,无法添加KBI模块,只能添加Init_KBI模块;而另外一些芯片,例如S08QB8,可以添加KBI模块也能添加KBI_Init模块。

由于KBI模块的Component Level为Low Level Component,而Init_KBI的为Peripheral Initilization。而Low Level Component的Methods里有Init()函数(初始化函数)以外的其他函数,所以我们更倾向于使用KBI模块,而不是Low Level Component模块(简而言之就是有KBI就用KBI,没有再用Init_KBI,两个一起会冲突!)

1.2 配置KBI模块

如果在1.1中选择了KBI模块,则继续往下看(以S08QB8举例)。

  • Pins右侧可以加减使用的管脚数。
  • 各个管脚的中断触发方式通过选择“Generate interrupt on”和各个管脚的“Invert interrupt trigger condition”来选择。先选择“Generate interrupt on”,此为各个管脚公用。再对个别管脚选择“Invert interrupt trigger condition”。(“Invert interrupt trigger condition”选项仅有HCS08,ColdFireV1,RS08系列芯片和部分HC08衍生芯片支持。)
  • S08QB8还为KBI模块提供了一个中断:Vkeyboard。当任何一个按键触发了条件,就会进入该中断对应的ISR。即KBI_OnInterrupt()。
  • 读取各个按键的状态时,可以使用GetVal()函数,将其复给一个char变量即可。

    上文中所对应的配置后的GetVal函数如下。可以看出,该函数会返回一个字节。字节从低位到高位分别为pin0~pinN的输入值。其进行一系列位操作之后,输出该字节。

byte KB1_GetVal(void)
{
  byte value = 0x00U;
  value |= PTAD & 0x01U;
  value |= ((PTAD & 0x04U) >> 1);
  value |= (byte)((PTBD & 0x01U) << 2);
  value |= (byte)((PTBD & 0x04U) << 1);
  return value;
}

但是如果不是用如上中的配置,例如将pin0~pin3设置成PTA0~PTA3,则PE会非常智能的只在KBI.h文件中生成一个宏命令。如下所示。实际结果也是将pin0~pinN从低到高排成一个字节。

#define KB1_GetVal() ((byte)(PTAD & 0x0FU))

1.3 配置Init_KBI模块

如果在1.1中选择了Init_KBI模块,则继续往下看(以KE02举例)。

  • Init_KBI模块和KBI模块不同之处在于Init_KBI的管脚号对应的Init_KBI的pin号是固定的。PTB1只能是Input pin5,不能是其他的Input pin。想使用别的Input pin需要对其使能。
  • 如果将鼠标移动到“ISR name”上并悬停就会出现提示。
  • 提示说明想要用KBI,中断就要自己写了!自己写中断的过程大致如下。

1.在KBI.h中声明中断,比如像这样声明。

PE_ISR(KB1_Interrupt);

2.在KBI.c中实现中断,比如如下。

PE_ISR(KB1_Interrupt)
{
  IRQ_PDD_ClearInterrupt(IRQ_BASE_PTR);		//clear the interrupt flag
  //do whatever u want here XD
}

3.修改Vector.c中的中断向量表,比如进行如下修改。

(tIsrFunc)&Cpu_Interrupt,/*0x28  0x000000A0-ivINT_KBI0 unused by PE */

修改为

(tIsrFunc)&KB1_Interrupt,/*0x28  0x000000A0-ivINT_KBI0 unused by PE */

4.All done!

后记:实际上也没啥难得...就是后面自定义中断的时候如果没写过可能不太好写,如果有点经验的人基本上自定义中断都不会碰见什么问题...

12864液晶屏定制版字模生成程序

在之前这片短文用Ruby和HZK16字库进行字模提取中提到了如何使用HZK16字库提取逐行扫描的字模。

但是12864这块液晶比较奇怪,是逐列扫描的,所以用普通的字模提取软件提取出来的字模是不行的。

本着没事干写代码权当消遣的想法,用Ruby写了下12864液晶屏特供版的字模提取程序。代码的前半部分和之前用的一样,先提取出来正常的字模。然后用最傻大黑粗的方法直接将16x16的字点阵的数据存到一个16x16的二维数组里面,然后在用逐列输出的方法输出一下即可。如果再碰到其他的奇怪的液晶,也可以采用这种傻大黑粗的方法,虽然不太文雅,不过代码写起来也不用怎么想,抬手就能写,一会就能写完。

废话不多说,代码见下吧。

print "input the Chinese character:"
cstr = gets
str = cstr.encode("gb2312")
arr = []
code = []

str.each_byte {|b| arr<< b}
offset = (arr[0]*94+arr[1]-15295)*32
print "offset in the HZK16 fonts file:"
puts offset

f = File.new("HZK16")
f.seek(offset)
print "file pointer position:"
puts f.pos

if offset==f.pos
puts "file pointer is at the right place!"
end
puts "----------------------------------------"

puts "traditional fonts array:"
for i in 0..31
	code[i] = f.getbyte		#code[i] type: string
	#print code[i].to_s(16)
end
print "{"
for i in 0..30
	if code[i] <= 0x0F
		print "0x0"+code[i].to_s(16)+","
	else
		print "0x"+code[i].to_s(16)+","
	end
end
if code[31] <= 0x0F
	print "0x0"+code[31].to_s(16)
else
	print "0x"+code[31].to_s(16)
end
puts "}"
puts "----------------------------------------"
f.close

#end of original fonts.rb

puts "data matrix (space for 0, # for 1):"
dataMatrix = Array.new(16) { Array.new(16) }
j=0
for i in 0..31
	if (i%2)==0
		for p in 0..7
			dataMatrix[j][p] = (code[i]&(1<<(7-p)))>>(7-p)
		end
	else
		for p in 8..15
			dataMatrix[j][p] = (code[i]&(1<<(15-p)))>>(15-p)
		end
		j+=1
	end
end

for i in 0..15
	for j in 0..15
		if dataMatrix[i][j]==1
			print "# "
		else
			print "  "
		end
	end
	puts ""
end
puts "----------------------------------------"

out = []
for i in 0..31
	out[i]=0
	if i<=15
		for p in 0..7
			out[i] += (dataMatrix[p][i]<<p)
		end
	else
		j = i-16
		for p in 8..15
			out[i] += (dataMatrix[p][j]<<(p-8))
		end
	end
end

f = File.open("fonts output.txt","w+")
puts "fonts in 12864:"
print "{"
f.write("{")
for i in 0..30
	if out[i] <= 0x0F
		print "0x0"+out[i].to_s(16)+","
		f.write("0x0"+out[i].to_s(16)+",")
	else
		print "0x"+out[i].to_s(16)+","
		f.write("0x"+out[i].to_s(16)+",")
	end
end
if out[31] <= 0x0F
	print "0x0"+out[31].to_s(16)
	f.write("0x0"+out[31].to_s(16))
else
	print "0x"+out[31].to_s(16)
	f.write("0x"+out[31].to_s(16))
end
puts "}"
f.write("}")
f.close

puts "press enter to quit:"
while true
	edstr = gets
	if edstr == "n"
		break
	end
end

另外最后写完尝试使用了一下ocra,编译出来了一个exe文件,HZK16也被编译在了里面。妈妈不用再担心字库丢了的问题了!携带更方便!

用Ruby和HZK16字库进行字模提取

又是5.1小长假(3天也叫假?!)。在宿舍补觉之余觉得万般无聊,于是准备把之前一直想做的字模提取的软件做了(主要原因还是之前接触到的12864的字模数据写入方式比较奇葩)。鉴于平时只写过C,而C写GUI简直坑爹。最后挑了个时髦的Ruby从头学学,而且貌似用Shoes做GUI还是挺惬意的样子。

这片短文大致记录一下字模提取的过程。

使用的是UCDOS这个时代的眼泪里自带的16x16点阵字库,从网上简体繁体都能下载到,关键词是HZK16和HZK16F。话说google一下首页都没有UCDOS的官方信息...果然是时代的眼泪么...

大致提取过程也很简单,就是计算一下偏移量(计算的过程网上一搜一大堆,就是计算一下和0xA1A1之间的相对位置关系,而之所以是0xA1A1是因为GB2312从0xA1A1开始),然后连着读取32个字节(16*16/8)存到数组里用16进制输出一下。代码如下所示。

str = "码".encode("gb2312")
arr = []
code = []

str.each_byte {|b| arr<< b}
offset = (arr[0]*94+arr[1]-15295)*32
print "offset:"
puts offset

f = File.new("HZK16")
#if traditional Chinese character is needed
#f = File.new("HZK16F")
f.seek(offset)
print "file pointer position:"
puts f.pos

for i in 0..31
	code[i] = f.getbyte		#code[i] type: string
    #code[i] = f.getc
	print code[i].to_s(16)
	#print code[i].unpack("H*")     #cant split A5FE
	print "tt"
	puts i
end

f.close
sleep

中间碰见的一个问题就是一开始是用f.getc来逐个字节获取字模的,但是不知道为什么第9行的数据0xA5和0xFE会被同时读出来,输出个0xA5FE。导致会把下一个字的字模的第1个数据读出来附到最后,导致无法正常显示。

最后也没找到原因,还是使用getbyte替代了getc来读取字节。

附上最后的输出结果(傻乎乎手动在其他人的字模软件中点亮的...),以后再抽时间把字模的其他的排列方式和GUI写了吧...目前GUI决定用ImageMagick和shoes来搞...到时候再记录吧。

《人狼 JIN-ROH》——吃人的狼,吃狼的人

jinroh

刚入宅的那个时候好像正是“神作党”抬头的时候。

接触了过多的神作党虽然不免的身上沾了不少戾气,见到别人夸赞或是贬低一个作品都会心生冲动,想上去辩个痛快;可也在那个没接触到bangumi这个网站的时候能够很快的对于作品有所分辨。毕竟当年的神作党还只是雏形,人们也只会吹一吹《Evangelion》、《星际牛仔》和《攻壳机动队》之类的作品。还没进化到如今遍地封神,连《Sword Art Online》之流都能被称为神作的地步。

于是那个时候趁着课业不重、春光明媚看了不少好片,以至于现在追新番总觉得提不起劲。记得当时我坐在胖头同学的邻座埋头写代码的时候,就经常能看到他的屏幕上出现素子大姐穿着高叉高空自由落体的情景。一开始我还有些不屑,觉得不过是个卖肉的番。不过好在在胖头同学的极力推荐下,我还是尝试着看了第一集。自此接触到了押井守这个唯恐天下不乱的人。

就像在攻壳中的那个“近未来世界”一样,押井守也在人狼中很好的描绘这个“近过去世界”。两部作品的特点都是背景环境动荡,势力错综复杂,个体在这样的环境下显得有些无力与之抗衡。而视角也都是这个大背景下的个体们,或是倾轧者,或是被倾轧者,但都是这个世界中的参与者,经历都被这个乱世深深的影响着。虽然作品中的世界观都宏大而陌生,但由于对于个体的描写详细而真实,却会让人觉得这个世界不是那么虚假。

回到这个片子上来,片子中也描绘了一个乱世:虚拟的二战后,日本被作为敌人的德国占领。战后百废待兴的状况下,失业率居高不下,大量的流民促进了社会进一步不稳定。而作为战败国无法使用自卫队执行任务,也不愿意让地方性警卫部队借此发展成为全国性的武装,出现了作品主角伏一贵所在的准军事部队——首都警。其与警视厅、地方警、地下武装Sect,共同构成了这部作品中的主要势力。

片子的故事也很简单,就是一个几个势力互相尔虞我诈妄图摆到对方,打着爱情的幌子实则为势力集团倾轧的故事。

片子中使用了不少的象征,包括首都警全套的德式装备,从M35钢盔,到MG42和MP44,还有警视厅使用的MP40、地下武装使用的铁拳等等。加上防毒面具和全身漆黑的盔甲,这种阴森威严的感觉很容易让人直接体会到面对强权是一种如何的感觉。而这几股势力也不得不让人想到二战中德国的国防军、冲锋队和党卫队互相倾轧的历史。不知道作者构建这个故事的时候是否受到了这段历史的启发。

片子中也一再提到了黑暗版的小红帽的故事,最后并不是猎人拯救了小红帽,而是小红帽被大灰狼吃掉。片子的最后,面对着上级的命令,伏一贵也只能看着雨宫圭在自己面前被杀死,雨宫圭也只能绝望的看着自己想象中的“妈妈”变回了“大灰狼”。也正像伏一贵的上司说的,人和野兽是不能共处的,而一朝为狼,终生为狼。伏一贵是无法再变回人类的。

而真正的人狼又是谁呢?仅仅是首都警么?我想并不是这样的。杀死雨宫圭的并不是最后开枪的胖大叔,也不是利用她的警视厅,更不是置她不顾的伏一贵。人狼是这整个乱世,每个人都是“大灰狼”,而每个人又都是“小红帽”。Sect的人们想要一个符合期望的生活环境,而其他的人不想让Sect破坏自己现在的生活环境,才成了首都警。伏一贵和雨宫圭的悲惨故事只是两种不兼容的群体意志碰撞下的牺牲品。在这种强大的力量下面,无论是伏一贵还是雨宫圭,都会显得无比弱小。群体中的每个人一旦进入了这种碰撞,就再也无法脱身,直至成为群体意志的祭品。就像伏一贵至死都只能做一个不允许拥有感情的人狼一样,雨宫圭也永远无法摆脱她的过去,他们永远不能摆脱过去的阴影自由的活着。这才是这个故事真正的悲剧所在。