【韩祝鹏的回答(99票)】:
怎么显示出字符?
你是想问:只能执行数值逻辑运算的CPU最终如何在显示器上显示出文字? 对吧。
广义的“输出” 包括很多,比如显示器、打印机、绘图仪、甚至写磁盘、写网络,都算是输出。
我们以如何在屏幕上显示来举例说明。
其实要想理解这个原理,看看单片机如何点亮LED灯、如何写一个LCD屏幕,会更加直观。因为现在的PC机,已经包装了太多层了,很难一下子弄明白。我们一步步来:
一个Arduino 单片机的例子:
上面中下部那个黑长条,就是一个微型的计算机,包含了CPU及内存,输入输出控制等。上面中下部那个黑长条,就是一个微型的计算机,包含了CPU及内存,输入输出控制等。
它的代码很简单:它的代码很简单:
void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
}
上图中,发光二极管的正极接到第13个接口,负极接地。程序启动时,将第13数字接口设置为输出(OUTPUT),然后给这个接口写入一个高电平。这样,LED灯就亮了。
在这个单片机里包含了一个CPU,它执行二进制的程序,根据程序去控制这些IO接口,与IO接口相连的外部设备就可以响应了。当然,这是最最简化的一种情况,复杂的外设控制起来需要特别复杂的程序,一般会封装成驱动程序。
能点亮一个LED,就可以点亮很多:
上图中 16X16 共256个LED灯,你可以把它看成是一个16X16分辨率的单色显示器。我们通常用的液晶屏幕,分辨率在1024X768甚至更高,但是原理可以认为类似。上图中 16X16 共256个LED灯,你可以把它看成是一个16X16分辨率的单色显示器。我们通常用的液晶屏幕,分辨率在1024X768甚至更高,但是原理可以认为类似。
在第一个例子中,一个LED灯接入了单片机上一个输出接口里,但是这个单片机没有256个那么多的输出口怎么办?我们看这个图里,实际上上面的单片机和下面的LED板子之间的连线并不多。(只有5根,还有两根是供电的)。cpu通过向这5根数据接口里写入高低电平的信号,与下面的显示板通讯。其实就是告诉下面,第几排第机列的LED灯是点亮还是灭掉。
像上面这个图,会发出类似这样的信息:
第2排第2列,点亮
第2排第3列,点亮,
。。。。
那么我们要输出一个文字,岂不是要写很麻烦的程序?
这些麻烦事底层的程序帮我们做了。
例如,我们最后的程序想要输出这个“陆”字,只要像下面这样写:
(write "陆")
print "陆"
printf("陆")
我们继续看个更复杂些的例子,用Arduino驱动诺基亚5110液晶屏显示文字,帖个帖子的地址:
arduino uno + nokia 5110
你可以看下帖子里的程序。那个程序里有个数组:你可以看下帖子里的程序。那个程序里有个数组:
static const byte ASCII[][5] =
{ ........................
{
0x7e, 0x11, 0x11, 0x11, 0x7e } // 41 A
,{
0x7f, 0x49, 0x49, 0x49, 0x36 } // 42 B
,{
0x3e, 0x41, 0x41, 0x41, 0x22 } // 43 C
。。。。。这就是每个字符对应的“样子”,就是一个5X8的矩阵。就是字体。
其中我们只需要写:
gotoXY(2,2);
LcdString("Albert Lee");
这样的语句就可以了,LcdString 函数会调用LcdCharacter 函数来写一个个字符。LcdCharacter函数会查每一个字符对应的“字体表”,得到对应的一个矩阵,这个矩阵对应到屏幕上一块矩形区域,矩阵中是1的位置,屏幕上对应点就点亮,是0的位置,屏幕上对应点就灭。
现在我们常用的Windows或 Linux,将这些显示文字的功能做到操作系统及驱动中了,但整体的过程与上面那个程序是类似的。
不同的编程语言,不管是编译的还是解释的,最终都会调用到系统提供的辅助程序,它们会把输出的字符翻译成一个二维的点阵,然后把这个点阵显示到屏幕上面。
CPU不单单是数字运算,它其实包含一个叫 ALU 的部件:Arithmetic logic unit 算术与逻辑单元。所有的信息,不管是文字还是图像、声音,都可以转换成二进制的数据,而处理他们需要用到计算和逻辑判断的组合。
这里说得很笼统也不严谨,如果想要深入的了解这方面知识,有一门专门的课程:计算机体系结构。
你现在在学SICP的话,可以先把这些疑问放下,只需要知道下面有一层一层的抽象,把你的程序从S表达式变成电子的运动。
SICP课程的精髓,就是讲抽象。