普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 15411|回复: 37

关于16*16点阵液晶显示问题

 关闭 [复制链接]

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
发表于 2017-9-19 21:08:13 | 显示全部楼层 |阅读模式
本帖最后由 xzf586 于 2017-9-21 19:36 编辑

1:8位单片机,如果不用译码器74HC138与移位寄存器74HC595,那两个端口只能驱动一个8*8点阵液晶,当然还没有考虑单片机的电流负载能力。
2:  16*16一般当然不可能用8个端口驱动,51总共就4个端口,因此第一个问题就是四个8*8点阵液晶如何组装成一个16*16,建议大家亲自在纸上画清楚,硬件结构不了解,软件编程无从谈起!
3: 电路的搭建,不论是行扫描,还是列扫描,都是可以的,主要取决于汉字取模方式,如果汉字是横向取模,那就采用行扫描,一行一行显示,如果是纵向取模,那就采用列扫描,一列一列显示!
4:  16位段码,当然可以用两个IO输出,但一般不是这样,基本采用的是串入并出的移位寄存器74HC595(与74HC165区别是,74HC595带锁存,通俗讲不是一位一位的依次出来,可以一下输出8位,这样可以消除闪烁感),扫描一般采用4-16译码器74HC154,先在纸上大致画好电路图,个人认为,先一定要画电路图,然后再考虑程序!

最终移动程序在37楼!
回复

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-21 19:30:46 | 显示全部楼层
本帖最后由 xzf586 于 2017-9-21 19:48 编辑
wwf 发表于 2017-9-21 19:18
准确的说有点乱

什么地方问题?:lo

#include <REG51.H>

//--重定义函数变量--//
#define uchar unsigned char

//--定义SPI要使用的 IO--//
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;


//点阵显示数组
uchar code tab0[] = {
0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,//1-8行
0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00 //9-16行
                     };

uchar code tab[] =                       
{
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                 
     0,8,254,31,16,2,16,2,16,2,16,18,255,63,16,2,16,2,16,2,16,2,8,2,4,2,3,2,0,0,0,0,            //开
     32,2,36,4,36,4,34,16,254,63,32,0,224,15,80,8,80,4,136,2,8,1,132,2,98,60,29,16,0,0,0,0,     //发
     4,8,4,30,196,1,95,0,196,15,68,8,78,9,86,9,69,5,69,5,68,2,36,5,164,56,84,16,0,0,0,0,        //板
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0                 
};


uchar distab[32];         
uchar index=0;               

void HC595MoveData(uchar dat)
{
     uchar i;        
        for(i=0;i<8;i++)
        {
                MOSIO = dat >> 7 ;     
                dat <<= 1;
                S_CLK = 0;
                S_CLK = 1;               
        }
}

void HC595SendData(uchar DuanU17, uchar DuanU16,uchar WeiU5,uchar WeiU4)
{  
        HC595MoveData(DuanU17);   
     HC595MoveData(DuanU16);     
     HC595MoveData(WeiU5);      
     HC595MoveData(WeiU4);      
        
        R_CLK = 0;
        R_CLK = 1; //--输出--//
        R_CLK = 0;
}

