一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2800|回复: 3
收起左侧

请教154和138的程序

[复制链接]
发表于 2010-7-13 00:34 | 显示全部楼层 |阅读模式
这是一个154和595的LED点阵程序,我用138代替了154,程序没有变,可以正常显示,但显示屏的第一行会一直暗暗的亮,请问是什么问题呢?如果用138替换154扫描时要改什么参数呢?


//以下程序能实现多个16*16LED屏的多个字符显示,显示方式有整行上移、帘入帘出、左移、右移//
#include "reg52.h"
#define BLKN 8          //列锁存器数(=LED显示字数*2)
#define TOTAL 8        //待显示字个数,本例共20个
#define CONIO P1        //显示控制口
sbit G=CONIO^7;         //CONIO.7为154译码器显示允许控制信号端口,0时输出,1时输出全为高阻态.
sbit CLK=CONIO^6;       //CONIO.6为595输出锁存器时钟信号端,1时输出数据,从1到0时锁存输出数据.
sbit SCLR=CONIO^5;      //CONIO.5为595移位寄存器清零口,平时为1,为0时,输出全为0.
unsigned char idata dispram[(BLKN/2)*32]={0}; //显示区缓存,四字共4*32单元
//
//**************字模表******************//
unsigned char code Bmp[][32]={

{0xEF,0xFF,0xEF,0x03,0x81,0xBB,0xDD,0xBB,0xDD,0xD7,0xEB,0xEF,0xF3,0xD7,0xCD,0xB9,
0x3E,0xFF,0xC0,0x07,0xFE,0xF7,0xFD,0xF7,0xFD,0xF7,0xFB,0xF7,0xF7,0xD7,0xEF,0xEF},/*--  文字:  努  --*/
{0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x80,0x03,0xFE,0xFB,0xFE,0xFB,0xFE,0xFB,
0xFE,0xFB,0xFD,0xFB,0xFD,0xFB,0xFB,0xFB,0xFB,0xFB,0xF7,0xFB,0xEF,0xD7,0xDF,0xEF},/*--  文字:  力  --*/
{0xFE,0xF7,0xEF,0x73,0xF3,0x37,0xF7,0x6F,0x80,0x01,0xBF,0xFB,0x70,0x17,0xFF,0xBF,
0xFF,0x7F,0x80,0x01,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFD,0x7F,0xFE,0xFF},/*--  文字:  学  --*/
{0xFF,0xFF,0xC0,0x03,0xFF,0xFB,0xF7,0xFB,0xFB,0xFB,0xFC,0xFB,0xFE,0xEB,0xFF,0x9B,
0xFE,0x7B,0xF9,0xFB,0xC7,0xFB,0xEF,0xFB,0xFF,0xFB,0xFF,0xDB,0xFF,0xEA,0xFF,0xF6},/*--  文字:  习  --*/

{0xEF,0xDF,0xEF,0xDF,0xDF,0xDF,0xC1,0xDF,0xBF,0xC1,0x83,0xDF,0x6F,0xDF,0xEF,0xDF,
0x02,0x03,0xEE,0xFB,0xEE,0xFB,0xEE,0xFB,0xEA,0xFB,0xE6,0x03,0xEE,0xFB,0xFF,0xFF},/*--  文字:  钻  --*/
{0xFF,0xFF,0x02,0x01,0xEF,0x77,0xEF,0x77,0xDF,0x77,0xDF,0x77,0x84,0x01,0x97,0x77,
0x57,0x77,0xD7,0x77,0xD7,0x77,0xD6,0xF7,0xC6,0xF7,0xDD,0xF7,0xFB,0xF7,0xF7,0xF7},/*--  文字:  研  --*/
{0xEF,0xDF,0xEF,0xDF,0xEF,0xDF,0x02,0x01,0xEF,0xDF,0xEB,0xDF,0xE6,0x03,0xCE,0xF7,
0x2F,0x77,0xEF,0x6F,0xEF,0x9F,0xEF,0x9F,0xEF,0x6F,0xEE,0xF1,0xA9,0xFB,0xDF,0xFF},/*--  文字:  技  --*/
{0xFE,0xFF,0xFE,0xDF,0xFE,0xEF,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFC,0x7F,0xFA,0xBF,
0xFA,0xDF,0xF6,0xEF,0xEE,0xE7,0xDE,0xF1,0x3E,0xFB,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF},/*--  文字:  术  --*/
};
//**************字模表******************//
unsigned char code Bmp1[][32]={
  {
  0xF9,0xBF,0xC7,0xAF,0xF7,0xB7,0xF7,0xB7,0xF7,0xBF,0x00,0x01,0xF7,0xBF,0xF7,0xB7,
  0xF1,0xD7,0xC7,0xCF,0x37,0xDF,0xF7,0xAF,0xF6,0x6D,0xF7,0xF5,0xD7,0xF9,0xEF,0xFD
  }/*我*/,
  {
  0xFF,0x07,0xC0,0x6F,0xED,0xEF,0xF6,0xDF,0xC0,0x01,0xDD,0xFD,0xBD,0xFF,0xC0,0x03,
  0xFB,0xFF,0xF8,0x0F,0xF3,0xDF,0xF4,0xBF,0xEF,0x3F,0x9C,0xCF,0x73,0xF1,0xCF,0xFB
  }/*爱*/,
  {
  0xF7,0xDF,0xF9,0xCF,0xFB,0xBF,0xC0,0x07,0xDE,0xF7,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,
  0xC0,0x07,0xDE,0xF7,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF
  }/*单*/,
  {
  0xFF,0xBF,0xEF,0xBF,0xEF,0xBF,0xEF,0xBB,0xE0,0x01,0xEF,0xFF,0xEF,0xFF,0xEF,0xFF,
  0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xDF,0xEF,0xDF,0xEF,0xBF,0xEF,0x7F,0xEF
  }/*片*/,
  {
  0xEF,0xFF,0xEF,0x07,0xEF,0x77,0x01,0x77,0xEF,0x77,0xEF,0x77,0xC7,0x77,0xCB,0x77,
  0xAB,0x77,0xAF,0x77,0x6E,0xF7,0xEE,0xF5,0xED,0xF5,0xED,0xF5,0xEB,0xF9,0xEF,0xFF
  }/*机*/,
  {
  0xF8,0x3F,0xE7,0xCF,0xDF,0xF7,0xBF,0xFB,0xB3,0x9B,0x73,0x9D,0x7F,0xFD,0x7F,0xFD,
  0x6F,0xED,0x67,0xCD,0xB3,0x9B,0xB8,0x3B,0xDF,0xF7,0xE7,0xCF,0xF8,0x3F,0xFF,0xFF
  }/*:)*/
};
//
/***********延时函数(约1毫秒)************/
void delay(unsigned int dt)
{
register unsigned char bt;
for (; dt; dt--)
  for (bt=0; bt<255; bt++);
}
//
/*****************主函数 *********************/
void main(void)
{
register unsigned char i,j,k,l,q,w;
//初始化
SCON  = 0x00;              //串口工作模式0:移位寄存器方式
TMOD = 0x01;               //定时器T0工作方式1:16位方式
TR0 = 1;                   //启动定时器T0
CONIO = 0x3f;                 //CONIO端口初值
IE = 0x82;                 //允许定时器T0中断
//
while (1)
  {
delay(2000);             //2秒
//第一种显示效果:卷帘出显示笑脸图案
  for (i=0;i<32;i++)      
    {
    for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=Bmp1[5][i];}
      if (i%2) delay(120);
    }                     
delay(1000);
//卷帘出显示文字,每次字数为BLKN/2,共显示TOTAL*2/BLKN次
for (w=0;w<TOTAL*2/BLKN;w++)
{
for (i=0;i<32;i++)      
    {
    for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=Bmp[q+w*BLKN/2][i];}
      if (i%2) delay(120);
    }                     
delay(3000);
}
//第一种显示效果:卷帘出显示笑脸图案
  for (i=0;i<32;i++)      
    {
    for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=Bmp1[5][i];}
      if (i%2) delay(120);
    }                     
