⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sed1330.c

📁 LCD显示模块SED1330的C51控制源程序
💻 C
字号:
/*以下示例程序所使用的液晶屏为320*240分辨率
  本程序中的x坐标值必须为8的倍数,取值在0-319之间
  y的取值在0-239之间
  画线的函数只能画水平或垂直的直线,如果需要画斜线,需要另外的算法
  此程序中未提供源代码
*/

#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#include<math.h>


#define uint     unsigned   int
#define uchar    unsigned   char

#define RR  0x01
#define LL  0x80

#define BLANK 1
#define WHITE 0

#define WC_ADD XBYTE[0x7100] //写指令代码地址
#define WD_ADD XBYTE[0x7000] //写参数及显示数据地址
#define RD_ADD XBYTE[0x7100] //读参数及显示数据地址
#define RB_ADD XBYTE[0x7000] //读忙状态地址

#define MiddleCursor       1
#define BigCursor          2
#define SmallCursor        0

// 特定字符的宏定义
#define CHARCM             0x00 //厘米
#define CHARHZ             0x01 //赫兹
#define CHARKG             0x02 //千克
#define CHARDU             0x03 //温度
#define CHARFEN            0x04 //
#define CHARFEN1           0x06 //
#define CHARMIAO           0x05 //秒

//全局变量
uchar xdata  Char_Var_Count1,Char_Var_Count2;     
uchar xdata  Int_Var_Temp;

uchar xdata SetX,SetY;
uchar xdata CNumber,PrCNumber;

xdata uchar BUFFER[0x0800] ;//显示缓冲区
xdata uchar TBUF[240] ; //临时缓冲区
bdata kk;
sbit kk_0=kk^0;
uchar idata  OXL;
uchar idata  OY;

uchar xdata PrX,PrY; //记录光标原来的X、Y座标值


uchar code *hzp16;//指向16×16点阵字库
uchar code *hzp24;//指向24×24点阵字库
uchar code *nump;//指向自制数字字库

uchar xdata *bufferp;
uchar xdata *tempdata;

uchar code systab[8]={0x30,0x87,0x07,0x27,0x42,0xf0,0x30,0x00};//SED1330系统设置参数表
uchar code scrtab[10]={0x00,0x00,0xf0,0x00,0x40,0xf0,0x00,0x80,0x00,0x00};//SCROLL参数表
uchar code ZK16[]={0x00,0x00};//此数组是16点阵字库,读者自行制作,太长,省略
uchar code ZK24[]={0x00,0x00};//此数组是24点阵字库,读者自行制作,太长,省略
uchar code num8p[20][12]=     //此数组是作者自制的8*12点阵数字库
 {
   0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,//0
   0x00,0x18,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,//1
   0x00,0x3C,0x66,0x66,0x06,0x0C,0x18,0x30,0x60,0x60,0x7E,0x00,//2
   0x00,0x3C,0x66,0x06,0x06,0x1C,0x06,0x06,0x06,0x66,0x3C,0x00,//3
   0x00,0x06,0x0E,0x1E,0x1E,0x36,0x36,0x66,0x7E,0x06,0x06,0x00,//4
   0x00,0x7E,0x60,0x60,0x60,0x7C,0x66,0x06,0x06,0x66,0x3C,0x00,//5
   0x00,0x3C,0x66,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x3C,0x00,//6
   0x00,0x7E,0x06,0x0C,0x0C,0x18,0x18,0x18,0x30,0x30,0x30,0x00,//7
   0x00,0x3C,0x66,0x66,0x66,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,//8
   0x00,0x3C,0x66,0x66,0x66,0x66,0x3E,0x06,0x06,0x66,0x3C,0x00,//9
   0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,//:
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空格
   0x00,0x00,0x42,0x66,0x24,0x18,0x7E,0x18,0x24,0x66,0x42,0x00,// *
   0x00,0x38,0x44,0x84,0x80,0x80,0x80,0x84,0x44,0x38,0x00,0x00,//C
   0x00,0x44,0x44,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x00,0x00,//M
   0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,//H
   0x00,0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,//z
   0x00,0x84,0x88,0x90,0xA0,0xE0,0x90,0x88,0x88,0x84,0x00,0x00,//K
   0x00,0x00,0x00,0x00,0x3C,0x48,0x78,0x40,0x78,0x44,0x38,0x00,//g
   0x40,0xA0,0x4E,0x13,0x31,0x60,0x60,0x60,0x61,0x33,0x0E,0x00//温度符号
 };