void DisplayOneChar(uchar TAB[32])
{
     int k, i, ms;
     i =40;                                                                //显示时间
     for(ms = i; ms > 0; ms--)
     {
          for(k = 0; k < 16; k++)                                                                                
          {         
               HC595SendData(~TAB[2*k +1],~TAB[2*k],tab0[2*k],tab0[2*k + 1];
          }                  
     }
     HC595SendData(0xff,0xff,0,0);        //清屏
}


void MoveUp()
{
     uchar i;
     for(i=0;i<32;i++)
     {
          distab=tab[(i+2*index)];
     }
     DisplayOneChar(distab);
}


void MoveDown()
{
     uchar i;
     for(i=0;i<32;i++)
     {
          distab=tab[(128+i-2*index)];
     }
     DisplayOneChar(distab);
}


                                                                                                                                                                                       
/*************主函数*****************************/        

void main(void)
{
     while(1)
     {
          HC595SendData(0xff,0xff,0,0);        //清屏
          for(index=0;index<64;index++)
          MoveUp();
          for(index=0;index<64;index++)
          MoveDown();
      }
}
            
设计思想还是删除,请自己考虑,适用于开发板HC6800-EM3

回复 支持 1 反对 0

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-21 15:53:18 | 显示全部楼层
本帖最后由 xzf586 于 2017-9-21 16:10 编辑
wwf 发表于 2017-9-21 13:37
老铁我才学这东西没多久还是弄不来啊,试了试

/*******************************************************************************
*                 
*                                        普中科技
--------------------------------------------------------------------------------
* 实 验 名        : LED点阵显示汉字
* 实验说明       :
* 连接方式       : 见接线图
* 注    意                 :
*******************************************************************************/

#include <REG51.H>

//--重定义函数变量--//
#define uchar unsigned char

//--定义SPI要使用的 IO--//
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;


//点阵显示数组
uchar code tab0[] = {
0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,//1-8行
0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00 //9-16行
                     };
                     
uchar code tab[] =                                 //为了显示方便,弄到一起来
{
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                    // 缓冲
     0,8,254,31,16,2,16,2,16,2,16,18,255,63,16,2,16,2,16,2,16,2,8,2,4,2,3,2,0,0,0,0,            //开
     32,2,36,4,36,4,34,16,254,63,32,0,224,15,80,8,80,4,136,2,8,1,132,2,98,60,29,16,0,0,0,0,     //发
     4,8,4,30,196,1,95,0,196,15,68,8,78,9,86,9,69,5,69,5,68,2,36,5,164,56,84,16,0,0,0,0,        //板
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                    // 缓冲
};


uchar distab[32];            //为了利于编程,定义显示缓存变量
uchar index=0;                  //记录每次显示的16行的起始行,思路关键



/*******************************************************************************
* 函 数 名         : HC595SendData
* 函数功能                   : 通过595发送四个字节的数据
* 输    入         : BT3:第四个595输出数值
*                  * BT2: 第三个595输出数值
*                  * BT1:第二个595输出数值
*                  * BT0:第一个595输出数值
* 输    出         : 无
*******************************************************************************/
void HC595MoveData(uchar dat)   //--移位一个字节,从高到低--//
{
     uchar i;        
        for(i=0;i<8;i++)
        {
                MOSIO = dat >> 7 ;        //从高位到低位
                dat <<= 1;
                S_CLK = 0;
                S_CLK = 1;               
        }
}

void HC595SendData(uchar DuanU17, uchar DuanU16,uchar WeiU5,uchar WeiU4)
{  
        HC595MoveData(DuanU17);       //控制点阵的c9~c16脚,9-16行代码
     HC595MoveData(DuanU16);       //控制点阵的c1~c8脚  1-8行代码  低电平亮灯
     HC595MoveData(WeiU5);         //控制点阵的R9~R16脚  9-16行扫描  高电平亮灯
     HC595MoveData(WeiU4);         //控制点阵的R1~R8脚  1-8行扫描  高电平亮灯
        
        R_CLK = 0;
        R_CLK = 1; //--输出--//
        R_CLK = 0;
}

void DisplayOneChar(uchar TAB[32])
{
     int k, i, ms;
     i =40;                                                                //显示时间
     for(ms = i; ms > 0; ms--)
     {
          for(k = 0; k < 16; k++)                                                                                
          {         
               HC595SendData(~TAB[2*k +1],~TAB[2*k],tab0[2*k],tab0[2*k + 1]);
          }                  
     }
     HC595SendData(0xff,0xff,0,0);        //清屏
}

void MoveUp()
{
     uchar i;
     for(i=0;i<32;i++)
     {
          distab=tab[(i+index)];
     }
           DisplayOneChar(distab);
}

                                                                                                                                                                                       
/*************主函数*****************************/        

void main(void)
{
     while(1)
     {
          HC595SendData(0xff,0xff,0,0);        //清屏
          MoveUp();
          index++;
          if(index==128)
          index=0;
      }
}
            
回复 支持 1 反对 0

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-20 10:41:57 | 显示全部楼层
本帖最后由 xzf586 于 2017-9-20 11:23 编辑

开发板自带程序,原来的程序写的无语,太啰嗦!我改编一下,容易看懂
/*******************************************************************************
*                 
*                                        普中科技
--------------------------------------------------------------------------------
* 实 验 名        : LED点阵显示汉字
* 实验说明       :
* 连接方式       : 见接线图
* 注    意                 :
*******************************************************************************/

#include <REG51.H>

//--重定义函数变量--//
#define uchar unsigned char

//--定义SPI要使用的 IO--//
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;


//点阵显示数组
uchar code tab0[] = {
0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,//1-8行
0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00 //9-16行
                     };

uchar code tab1[] = {0,8,254,31,16,2,16,2,16,2,16,18,255,63,16,2,16,2,16,2,16,2,8,2,4,2,3,2,0,0,0,0};//开
uchar code tab2[] = {32,2,36,4,36,4,34,16,254,63,32,0,224,15,80,8,80,4,136,2,8,1,132,2,98,60,29,16,0,0,0,0};//发
uchar code tab3[] = {4,8,4,30,196,1,95,0,196,15,68,8,78,9,86,9,69,5,69,5,68,2,36,5,164,56,84,16,0,0,0,0};//板


/*******************************************************************************
* 函 数 名         : HC595SendData
* 函数功能                   : 通过595发送四个字节的数据
* 输    入         : BT3:第四个595输出数值
*                  * BT2: 第三个595输出数值
*                  * BT1:第二个595输出数值
*                  * BT0:第一个595输出数值
* 输    出         : 无
*******************************************************************************/
void HC595MoveData(uchar dat)   //--移位一个字节,从高到低--//
{
     uchar i;       
        for(i=0;i<8;i++)
        {
                MOSIO = dat >> 7 ;        //从高位到低位
                dat <<= 1;
                S_CLK = 0;
                S_CLK = 1;               
        }
}

void HC595SendData(uchar DuanU17, uchar DuanU16,uchar WeiU5,uchar WeiU4)
{  
        HC595MoveData(DuanU17);       //控制点阵的c9~c16脚,9-16行代码
     HC595MoveData(DuanU16);       //控制点阵的c1~c8脚  1-8行代码  低电平亮灯
     HC595MoveData(WeiU5);         //控制点阵的R9~R16脚  9-16行扫描  高电平亮灯
     HC595MoveData(WeiU4);         //控制点阵的R1~R8脚  1-8行扫描  高电平亮灯
       
        R_CLK = 0;
        R_CLK = 1; //--输出--//
        R_CLK = 0;
}

void DisplayOneChar(uchar TAB[32])
{
     int k, i, ms;
     i =80;                                                                //显示时间
     for(ms = i; ms > 0; ms--)
     {
          for(k = 0; k < 16; k++)                                                                               
          {         
               HC595SendData(~TAB[2*k +1],~TAB[2*k],tab0[2*k],tab0[2*k + 1]);
                         //k=0 tab0[0]=0x00,U5控制,tab0[1]=0x01,U4控制,扫描第一行,
                         //第一行行代码:1-8列TAB[0],U16控制,9-16列TAB[1],U17控制
                         //因此汉字取模,从左到右,从上到下
          }                  
     }
     HC595SendData(0xff,0xff,0,0);        //清屏
}

                                                                                                                                                                                       
/*************主函数*****************************/       

void main(void)
{
     while(1)
     {
          HC595SendData(0xff,0xff,0,0);        //清屏
          DisplayOneChar(tab1);
          DisplayOneChar(tab2);
          DisplayOneChar(tab3);
      }
}
            
回复 支持 1 反对 0

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-19 21:19:11 | 显示全部楼层
曾经画的一个16*64点阵液晶电路图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-19 21:26:20 | 显示全部楼层
先分析电路图,然后再考虑编程,卖个关子:这是采用何种扫描,汉字取模应该按照什么方式?静等回答,后面再写!
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-19 21:38:47 | 显示全部楼层
本帖最后由 xzf586 于 2017-9-19 21:40 编辑

再看一个单个16*16,分析一下采用何种扫描,汉字取模方式,此程序当时编写的是两种移动方式,向左移动与向上移动!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-19 21:45:46 | 显示全部楼层
个人理解,编程一定要根据你的实际电路来写,当然高手可能从程序当中一眼看出来电路构造,那是另外一回事,初学者还是先老老实实分析一下电路吧!
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-19 21:56:32 | 显示全部楼层
左移效果,显示的字为“的点”!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-19 21:58:18 | 显示全部楼层
上移效果,显示的是“单片”!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-20 08:31:38 | 显示全部楼层
以普中HC6800-EM3开发板为例,先分析电路,再分析程序,注意不同的电路设计,当然有不同的程序,软件是为硬件服务,不要颠倒

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-20 09:58:15 | 显示全部楼层
本帖最后由 xzf586 于 2017-9-21 22:48 编辑

观察此电路图,只用到P3的三个IO口,分别为数据P3.4(DS),移位时钟P3.5(ST_CP),输出时钟P3.6(SH_CP),用了4个74HC595,分别承担两组数据与扫描,再分析一下,数据的最终输出是U17,U16为一组,低电平点亮,到底是显示代码还是扫描代码,都有可能,U5,U4为另外一组,高电平点亮!
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-24 18:12 , Processed in 0.107368 second(s), 32 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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