点阵LCD中具体的像素点和十六进制数的关系

http://bbs.csdn.net/topics/90113612

点阵字库就是将一个字分成m x n个小方块,每个小方块相当于一个像素,每个像素用1 bit记录点的颜色,字体颜色或背景颜色。比如1表示字体颜色0表示背景颜色。


据我猜测,你写出的点阵字库是16X16的。即每个字有16X16个像素。一般16X16点阵字库是横向扫瞄
两个字节记录一行的16个像素。比如:0x03 0x0f写成二进制是:
0000001100001111,象素值为0在相应位置显示背景色,1显示字体颜色。


http://blog.csdn.net/u012519969/article/details/17298011

下面的二维数组定义了10个数字的字模(要是采用别的字体,这个数组中的数字变一下即可):

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. char a[10][8]=  
  2. {  
  3.     {0x00,0x18,0x24,0x24,0x24,0x24,0x24,0x18}, //0  
  4.     {0x00,0x18,0x1c,0x18,0x18,0x18,0x18,0x18}, //1  
  5.     {0x00,0x1e,0x30,0x30,0x1c,0x06,0x06,0x3e}, //2  
  6.     {0x00,0x1e,0x30,0x30,0x1c,0x30,0x30,0x1e}, //3  
  7.     {0x00,0x30,0x38,0x34,0x32,0x3e,0x30,0x30}, //4  
  8.     {0x00,0x1e,0x02,0x1e,0x30,0x30,0x30,0x1e}, //5  
  9.     {0x00,0x1c,0x06,0x1e,0x36,0x36,0x36,0x1c}, //6  
  10.     {0x00,0x3f,0x30,0x18,0x18,0x0c,0x0c,0x0c}, //7  
  11.     {0x00,0x1c,0x36,0x36,0x1c,0x36,0x36,0x1c}, //8  
  12.     {0x00,0x1c,0x36,0x36,0x36,0x3c,0x30,0x1c}, //9  
  13. };  
