C 和 汇编语言的混合编程(实时控制TLC1549的实现(2)

void DisplayListChar(uchar X, uchar Y, uchar  *DData)
{
 uchar ListLength,X2;
  ListLength = 0;
  X2=X;
 if(Y<1)
  Y=1;
 if(Y>4)
  Y=4;
 X &= 0x0F; //限制X不能大于16,Y在1-4之内
 switch(Y){
 case 1:X2|=0X80;break; //根据行数来选择相应地址
 case 2:X2|=0X90;break;
 case 3:X2|=0X88;break;
 case 4:X2|=0X98;break;
 }
 WriteCommandLCD(X2, 1); //发送地址码
  while (DData[ListLength]>=0x20) //若到达字串尾则退出
  {
   if (X <= 0x0F) //X坐标应小于0xF
    {
     WriteDataLCD(DData[ListLength]);
     ListLength++;
  X++;
  Delay5Ms();
    }
  }
}


//图形显示122*32
void DisplayImage (uchar code *DData){
 uchar x,y,i;
 unsigned int tmp=0;
 for(i=0;i<9;){  //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
 for(x=0;x<32;x++){    //32行
  WriteCommandLCD(0x34,1);
  WriteCommandLCD((0x80+x),1);//列地址
  WriteCommandLCD((0x80+i),1); //行地址,下半屏,即第三行地址0X88
  WriteCommandLCD(0x30,1); 
  for(y=0;y<16;y++)
   WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
  tmp+=16; 
 }
 i+=8;
 }
 WriteCommandLCD(0x36,1); //扩充功能设定
 WriteCommandLCD(0x30,1);
}

//5ms延时
void Delay5Ms(void)
{
 unsigned int TempCyc = 5552;
 while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{
 uchar TempCycA = 5;
 unsigned int TempCycB;
 while(TempCycA--)
 {
  TempCycB=7269;
  while(TempCycB--);
 };
}


 

//:CD12864.h


//============================================================
//Header include
#ifndef __LCD12864_H__
#define __LCD12864_H__

#ifndef __HEADER_H__

#define __HEADER_H__
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

#endif

//============================================================
//函数声明

extern void WriteDataLCD(uchar WDLCD);
extern void WriteCommandLCD(uchar WCLCD,BuysC);
extern uchar ReadDataLCD(void);
extern uchar ReadStatusLCD(void);
extern void LCDInit(void);
extern void LCDClear(void);
extern void LCDFlash(void);
extern void DisplayOneChar(uchar X, uchar Y, uchar DData);
//void DisplayListChar(uchar X, uchar Y, uchar code *DData);
extern void DisplayListChar(uchar X, uchar Y, uchar *DData);
extern void DisplayImage (uchar code *DData);
extern void Delay5Ms(void);
extern void Delay400Ms(void);


  
//============================================================
//此为硬件配置,请作相应的修改
sbit LCD_RS=P1^0;//定义引脚
sbit LCD_RW=P1^1;
sbit LCD_E=P1^2;
sbit PSB =P3^6;  //PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,PSB=1
#define LCD_Data P2
#define Busy    0x80 //用于检测LCD状态字中的Busy标识

#endif

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wydgjf.html