YFROBOT创客社区

标题: 利用arduino控制16*16点阵显示汉字 [打印本页]

作者: YFRobot    时间: 2013-6-20 15:11
标题: 利用arduino控制16*16点阵显示汉字
本帖最后由 AllBlue 于 2020-3-31 07:55 编辑

测试视频:http://v.youku.com/v_show/id_XNTczNDg3NDA4.html
[vedio=375,500]https://player.youku.com/embed/XNTczNDg3NDA4[/vedio]
点阵模块的原理图:
[attach]402[/attach]
方案为:2片74HC164(行)+2片74HC595(列)
下面给出arduino示例代码,用户可通过改变代码中的table1-4数组来改变显示内容,字符生成代码见附件下载,下有使用教程。

  1. /*16*16点阵屏的显示*/        
  2. /*******************
  3. PIN  --  点阵
  4. -------------------
  5. DATA  --  Ser
  6. SCLH  --  Srck
  7. SCLT  --  rck
  8. AB  --  ab
  9. SC  --  ck
  10. *******************/

  11. int DATA=3;                //列数据输出位        
  12. int SCLH=4;                //列扫描时钟位
  13. int SCLT=5;                //列数据锁存位
  14. int AB  =6;                //行数据输出位
  15. int SC=7;                //行扫描时钟位
  16. unsigned char i=0,j=0;
  17. unsigned char date[32];                //32字节RAM做为16*16点阵屏显示缓存

  18. void setup() {               
  19.   // initialize the digital pin as an output.
  20.   pinMode(DATA, OUTPUT);   
  21.   pinMode(SCLH, OUTPUT);
  22.   pinMode(SCLT, OUTPUT);
  23.   pinMode(AB, OUTPUT);
  24.   pinMode(SC, OUTPUT);   
  25. }

  26. int table1[32]={
  27. 0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xFC,0x02,0x00,0x02,0x00,0x3F,0xF0,0x20,0x10,
  28. 0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x24,0x88,0x22,0x44,0x42,0x44,0x80,0x04};/*"点"*/
  29. int table2[32]={
  30. 0x00,0x40,0x7C,0x40,0x44,0x40,0x4B,0xFE,0x48,0x80,0x50,0xA0,0x49,0x20,0x49,0xFC,
  31. 0x44,0x20,0x44,0x20,0x44,0x20,0x6B,0xFE,0x50,0x20,0x40,0x20,0x40,0x20,0x40,0x20};/*"阵"*/
  32. int table3[32]={
  33. 0x00,0x04,0x27,0xC4,0x14,0x44,0x14,0x54,0x85,0x54,0x45,0x54,0x45,0x54,0x15,0x54,
  34. 0x15,0x54,0x25,0x54,0xE5,0x54,0x21,0x04,0x22,0x84,0x22,0x44,0x24,0x14,0x08,0x08};/*"测"*/
  35. int table4[32]={
  36. 0x00,0x28,0x20,0x24,0x10,0x24,0x10,0x20,0x07,0xFE,0x00,0x20,0xF0,0x20,0x17,0xE0,
  37. 0x11,0x20,0x11,0x10,0x11,0x10,0x15,0x10,0x19,0xCA,0x17,0x0A,0x02,0x06,0x00,0x02};/*"试"*/

  38. /*   显示函数   */
  39. void display()
  40. {        
  41.         unsigned char i,ia,j,tmp;  //定义变量
  42.         digitalWrite(AB,LOW);           //将行数据位清0,准备移位
  43.         for(i=0;i<=16;i++)           //循环输出16行数据
  44.         {               
  45.                 digitalWrite(SC,LOW);        //为行移位做准备
  46.                 digitalWrite(SCLT,LOW);        //为列锁存做准备
  47.                 for(ia=2;ia>0;)                //每行16个点,循环位移两个字节,循环两次
  48.                 {        
  49.                         ia--;               
  50.                         tmp=~date[i*2+ia];  //读取点阵数据做输出,                           
  51.                         shiftOut(DATA,SCLH,LSBFIRST,tmp);  //将DATA上的数据移入寄存器                                             
  52.                 }        
  53.                  PORTD |= 0xa0;                //移入两个字节结束,SCK\SCLT拉高.
  54.                 digitalWrite(AB,HIGH);        //行数据位只在第一行时为0,其它时候都为1
  55.                                                          //移位的过程,AB就必需是1
  56.         }                                                                        
  57.         j=64;
  58.         while(j--);                //每一行的显示,保持两个字节的移位时间
  59.         digitalWrite(SC,LOW);                        
  60.         digitalWrite(SC,HIGH);        //将最后一行数据移出
  61. }

  62. /*   timer=1时,为1s左右的延时   */
  63. void display_time(unsigned int timer)        //指定时间扫描显示
  64. {
  65.         unsigned char i;        
  66.         while(timer--)
  67.         {               
  68.                 i=110;               
  69.                 while(i--)
  70.                         display();
  71.         }
  72. }

  73. void disp()
  74. {
  75.     for(i=0;i<32;i++)
  76.         date[i]=table1[i];//将"点"字数据复制到显示缓存
  77.         display_time(2);        //显示约2秒
  78.    
  79.     for(i=0;i<32;i++)
  80.         date[i]=table2[i];//将"阵"字数据复制到显示缓存
  81.         display_time(2);        //显示约2秒

  82.     for(i=0;i<32;i++)
  83.         date[i]=table3[i];//将"测"字数据复制到显示缓存
  84.         display_time(2);        //显示约2秒

  85.     for(i=0;i<32;i++)
  86.         date[i]=table4[i];//将"试"字数据复制到显示缓存
  87.         display_time(2);        //显示约2秒
  88. }
  89. void loop()
  90. {        
  91.     disp();               
  92. }
复制代码
字符生成方法如下,下载附件中的点阵生成工具,打开软件,“模式”里面选择“字符模式”
[attach]403[/attach]
点击“选项”,进行如下设置,完成后点确定:
[attach]404[/attach]
在如图输入框中输入要取模的汉字,点“生成字模”
[attach]405[/attach]
将生成的数组替换到上面的示例代码中就可以更改显示内容了!




作者: azi1974    时间: 2019-6-3 23:37
认真学习中,
作者: JQK34229    时间: 2019-12-24 10:08
问一下,这个是用的共阴极的点阵么




欢迎光临 YFROBOT创客社区 (http://yfrobot.com.cn/) Powered by Discuz! X3.1