这个数组,表示的是数字的字模?这,这,从何说起?

  以数字3对应的数据a[3]({0x00,0x1e,0x30,0x30,0x1c,0x30,0x30,0x1e}, //3)为例,包括有8个十六进制的数,每行一个十六进制数,并且换成二进制的表示,会是什么样的呢?

  是这样的:

00000000  //0x00
00011110  //0x1e
00110000  //0x30
00110000  //0x30
00011100  //0x1c
00110000  //0x30
00110000  //0x30
00011110  //0x1e
  请看1出现的地方,可以借着鼠标按1出现的轨迹跟着划一划,不就是 数字3字型的轮廓 吗?只不过,耳朵状的3是反着的(这自有道理,看完程序1自会明白)。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include<iostream>  
  2. using  std::cout;  
  3. using std::endl;  
  4. using std::cin;  
  5. char a[10][8]=  
  6. {  
  7.     {0x00,0x18,0x24,0x24,0x24,0x24,0x24,0x18}, //0  
  8.     {0x00,0x18,0x1c,0x18,0x18,0x18,0x18,0x18}, //1  
  9.     {0x00,0x1e,0x30,0x30,0x1c,0x06,0x06,0x3e}, //2  
  10.     {0x00,0x1e,0x30,0x30,0x1c,0x30,0x30,0x1e}, //3  
  11.     {0x00,0x30,0x38,0x34,0x32,0x3e,0x30,0x30}, //4  
  12.     {0x00,0x1e,0x02,0x1e,0x30,0x30,0x30,0x1e}, //5  
  13.     {0x00,0x1c,0x06,0x1e,0x36,0x36,0x36,0x1c}, //6  
  14.     {0x00,0x3f,0x30,0x18,0x18,0x0c,0x0c,0x0c}, //7  
  15.     {0x00,0x1c,0x36,0x36,0x1c,0x36,0x36,0x1c}, //8  
  16.     {0x00,0x1c,0x36,0x36,0x36,0x3c,0x30,0x1c}, //9  
  17. };  
  18. int main()  
  19. {  
  20.     int b[8];  
  21.     int c[10];  
  22.     int x;  
  23.     int n;  
  24.     int num=0;  
  25.     cout<<"输入要显示的数字:";  
  26.     cin>>n;  
  27.     while(n!=0)  
  28.         //选择whie与for循环的关键一点是:结束循环的条件的确定  
  29.         //如果用for循环如何确定这个结束条件呢?  
  30.         //这么写  
  31. //  for(k=0; n&&k<8; k++)   //c数组将分离出n中的各位数,不过是倒着的,例n=123,c中保存3 2 1  
  32. //        {  
  33. //            c[k]=n%10;  
  34. //            n/=10;  
  35. //        }  
  36.     {  
  37.         c[num]=n%10;  
  38.         n=n/10;  
  39.         num++;  
  40.     }  
  41.     for(int i=0;i<8;i++)  
  42. //  for循环的次序能够影响输出的格式,  
  43. //  i与q的调换就是 横着与竖着输出,这里犯错误了,  
  44. //  基本弄明白了。需要再熟练理解。  
  45.     {  
  46.         for(int q=num-1;q>=0;q--)  
  47.         {  
  48.             x=a[c[q]][i];  
  49.            for(int j=0;j<8;j++)  
  50.            {  
  51.                b[j]=x%2;  
  52.                x=x/2;  
  53.                 if(b[j]%2)cout<<"p";  
  54.                else cout<<" ";  
  55.          }  
  56.        }  
  57.         cout<<endl;  
  58.     }  
  59.     return 0;  
  60. }  

这是一个可能的汇编代码实现: ``` ORG 0x0000 ; 程序起始地址 ; 定义常量 DELAY_TIME EQU 1000 ; 延迟时间 LED_DATA EQU 0x1000 ; LED点阵据存储地址 ; 定义变量 NUM DW 0x12 ; 要显示的十六进制 START: ; 初始化 MOV AX, LED_DATA ; 将LED点阵据存储地址存入AX寄存器 MOV DS, AX ; 将AX寄存器的值存入DS寄存器 MOV CX, 8 ; 初始化循环计器 ; 取出十六进制的两个字 MOV AX, NUM ; 将要显示的十六进制存入AX寄存器 SHR AX, 8 ; 右移8位,取高位字 MOV BX, AX ; 将高位字存入BX寄存器 AND BX, 0x0F ; 取低4位 MOV AX, NUM ; 将要显示的十六进制存入AX寄存器 AND AX, 0x0F ; 取低4位 MOV DX, AX ; 将低位字存入DX寄存器 ; 循环显示每一行 ROW_LOOP: ; 显示高位字 MOV AX, 0x0001 ; 初始化掩码 SHL AX, BX ; 左移BX位,生成掩码 MOV [DS:CX], AX ; 将掩码存入LED点阵据存储区 CALL DELAY ; 延迟一段时间 MOV [DS:CX], 0x0000 ; 将LED点阵据存储区清零 CALL DELAY ; 延迟一段时间 ; 显示低位字 MOV AX, 0x0001 ; 初始化掩码 SHL AX, DX ; 左移DX位,生成掩码 MOV [DS:CX], AX ; 将掩码存入LED点阵据存储区 CALL DELAY ; 延迟一段时间 MOV [DS:CX], 0x0000 ; 将LED点阵据存储区清零 CALL DELAY ; 延迟一段时间 LOOP ROW_LOOP ; 循环显示每一行 ; 程序结束 RET ; 延迟函 DELAY: PUSH AX ; 保存寄存器现场 PUSH BX PUSH CX MOV CX, DELAY_TIME ; 初始化循环计器 DELAY_LOOP: NOP ; 空操作,等待一段时间 LOOP DELAY_LOOP ; 循环延迟 POP CX ; 恢复寄存器现场 POP BX POP AX RET ``` 这个程序实现了将一个8*8的LED点阵用来显示一个两位十六进制。程序首先定义了一些常量和变量,然后进入主程序。主程序首先进行初始化,将LED点阵据存储地址存入DS寄存器,然后取出要显示的十六进制的两个字。接着,程序进入循环,每次循环显示一个字的一行。显示字的方法是将字转换为一个二进制掩码,然后将掩码存入LED点阵据存储区,再延迟一段时间后清零。程序使用一个延迟函来实现延迟,这个函使用了循环计器和空操作来等待一段时间。最后,程序结束并返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值