找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2920|回复: 0
收起左侧

基于AT89c51的16×16点阵设计原理图+程序

[复制链接]
ID:525983 发表于 2020-5-28 02:35 | 显示全部楼层 |阅读模式
使用四块8×8的点阵拼成16×16的点阵,用了两个译码器,只设置了三个字(改字可以用字模转换器)按键控制左移、右移、暂停、启动。

电路原理图如下:
51hei.png

单片机源程序如下:
  1. /************************************************
  2. 16x16点阵汉字滚动显示
  3. ************************************************/
  4. #include <reg51.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. sbit LA=P1^0;                                    //138译码器地址选择引脚
  8. sbit LB=P1^1;
  9. sbit LC=P1^2;
  10. sbit LD=P1^3;
  11. sbit k1=P3^6;                                    //启动或暂停按键
  12. sbit k2=P3^7;                                    //改变方向按键
  13. bit  fx=0;                                       //滚动方向
  14. uint index=0;                                    //列扫描索引

  15. uchar code hztab[]={
  16.     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空格
  17.     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  18.    
  19.     0x08,0x04,0x10,0x04,0x20,0x24,0x40,0x24,0xfc,0x24,0xa2,0x24,0x22,0xfd,0x22,0x26, //老
  20.     0x42,0x24,0x42,0x2c,0x42,0x14,0x82,0x24,0x1e,0x44,0x00,0x04,0x00,0x04,0x00,0x00,
  21.    
  22.     0x00,0x00,0xe1,0x3f,0x02,0x00,0x0c,0x00,0xf0,0xff,0x00,0x00,0x00,0x40,0xf8,0x47, //师
  23.     0x00,0x44,0x00,0x44,0xff,0x7f,0x10,0x44,0x08,0x44,0xf0,0x47,0x00,0x40,0x00,0x00,
  24.    
  25.     0x02,0x08,0x44,0x08,0xa8,0x0f,0x10,0xf8,0x68,0x08,0x86,0x0f,0x00,0x00,0x00,0x01, //好
  26.     0x02,0x41,0x01,0x41,0xfe,0x47,0x00,0x49,0x00,0x51,0x00,0x61,0x00,0x01,0x00,0x00,
  27.    
  28.     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空格
  29.     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  30. };

  31. //===================函数声明====================
  32. void T0_Init();                                  //定时器0初始化
  33. void delayus(uint us);                           //延时函数
  34. void keyscan();                                  //按键扫描函数

  35. //====================主程序=====================
  36. void main()
  37. {
  38.     uchar i,j;
  39.     T0_Init();                                   //定时器0初始化
  40.     while(1)
  41.     {
  42.         keyscan();                               //按键扫描
  43.         for(i=0;i<16;i++)                        //点阵16列
  44.         {
  45.             LA=i&0x01;                           //用级联138进行列选
  46.             LB=i&0x02;
  47.             LC=i&0x04;
  48.             LD=i&0x08;
  49.             j=index+i;                           //定位当前要显示的列
  50.             P0=hztab[j*2+1];                     //发送点阵数据
  51.             P2=hztab[j*2];                       //共两个字节
  52.             delayus(100);                        //延时
  53.             P0=P2=0x00;                          //消影
  54.         }
  55.         delayus(100);                            //延时
  56.     }
  57. }

  58. //=================定时器0初始化=================
  59. void T0_Init()
  60. {
  61.     TMOD=0x01;                                   //定时器0,工作方式1
  62.     TH0=(65536-10000)/256;                       //定数器初值
  63.     TL0=(65536-10000)%256;                       //10ms定时
  64.     ET0=1;                                       //打开定时器0中断允许
  65.     EA=1;                                        //打开总中断允许
  66.     TR0=0;                                       //暂不启动定时器0
  67. }

  68. //===============定时中断0服务程序===============
  69. void timer0() interrupt 1
  70. {
  71.     static uchar tick=0;                         //嘀嗒计时
  72.     TH0=(65536-10000)/256;                       //重装装初值
  73.     TL0=(65536-10000)%256;                       //10ms定时
  74.     tick++;                                      //计数
  75.     if(tick==5)                                  //5次
  76.     {
  77.         tick=0;                                  //清0
  78.         if(fx==0)index=(index+1)%64;             //若方向为左移,则扫描线加1
  79.         else index=(index-1+64)%64;              //否则扫描线减1
  80.     }
  81. }

  82. //===================延时函数====================
  83. void delayus(uint us)
  84. {
  85.     while(us--);
  86. }

  87. //=================按键扫描函数==================
  88. void keyscan()
  89. {
  90.     if(k1==0)                                    //检测k1是否按下
  91.     {
  92.         delayus(100);                            //延时消抖
  93.         if(k1==0)                                //确认k1被按下
  94.         {
  95.             TR0=~TR0;                            //定时器启停反转
  96.             while(k1==0);                        //等待按键松开
  97.         }
  98.     }
  99.     if(k2==0)                                    //检测k2是否按下
  100.     {
  101.         delayus(100);                            //延时消抖
  102.         if(k2==0)                                //确认k2被按下
  103.         {
  104.             fx=~fx;                              //方向反转
  105.             while(k2==0);                        //等待按键松开
  106.         }
  107.     }
  108. }
复制代码

所有资料51hei提供下载:
16×16点阵.zip (22.41 KB, 下载次数: 59)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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