Chinaunix首页 | 论坛 | 博客
  • 博客访问: 965819
  • 博文数量: 175
  • 博客积分: 2788
  • 博客等级: 少校
  • 技术积分: 2060
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-25 12:25
个人简介

知之者不如好之,好之者不如乐之

文章分类

全部博文(175)

文章存档

2016年(1)

2015年(20)

2014年(8)

2013年(68)

2012年(16)

2011年(35)

2010年(1)

2008年(26)

分类: 嵌入式

2013-11-18 21:12:22

原文:
http://www.eeworld.com.cn/mcu/2012/1031/article_10964.html  (含原理图)

关键字:LED点阵屏 C51程序 at89s52
以下程序有部分删减,请从以下地址下载.单片机型号是at89s52,晶振为11.0592.本人测试成功.
完整程序下载:
//*****************************************************
//程序功能:
//   LED点阵显示屏,每行显示字数为 LED_NUM个,
//   总共可显示字数为DISP_NUM个,
//   最大可显示字数为65536/32=2048个。
//   行数最多可为65536/16=4096行。
//   循环时间参数为DISP_TIME_MOVE
//MCU:AT89S52
//
//程序编写:Bunagi
//修改时间:2008/11/11
//********************************************************
#include
//********************************************************
#define LED_NUM 2   //LED显示屏字数
#define DISP_NUM 12   //显示内容字数
#define DISP_TIME_MOVE 3 //循环时间参数
//**********************************************************
#define uchar unsigned char
#define uint unsigned int
//*******************************************************
sbit LED1_SH=P2^0;   //595数据传递控制,上升沿有效
sbit LED1_DS=P2^1;   //595数据传递输入
sbit LED1_ST=P2^2;   //595数据输出控制,上升沿有效
sbit LED1_OE=P2^3;   //595片选
sbit LED2_SH=P2^4;   //595数据传递控制,上升沿有效
sbit LED2_DS=P2^5;   //595数据传递输入
sbit LED2_ST=P2^6;   //595数据输出控制,上升沿有效
sbit LED2_OE=P2^7;   //595片选
//***********************************************************
uint disp_up_move;   //上下移动控制
uchar disp_move_time;
code uchar disp_code[]={
   0x20,0x08,0x17,0xFC,0x10,0x00,0x03,0xF8,  //福
   0xFA,0x08,0x0A,0x08,0x13,0xF8,0x38,0x04,
   0x57,0xFE,0x94,0x44,0x14,0x44,0x17,0xFC,
   0x14,0x44,0x14,0x44,0x17,0xFC,0x14,0x04,
   0x10,0x04,0x10,0x84,0x10,0x84,0x10,0x84,  //州
   };
//*********************************************************
void disp();
void sent(uchar sent_dat);
void delay(uchar temp);
//****************************************************
void main()
{
P2=0X00;  
TR0=0;
TL0=0;  //20MS
TH0=0;  
TMOD=0X01;    //方式1
EA=1;
ET0=1;
TR0=1;
while(1)
{
  disp();
}
}
//**************************************************
//LED扫描显示程序。
//显示方式为逐字扫描
//*************************************************
void disp()
{
uchar i,j;
uint move_ctrl;
LED1_DS=0;
LED1_SH=0;
LED1_ST=0;
LED1_OE=0;
LED2_DS=0;
LED2_SH=0;
LED2_ST=0;
LED2_OE=0;
for(j=0;j<8;j++)
{
  for(i=LED_NUM;i>=1;i--)
  {
//**************************************字符下半部分***************************************************
   if((disp_up_move+9+j)>((DISP_NUM/LED_NUM)*16))   //判断要显示的字符是否已超出字库
   {
sent(0x00);
sent(0x00);
   }
   else
   {
if((disp_up_move+8+j)>15) //判断当前行显示内容是否为下一屏内容
{
  move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+8+j)/16); //判断显示字符的下半部第一个字节位置
  //  第N个字符  一屏字符大小*当前显示行为第几屏
  sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)+1]);
  sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)]);
  /*
  如果有多于一行的LED点阵条,则程序在此添加:
  move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+8+j)/16)+LED_NUM*32*第几行;
  sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)+1]);
  sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)]);
  ......
  */
}
else
{
  move_ctrl=32*(i-1)+2*(disp_up_move%16);
  sent(disp_code[move_ctrl+16+j*2+1]);
  sent(disp_code[move_ctrl+16+j*2]);
  /*
  如果有多于一行的LED点阵条,则程序在此添加:
  move_ctrl=32*(i-1)+2*(disp_up_move%16)+LED_NUM*32*第几行;
  sent(disp_code[move_ctrl+16+j*2+1]);
  sent(disp_code[move_ctrl+16+j*2]);
  ......
  */
}
   }
//***********************************字符上半部分***************************************************
   if((disp_up_move+j+1)>(DISP_NUM/LED_NUM)*16)
   {
sent(0x00);
sent(0x00);
   }
   else
   {
if((disp_up_move+j)>15)
{
  move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+j)/16);
  sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)+1]);
  sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)]);
  /*
  如果有多于一行的LED点阵条,则程序在此添加:
  move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+j)/16)+LED_NUM*32*第几行;
  sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)+1]);
  sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)]);
  ......
  */
}
else
{
  move_ctrl=32*(i-1)+2*(disp_up_move%16);
  sent(disp_code[move_ctrl+j*2+1]);
  sent(disp_code[move_ctrl+j*2]);
  /*
  如果有多于一行的LED点阵条,则程序在此添加:
  move_ctrl=32*(i-1)+2*(disp_up_move%16)+LED_NUM*32*第几行;
  sent(disp_code[move_ctrl+j*2+1]);
  sent(disp_code[move_ctrl+j*2]);
  ......
  */
}
   }
  }

  LED1_SH=1;
  LED1_SH=0;
  LED1_DS=1;
  LED1_ST=1;
  LED1_ST=0;
  LED2_ST=1;
  LED2_ST=0;
  delay(1);
}
LED1_OE=1;
LED2_OE=1;
}
//***************************************************
void sent(uchar sent_dat)
{
uchar i;
for(i=0;i<8;i++)
{
  LED2_DS=sent_dat&0x01;
  sent_dat=sent_dat>>1;
  LED2_SH=1;
  LED2_SH=0;
}
}
//************************************************
void delay(uchar temp)
{
uchar i,j;
for(i=0;i   for(j=0;j<100;j++);
}
//********************************************
void t0() interrupt 1
{
TR0=0;
TL0=0;
TH0=0;
if(disp_move_time++>DISP_TIME_MOVE)
{
  disp_move_time=0;
  if(disp_up_move++ >((DISP_NUM/LED_NUM)*16)-1)disp_up_move=0;
}
TR0=1;
}

阅读(902) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~