///////////////////////////////////////////////////////////////
//Function of LCD Control
//////////////////////////////////////////////////////////////
void ClearLcd(void);  //液晶屏清屏
void InitLcd(void);   //显示器初始化
void Dishz(uchar x1,uchar y1,uint position,uchar matrix);//显示汉字
void MidLine(uchar x0,uchar y0,uchar x1,uchar y1,uchar cha);
//显示半条钱(屏幕被分成上下两部分,当一条线跨过中线时,需用此函数)
void Line(uchar x0,uchar y0,uchar x1,uchar y1,uchar cha);//画直线
void Rec(uchar x0,uchar y0,uchar x1,uchar y1,uchar qq);//画矩形
void FullRec(uchar x0,uchar y0,uchar x1,uchar y1,uchar);//画实心矩形
void DisSNum(uchar,uchar,uchar);//显示单个数字
void DisSNumCpl(uchar,uchar,uchar);//反白显示单个数字
void ReadBuffer(uchar x0,uchar y0,uchar x1,uchar y1);//读显示缓冲区
void DisplayBuffer(uchar x0,uchar y0,uchar x1,uchar y1);//显示显示缓冲区内容
void DrawCursor(uchar x0,uchar y0,uchar state); //画光棒
void ClearArea(uchar,uchar,uchar,uchar);   //清除某区域
void DisplayNum(uchar x0,uchar y0,uint d0); //显示数字,本程序中只显示整数
void DisplayNumCpl(uchar x0,uchar y0,uint d0);//反白显示数字
void DisplayTwoNum(uchar x0,uchar y0,uchar d0);//显示两位的数字
void DisplayBigNum(uchar x0,uchar y0,uint d0);//显示较大的数字,超过三位
void DisplayTwoNumCpl(uchar x0,uchar y0,uchar d0);//反白显示两位数字

void InitLcd(void)        //LCD初始化
 {
     uchar j;
     WC_ADD=0x40;
      for(j=0;j<0x08;j++)  //写入系统设置指令代码
        WD_ADD=systab[j]; //初始化,显示窗口设置
     WC_ADD=0x44;
      for(j=0;j<0x0a;j++) //写入SCROLL指令代码
        WD_ADD=scrtab[j]; //设置显示区域,卷动
     WC_ADD=0x5a;
        WD_ADD=0x00;     //设置点单元卷动位置
     WC_ADD=0x5b;
        WD_ADD=0x0c;    //设置合成显示方式
        ClearLcd();     //清屏
     WC_ADD=0x59;       //显示开,设置显示方式
        WD_ADD=0x04;    
 }

 //屏幕为320*240分辩率,因每个字节显示RAM可以代表屏幕上的一行8位的像素点
  //故一个屏幕上的点要清屏只需对40*240个显示RAM清0
void ClearLcd(void)        //LCD清屏
  {
     uchar i,j;
     WC_ADD=0x4c;    //光标向右移动
     WC_ADD=0x46;    //设置光标起始地址
     WD_ADD=0x00;    //光标起始地址0000H
       WD_ADD=0x00;
     WC_ADD=0x42;    //从0000H开始数据写入显示RAM
      for(i=0;i<=0x60;i++)
       {
        for(j=0;j<255;j++)
            WD_ADD=0;   //写入的数据为0
       }
  }