delay(1000);
//第二种显示效果:向上滚屏,每次BLKN/2个字
  for (i=0; i<TOTAL*2/BLKN; i++)      
    {
    for (j=0; j<16; j++)
      {
      for (k=0; k<15; k++)
        {
         for(q=0;q<BLKN/2;q++)
         {dispram[k*2+q*32] = dispram[(k+1)*2+q*32];dispram[k*2+1+q*32] = dispram[(k+1)*2+1+q*32];}
        }
      for(q=0;q<BLKN/2;q++)
        {dispram[30+q*32] = Bmp[q+i*BLKN/2][j*2];dispram[31+q*32] = Bmp[q+i*BLKN/2][j*2+1];}
      delay(100);
      }
    delay(3000);//滚动暂停
    }   
//第一种显示效果:卷帘出黑屏
  for (i=0;i<32;i++)      
    {
    for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=0xff;}
      if (i%2) delay(120);
    }                     
delay(1000);
//第三种显示效果:左移出显示
  for (i=0; i<TOTAL; i++)   
    {
    for (j=0; j<2; j++)
      for (k=0; k<8; k++)
        {
        for (l=0; l<16; l++)
          {  
          for(q=0;q<BLKN/2;q++)
             {
              dispram[l*2+q*32] = dispram[l*2+q*32]<<1 | dispram[l*2+1+q*32]>>7;
              if(q==BLKN/2-1) dispram[l*2+1+q*32] = dispram[l*2+1+q*32]<<1 | Bmp[i][l*2+j]>>(7-k);
             else dispram[l*2+1+q*32] = dispram[l*2+1+q*32]<<1 | dispram[l*2+(q+1)*32]>>7;
          }
          }
        delay(100);
        }
    }
  delay(3000);
