標(biāo)題: 自制單片機LED顯示屏 [打印本頁]

作者: 9geren    時間: 2014-3-31 23:32
標(biāo)題: 自制單片機LED顯示屏
http://static.video.qq.com/TPout.swf?auto=1&vid=e1078duy5nv
運行程序
#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 //自動計算漢字字?jǐn)?shù)

/*****參數(shù)設(shè)置*****/
#define ziti     16     //字體大。▽挾龋
#define light  8        //顯示亮度
#define move_speed 25        //移動速度

uint k=0,j;          //移位變量,k:移位個數(shù)
uint a=0;           //用于軟件延時  
ulong s=(sum+1)*ziti;     //s為全部列數(shù)
uchar  disbuf[32][2];     //定義顯示緩沖區(qū)(32行兩列的二維數(shù)組以開辟2個16*16漢字的空間)
bit  move_st;      //移動標(biāo)志

/*****可變延時*****/
void delay(void)          //用來改變掃描延時以調(diào)節(jié)亮度
{
uchar i;
for(i=0;i<light;i++);
}

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

/*****計數(shù)器中斷程序*****/
void timer0(void) interrupt 1      //中斷處理
{
  TH0=0xfc;
  TL0=0x18;
  a++;           
}

/*****漢字循環(huán)顯示*****/
void run_move(void)
{
uchar  k1,k2;
if(a>=move_speed)          //move_speed控制移動速度
{   
      
  if(k>s-ziti-1)k=0;      //整屏移動列數(shù)  
  k1=k/ziti;
  k2=k%ziti;
  j=ziti*2*k1+k2;     //顯示指針
  k++;
  move_st=1;
  a=0;
}
}

/*****裝載顯示數(shù)據(jù)至緩沖區(qū)*****/
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;         
}  
}

/*****掃描顯示數(shù)據(jù)緩沖區(qū)的內(nèi)容*****/
void display(void)
{  
uchar i;
CS2=1;            //關(guān)右屏
CS1=0;            //開左屏
for (i=0;i<16;i++)
{
  lie=i;      
  hang1=disbuf[0];
  hang2=disbuf[1];
  delay();
  hang1=0;
  hang2=0;      
}
CS1=1;        //關(guān)左屏
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();
}
}


作者: 15582888548    時間: 2020-4-26 13:40
有沒郵箱,求解proteus仿真




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1