//输入参数x、y是要显示的数字所在的屏幕位置坐标,dat是所要显示的数字
//光标的位置与显示RAM的地址是一致的
//此处的数字是笔者特制的8*12点阵
void DisSNum(uchar x,uchar y,uchar dat)
  {
      uchar code *q;
      uchar flag;
      uint dd;
      q=num8p[dat];
      OXL=x;OY=y;
      dd=OY*0x30+OXL;// 计算对应的显示RAM地址
      OXL=dd%256;//16位地址的低8位
      OY=dd/256;//16位地址的高8位
      flag=0;
      WC_ADD=0x4f;  //光标移动方向向下
      WC_ADD=0x46;  //设置光标起始位置
            WD_ADD=OXL;  //16位地址的低8位
            WD_ADD=OY;  //16位地址的高8位
      WC_ADD=0x42;    //从该地址开始写数据
      for(Char_Var_Count2=0;Char_Var_Count2<12;Char_Var_Count2++)
                       WD_ADD=q[Char_Var_Count2]; //逐行输出
 }

//坐标为(x0,y0)、(x1,y1)的两点分别为所清屏区域的对角线的两点
//清屏时先逐列清0
void ClearArea(uchar x0,uchar y0,uchar x1,uchar y1)
 {
      uint dd;
      OXL=x0;OY=y0;
      if(y0<180&&y1>180)
              dd=0;
      dd=OY*0x30+OXL;
      OXL=dd%256;
      OY=dd/256;         ////+kk;
      WC_ADD=0x4f;       ////the cursor go down
      for(Char_Var_Count1=0;Char_Var_Count1<cabs(x1-x0);Char_Var_Count1++)
        {
          WC_ADD=0x46;   //set the point of cursor
          WD_ADD=OXL;    // x direction
          WD_ADD=OY;     // y direction
          WC_ADD=0x42;   //Write data to display buffer
          for(Char_Var_Count2=0;Char_Var_Count2<cabs(y1-y0);Char_Var_Count2++)
             {
                WD_ADD=0x00;
             }
          OXL=OXL+1;
          kk_0=CY;
          OY=OY+kk;
   }
 }
//x,y是要显示的汉字在屏幕的坐标,matrix是用来选择汉字的矩阵大小
//matrix=1,汉字点阵为8*8,matrix=1,汉字点阵为16*16,matrix=1,汉字点阵为24*24
void Dishz(uchar x,uchar y,uint position,uchar matrix)
  {
      uchar code *q;
      uchar flag;
      uint dd;

      hzp16=ZK16;
      hzp24=ZK24;
       if(matrix==1)
           q=num8p[position];
         else
           if (matrix==2)
                    q=hzp16+position*8*matrix*matrix;
             else
                    q=hzp24+position*8*matrix*matrix;
      OXL=x;OY=y;
      dd=OY*0x30+OXL;
      OXL=dd%256;
      OY=dd/256;//+kk;
      flag=0;
      WC_ADD=0x4f;   //the cursor go down
      for(Char_Var_Count1=0;Char_Var_Count1<matrix;Char_Var_Count1++)
        {
          WC_ADD=0x46;  //set the point of cursor
            WD_ADD=OXL; // x direction
            WD_ADD=OY;  // y direction
          WC_ADD=0x42;   //Write data to display buffer
          for(Char_Var_Count2=0;Char_Var_Count2<(8*matrix);Char_Var_Count2++)
             {
               if(flag==0)
                    WD_ADD=q[Char_Var_Count2];
                 else
                    if(flag==1)
                           WD_ADD=q[Char_Var_Count2+8*matrix];
                        else
                            WD_ADD=q[Char_Var_Count2+48];
             }
          OXL=OXL+1;
          kk_0=CY;
          OY=OY+kk;
          flag=flag+1;
   }
 }


//屏幕上被分了上下两个显示区

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -