找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4414|回复: 4
打印 上一主题 下一主题
收起左侧

2*16*16汉字点阵滚动显示单片机源码及仿真电路图等资料

[复制链接]
跳转到指定楼层
楼主
源码和电路图都在压缩包中,滚动显示最关键的就在于不同8*8点阵块中如何衔接与字模数据如何传入到595芯片当中。

一、点阵测试说明
一、单组点阵原理图

电路采用H1~H16用2个138组成4译16电路驱动,L1~L16用2个74HC595的串并转换驱动

ABCDG 为16行 译码控制信号。
ABCD 为H0~H16的4-16(两个138组成)的译码输入信号。G为两个138译码控制脚,低电平有效。
CLK 为列信号控制的时钟信号
DATA 为串行数据信号
LATCH 为信号锁定,上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。(通常将LATCH置为低电平,)当移位结束后,在LATCH端产生一个正脉冲(5V时,大于几十纳秒就行了。通常都选微秒级),更新显示数据
DATAOUT 为级联时数据串出信号。
IN针定义(从上到下)依次为LATCH、CLK、DATA、G、A、B、C、D
OUT针定义(从上到下)依次为LATCH、CLK、DATAOUT、G、A、B、C、D
级联使用时OUT针和IN针用短路片连接。

二、实验方式:
可单个点阵显示,也通过短路片连接可接联控制。

三、实验接线:
P1.0接D
P1.1接C
P1.2接B
P1.3接A
P1.4接G
P1.5接DATA
P1.6接CLK
P1.7接LATCH

四、实验程序
程序1  LED3J.C   三字静态显示
程序2  LED3D.C  二屏(左边二屏)六字左移显示。(如三屏接联,最右屏同最左屏的字,且字向下偏移一个位)
调试时,按调试按钮传送结束后,在反汇编窗口点击0000起始地址,让程序从0000开始运行。或直接在键盘上运行起始地址为0000。

字模设置选项





仿真图:


