首先应该清楚点阵的显示原理,先拿 8X8 的点阵举例说明如下:点阵可以看成是由 8 行 8 列的导线交叉排列,在每一个交叉点上放上二极管,这是一个三行三列的示意图。例如我们想点亮中间的一个二极管,只需要让第二行给高电平,第二列给低电平就能点亮了。8X8 的点阵点亮方式也是一样。用这样的方式可以点亮一个 8X8 点阵上的任意一点,那么,如何让一个 8X8 的点阵显示图像呢?我们拿一个箭头示例。这样的话,我们只需要分别算出各行各列上需要点亮的点的数据就可以了,因为要完成整个屏的显示要打开到每一行每一列,所以我们可以让单片机一个数据口端只做行扫描或列扫描(比方说在所有点的阳极做扫描,也就是从第一行依次打开(若是阳极则给高电平)到第 8 行或第一列依次打开到第八列,在打开其中任意一行或一列时其他行或列给高电平或低电平使其关闭显示),这里只说行扫描,从打开第一列 0x01,第二列 0x02,第三列 0x04······第八列 0x80,可以组成数组 code unsigned char tabh[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};然后则是在这些扫描的基础上需要点亮那些点,因为这里是做阳极列扫描,所以要想点亮某些点则需要在这个点所对应的行控制端给低电平。在 点 亮 第 一 列 , 也 就 是 这 个 箭 头 的 最 上 最 左 边 两 个 点 , 二 进 制 数 据 是11100111,换算成十六进制是 0xe7,然后是第二行的四个点 11000011,换算成十六进制是 0xc3,依次到第八行,装进数组则是 code unsigned char tabh[]={0xe7,0xc3,0x81,0x24,0x66,0xe7,0xe7,0xe7};然后我们在这两组数据的基础上用一个 for 循环让这些列数据与行数据同步对应到单片机数据输出口,再加上短暂的延时(因为要动态扫描 8 行 8 列加上延时是为了产生视觉停留效果让人眼看起来动态扫描后就是一副完整的图像)。程序如下:while(1){unsigned char i;for(i=0;i<8;i++){P0=tabl[i];P2=tabh[i];delay(3);}}完整程序如下:#include //头文件code unsigned char tabl[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, //列数组};code unsigned char tabh[8]={0xe7,0xc3,0x81,0x24,0x66,0xe7,0xe7,0xe7 //行数组};void delay(unsigned int z) //延时程序{unsigned int x,y;for(x=z;x>0;x--)for(y=255;y>0;y--);}void main()//主函数{while(1)//while(1)死循环,一直执行 while(1)范围内的程序{unsigned char i;//定义无符号 char 型变量 ifor(i=0;i<8;i++)//for 循环,i<8 则循环 0——7 次{P0=tabl[i];//因为在循环内 i 是从 0 到 8 做自加运算,所以利用 for 循环里的 i 变量做数组的数据选择P2=tabh[i];delay(3);//短暂延时,视觉停留效果}}}