找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3827|回复: 1
收起左侧

自制单片机LED显示屏

[复制链接]
ID:59583 发表于 2014-3-31 23:32 | 显示全部楼层 |阅读模式

运行程序
#include <AT89X52.h>
#include "test_ziku.h"   
#define uchar unsigned char
#define uint unsigned int   
#define ulong unsigned long    //宏定义
#define hang1   P0        //上行线
#define hang2   P2        //下行线
#define lie   P1        //列线
#define CS1   P3_0       //接左屏154译码器使能端
#define CS2   P3_1       //接右屏154译码器使能端
#define sum   sizeof(hanzi)/32 //自动计算汉字字数

/*****参数设置*****/
#define ziti     16     //字体大小(宽度)
#define light  8        //显示亮度
#define move_speed 25        //移动速度

uint k=0,j;          //移位变量,k:移位个数
uint a=0;           //用于软件延时  
ulong s=(sum+1)*ziti;     //s为全部列数
uchar  disbuf[32][2];     //定义显示缓冲区(32行两列的二维数组以开辟2个16*16汉字的空间)
bit  move_st;      //移动标志

/*****可变延时*****/
void delay(void)          //用来改变扫描延时以调节亮度
{
uchar i;
for(i=0;i<light;i++);
}

/*****初始化子程序*****/
void init(void)                   //定时器初始化,设置定时器0工作方式1,定时时间1ms
{   
  TMOD=0x1;
  TH0=0xfc;
  TL0=0x18;
}

/*****计数器中断程序*****/
void timer0(void) interrupt 1      //中断处理
{
  TH0=0xfc;
  TL0=0x18;
  a++;           
}

/*****汉字循环显示*****/
void run_move(void)
{
uchar  k1,k2;
if(a>=move_speed)          //move_speed控制移动速度
{   
      
  if(k>s-ziti-1)k=0;      //整屏移动列数  
  k1=k/ziti;
  k2=k%ziti;
  j=ziti*2*k1+k2;     //显示指针
  k++;
  move_st=1;
  a=0;
}
}

/*****装载显示数据至缓冲区*****/
void load_hanzi(void)
{  
uchar i;
run_move();
if(move_st)
{
  for(i=0;i<31;i++)
  {
   disbuf[0]=disbuf[i+1][0];//移位处理
   disbuf[1]=disbuf[i+1][1];//移位处理
  }
  disbuf[31][0]=hanzi[j];
  disbuf[31][1]=(hanzi[ziti+j]);   
  move_st=0;         
}  
}

/*****扫描显示数据缓冲区的内容*****/
void display(void)
{  
uchar i;
CS2=1;            //关右屏
CS1=0;            //开左屏
for (i=0;i<16;i++)
{
  lie=i;      
  hang1=disbuf[0];
  hang2=disbuf[1];
  delay();
  hang1=0;
  hang2=0;      
}
CS1=1;        //关左屏
CS2=0;                  //开右屏
for (i=0;i<16;i++)
{
  lie=i<<4;
  hang1=disbuf[i+16][0];
  hang2=disbuf[i+16][1];
  delay();
  hang1=0;
  hang2=0;
}

}
/*****主程序*****/
void main (void)
{
init();
EA=1;        //开中断
TR0=1;         
ET0=1;      
while(1)
{
  load_hanzi();
  display();
}
}

回复

使用道具 举报

ID:738449 发表于 2020-4-26 13:40 来自手机 | 显示全部楼层
有没邮箱,求解proteus仿真
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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