单片机源程序如下:
  1. #include "main.h"
  2. #include <intrins.h>
  3. //char code STT516[3] _at_ 0x003b;
  4. #define Display_Num_Word 2                                //液晶能显示的汉字个数

  5. unsigned char Display_Buffer[4];
  6. unsigned char Display_Swap_Buffer[Display_Num_Word][32]={0};                                        //显示缓冲区
  7. bit Shift_Bit = 0;
  8. bit Flag_Shift = 0;
  9. #define Shift_Speed 5                                                                                        //移动速度
  10. unsigned char Timer0_Count = 0;
  11. unsigned char temp = 0x80;
  12. unsigned char Shift_Count = 0;
  13. unsigned char Display_Word_Count = 0;

  14. #define Num_Of_Word 6
  15. unsigned char code Word[Num_Of_Word][32] =
  16. {

  17. 0xFE,0xFE,0xFE,0xFE,0xFE,0xE0,0xEF,0xEF,0xEF,0xE0,0xEF,0xFE,0xD7,0xDB,0xBB,0xFF,
  18. 0xFF,0xFF,0x07,0xFF,0xEF,0x07,0xEF,0xEF,0xEF,0x0F,0xEF,0xEF,0x77,0xBB,0xBB,0xFF,/*"点",0*/

  19. 0xFF,0x07,0x77,0x68,0x5E,0x6E,0x75,0x70,0x77,0x57,0x68,0x7F,0x7F,0x7F,0x7F,0x7F,
  20. 0x7F,0x7F,0x7F,0x03,0xFF,0xBF,0xBF,0x03,0xBF,0xBF,0x01,0xBF,0xBF,0xBF,0xBF,0xBF,/*"阵",1*/

  21. 0xBF,0xD8,0xDB,0x7B,0xBA,0xAA,0xEA,0xDA,0xDA,0xDA,0x3A,0xBE,0xBD,0xBD,0xBB,0xB7,
  22. 0xFD,0x3D,0xBD,0xAD,0xAD,0xAD,0xAD,0xAD,0xAD,0xAD,0xAD,0xFD,0x7D,0xBD,0xB5,0xFB,/*"测",2*/

  23. 0xFF,0xBF,0xDF,0xCF,0xD8,0xFF,0x1F,0xD8,0xDE,0xDE,0xDE,0xDE,0xD6,0xC9,0xDF,0xFF,
  24. 0xDF,0xD7,0xDB,0xDB,0x01,0xDF,0xDF,0x1F,0xDF,0xEF,0xEF,0xF5,0x35,0xF9,0xFD,0xFF,/*"试",3*/

  25. 0xBF,0xDE,0xCE,0xDE,0xFE,0xFE,0x1D,0xDA,0xDE,0xDE,0xDF,0xDF,0xD7,0xCF,0xDC,0xF3,
  26. 0xFF,0x0F,0xEF,0xEF,0xEF,0xEF,0xF1,0x07,0xF7,0xF7,0x6F,0x6F,0x9F,0x6F,0xF1,0xFB,/*"设",4*/

  27. 0xBF,0xDF,0xCF,0xDF,0xFF,0x0C,0xEF,0xEF,0xEF,0xEF,0xEF,0xED,0xEB,0xE7,0xEF,0xFF,
  28. 0xDF,0xDF,0xDF,0xDF,0xDF,0x01,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,/*"计",5*/


  29. };

  30. //************************************************************
  31. //主函数
  32. //************************************************************
  33. void main()
  34. {
  35.         Init_Timer0();
  36.         Clear_Display();
  37.         while(1)
  38.         {
  39.                 Display(Display_Swap_Buffer);
  40.                 if(Flag_Shift == 1)
  41.                 {
  42.                         Flag_Shift = 0;
  43.                         Display_Word_Count = Shift_Count/16;                                //计算当前显示第几个字
  44.                         Calc_Shift();                                                                               
  45.                        
  46.                         Shift_Count++;
  47.                        
  48.                         if(Shift_Count == (Num_Of_Word+Display_Num_Word)*16 )                                //移动次数
  49.                         {
  50.                                 Shift_Count = 0;                               
  51.                         }                       
  52.                 }                                                                       
  53.         }
  54. }

  55. //****************************************************
  56. //初始化定时器0
  57. //****************************************************
  58. void Init_Timer0()
  59. {
  60.         TMOD = 0X01;                        //T0, 工作模式1

  61.         TH0 = (65536 - 50000)/256;
  62.         TL0 = (65536 - 50000)%256;

  63.         TR0 = 1;                                //开启定时器
  64.         ET0 = 1;                            //开启定时器中断
  65.         EA = 1;                                        //开启总中断               
  66. }

  67. //****************************************************
  68. //中断函数
  69. //****************************************************
  70. void Timer0() interrupt 1
  71. {
  72.         TH0 = (65536 - 50000)/256;
  73.         TL0 = (65536 - 50000)%256;
  74.        
  75.         TF0 = 0;
  76.         Timer0_Count++;
  77.         if(Timer0_Count >= Shift_Speed)
  78.         {
  79.                 Timer0_Count = 0;
  80.                 Flag_Shift = 1;
  81.         }

  82. }

  83. //************************************************************
  84. //计算移动数据,存在在缓冲器
  85. //************************************************************
  86. void Calc_Shift()
  87. {
  88.         unsigned char i;

  89.         for(i = 0;i < 16;i++)
  90.         {
  91.                 if((Display_Swap_Buffer[0][16+i]&0x80) == 0)                                                                        //每行第一个字节移位
  92.                 {
  93.                         Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)&0xfe;                         //最低位清零       
  94.                 }
  95.                 else
  96.                 {
  97.                         Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)|0x01;                        //最低位置一        
  98.                 }

  99.                 if((Display_Swap_Buffer[1][i]&0x80) == 0)                                                                        //每行第二个字节移位
  100.                 {
  101.                         Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)&0xfe;                         //最低位清零       
  102.                 }
  103.                 else
  104.                 {
  105.                         Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)|0x01;                        //最低位置一        
  106.                 }

  107.                 if((Display_Swap_Buffer[1][16+i]&0x80) == 0)                                                                        //每行第三个字节移位
  108.                 {
  109.                         Display_Swap_Buffer[1][i] = (Display_Swap_Buffer[1][i] << 1)&0xfe;                         //最低位清零       
  110.                 }
  111.                 else
  112.                 {
  113.                         Display_Swap_Buffer[1][i] = (Display_Swap_Buffer[1][i] << 1)|0x01;                        //最低位置一        
  114.                 }

  115.                 if(Shift_Count%16 < 8 && Display_Word_Count < Num_Of_Word)
  116.                 {
  117.                         Shift_Bit = Word[Display_Word_Count][i]&temp;
  118.                 }
  119.                 else if(Shift_Count%16 < 16 && Display_Word_Count < Num_Of_Word)
  120.                 {
  121.                         Shift_Bit = Word[Display_Word_Count][16+i]&temp;
  122.                 }
  123.                 else
  124.                 {
  125.                         Shift_Bit = 1;                                                //把字移出缓冲区
  126.                 }

  127.                 if( Shift_Bit == 0)                                                                                                                //后8位移位
  128.                 {
  129.                         Display_Swap_Buffer[1][16+i] = (Display_Swap_Buffer[1][16+i] << 1)&0xfe;                 //最低位清零
  130.                 }
  131.                 else
  132.                 {
  133.                         Shift_Bit =        1;
  134.                         Display_Swap_Buffer[1][16+i] = (Display_Swap_Buffer[1][16+i] << 1)|0x01;                //最低位置一                        
  135.                 }
  136.                
  137.         }
  138.         temp = (temp>>1)&0x7f;
  139.         if(temp == 0x00)
  140.         {
  141.                 temp = 0x80;
  142.         }
  143. }

  144. //************************************************************
  145. //清空缓冲区
  146. //************************************************************
  147. void Clear_Display()
  148. {
  149.         unsigned char i,j;
  150.         for(j = 0 ; j < Display_Num_Word; j++)
  151.         {
  152.                 for(i = 0 ; i < 32 ;i++)
  153.                 {
  154.                         Display_Swap_Buffer[j][i] = 0xff;                                //0=显示  1=不显示        
  155.                 }
  156.         }
  157. }

  158. //************************************************************
  159. //num为字数  dat[][32]为字模的名称
  160. //*************************************************************
  161. void Display(unsigned char dat[][32])                                       
  162. {
  163.         unsigned char i,j;

  164.         for( i = 0 ; i < 16 ; i++ )
  165.         {
  166.                 LEDARRAY_G = 1;                        //更新数据时候关闭显示。等更新完数据,打开138显示行。防止重影。

  167.                 Display_Buffer[0] = dat[0][i];               
  168.                 Display_Buffer[1] = dat[0][i+16];
  169.                 Display_Buffer[2] = dat[1][i];
  170.                 Display_Buffer[3] = dat[1][i+16];

  171.                 Send(Display_Buffer[3]);
  172.                 Send(Display_Buffer[2]);
  173.                 Send(Display_Buffer[1]);
  174.                 Send(Display_Buffer[0]);

  175.                 LEDARRAY_LAT = 1;                                        //锁存数据
  176.                 _nop_();
  177.        
  178.                 LEDARRAY_LAT = 0;
  179.                 _nop_();

  180.                 Scan_Line(i);                                                //选择第i行

  181.                 LEDARRAY_G = 0;
  182.                
  183.                 for( j = 0 ; j < 30 ; j++);                //延时一段时间,让LED亮起来。
  184.         }       
  185. }

  186. //****************************************************
  187. //扫描某一行
  188. //****************************************************
  189. void Scan_Line( unsigned char m)
  190. {       
  191.         switch(m)
  192.         {
  193.                 case 0:                       
  194.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 0;                                        
  195.                         break;
  196.                 case 1:                                       
  197.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  198.                         break;
  199.                 case 2:                                       
  200.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  201.                         break;
  202.                 case 3:                                       
  203.                         LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  204.                         break;
  205.                 case 4:
  206.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 0;                
  207.                         break;
  208.                 case 5:
  209.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  210.                         break;
  211.                 case 6:
  212.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  213.                         break;
  214.                 case 7:
  215.                         LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  216.                         break;
  217.                 case 8:
  218.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 0;                
  219.                         break;
  220.                 case 9:
  221.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  222.                         break;       
  223.                 case 10:
  224.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  225.                         break;
  226.                 case 11:
  227.                         LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  228.                         break;
  229.                 case 12:
  230.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 0;                
  231.                         break;
  232.                 case 13:
  233.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 1;                
  234.                         break;
  235.                 case 14:
  236.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 0;                
  237.                         break;
  238.                 case 15:
  239.                         LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 1;                
  240.                         break;
  241.                 default : break;       
  242.         }
  243. }

  244. //****************************************************
  245. ……………………

  246. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
汉字点阵滚动.zip (1.13 MB, 下载次数: 58)


评分

参与人数 2黑币 +55 收起 理由
Asher0120 + 5 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:291645 发表于 2018-3-15 18:02 | 只看该作者
我打开这个仿真的,显示非法字符,咋回事,有知道怎么改的吗
回复

使用道具 举报

板凳
ID:443613 发表于 2018-12-10 20:33 | 只看该作者
想问下带不带论文啊
回复

使用道具 举报

地板
ID:275479 发表于 2019-1-2 13:22 来自手机 | 只看该作者
dqm123 发表于 2018-12-10 20:33
想问下带不带论文啊

不带论文,可以自己写写
回复

使用道具 举报

5#
ID:483687 发表于 2019-3-23 22:12 | 只看该作者
为什么仿真出现错误啊 Wire label contains illegal characters [P20,]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表