//第一种显示效果:卷帘出黑屏
  for (i=0;i<32;i++)      
    {
    for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=0xff;}
      if (i%2) delay(120);
    }                     
delay(1000);
//第三种显示效果:右移出显示
  for (i=0; i<TOTAL; i++)   
    {
    for (j=2; j>0; j--)
      for (k=0; k<8; k++)
        {
        for (l=0; l<16; l++)
          {  
          for(q=0;q<BLKN/2;q++)
             {
              dispram[l*2+1+q*32] = dispram[l*2+1+q*32]>>1 | dispram[l*2+q*32]<<7;
              if(q==0) dispram[l*2+q*32] = dispram[l*2+q*32]>>1 | Bmp[i][l*2+j-1]<<(7-k);
             else dispram[l*2+q*32] = dispram[l*2+q*32]>>1 | dispram[l*2+1+(q-1)*32]<<7;
          }
          }
        delay(100);
        }
    }
  delay(3000);
//第四种显示效果:卷帘入
  for (i=0;i<32;i++)   
    {
    for(q=0;q<BLKN/2;q++)
       {dispram[i+q*32]= 0x00;}
       if (i%2) delay(100);
    }
  }
}
//主函数结束
//
/**********显示屏扫描(定时器T0中断)函数**********/
void leddisplay(void) interrupt 1 using 1
{
register unsigned char m, n=BLKN;
TH0 = 0xFc;                //设定显示屏刷新率每秒62.5帧(16毫秒每帧)
TL0 = 0x18;
m = CONIO;                 //读取当前显示的行号
m = ++m & 0x0f;            //行号加1,屏蔽高4位
do {
   n--;
   SBUF = dispram[m*2+(n/2)*30 + n]; //送显示数据
   while (!TI); TI = 0;
   }while (n);             //完成一行数据的发送
G = 1;                     //消隐(关闭显示)
CONIO &= 0xf0;             //行号端口清○
CLK=1;                     //显示数据打入输出锁存器
CONIO |= m;                //写入行号
CLK=0;                     //锁存显示数据
G = 0;                     //打开显示
}
//
发表于 2010-7-14 00:16 | 显示全部楼层
虽然是版主,可是对程序还是知道很少,不过根据经验可能还是OE【使能】方面出了问题,不仿把138的OE直接接地看看,有没有效果,反过来再改程序。
发表于 2010-7-14 08:43 | 显示全部楼层
这是一个154和595的LED点阵程序,我用138代替了154,程序没有变,可以正常显示,但显示屏的第一行会一直暗暗 ...
panyusong 发表于 2010-7-13 00:34 https://www.yleee.com.cn/images/common/back.gif



       如以前用的是154点亮程序一切正常,现用138代替了154 应该是可以的!图供参考!

       55.JPG
发表于 2010-7-15 12:20 | 显示全部楼层
看现象是oe极性反了。要不再翻下datasheet

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-4-28 19:07 , Processed in 0.061170 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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