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

📄 12864.c

📁 基于51单片机的 12864显示ASC码
💻 C
字号:
/*******************************************************
连线:RS(D/I)=P2^4  R/W=P2^5   E=P2^6  DB0~DB7=P0^0~P0^7  
CS1(left)=P2^1  CS2(right)=P2^2  RET=P2^3
********************************************************/

/******头文件+宏定义**************/

#include<reg52.h>
#include<stdlib.h>
#include<intrins.h>
#include<stdio.h>
#include<math.h>

#define  uchar  unsigned char
#define  uint   unsigned int

/**************引脚定义***************/

#define Dataport P0  //LCD信号I/O管脚
sbit CSl=P2^1;      //前64列
sbit CSr=P2^2;           //后64列
sbit RET=P2^3;         //复位
sbit RS=P2^4;          //数据&指令
sbit RW=P2^5;          //读写
sbit E=P2^6;          //使能
uchar Page;           //页地址
uchar Col;            //列地址
//uchar code HZK_12[];   //12*12点阵字模
uchar code ASC_57[];    //5*7点阵字模
//uchar str[4];

/************函数定义********************/
void lcd_BusyL(void);          //左屏检测忙
void lcd_BusyR(void);         //右屏检测忙
void CheckBusy(void);      //读取忙信号
void Delay(uint MS);       //延时
void Locatexy(void);       //将屏幕横向0-128纵向0-7转换成左、右屏的的X、Y
void WriteCommandL( uchar CommandByte );    //向左屏写入指令
void WriteCommandR( uchar CommandByte );    //向右屏写入指令
uchar ReadData( void );       //读数据
void WriteData( uchar DataByte );    //写数据
void lcdClear( void );       //清屏
void lcdInit( void );        //初始化


//void LcmPutHZ_12( uchar x,uchar y,uchar HZcode ); //在屏幕上任意点显示一个12*12的汉字
                                             //uchar * uchartostr(unsigned char unm);            //将值转成字符串
void lcdPutAsc( uchar asc );     //显示一个5*7的ASC字符
void lcdPutstr( uchar row,uchar y,uchar * str );       //在设定位置显示字符串
                                  //void LcmPutpoint( uchar ro,uchar lie,uchar colour );   //在设定位置显示一个点

/*************忙判别*****************************/

void lcd_BusyL(void)
{
	CSl=1;
	CSr=0;
	CheckBusy();
}
void lcd_BusyR(void)
{
	CSl=0;
	CSr=1;
	CheckBusy();
}
void CheckBusy(void)
{
	RS=0;
	RW=1;
	Dataport=0xff;
	while(1)
	{
	 E=1;
	 _nop_();
	 if(Dataport<0x80) break;
	 E=0;
	 _nop_();
	 				
	}
	E=0;
	_nop_();
}
/**************设定LCD上的坐标数据*****************/

void Locatexy(void)
{
        uchar x,y;
        switch (Col&0xc0)       // col.and.0xC0        
        {                       //条件分支执行        
                case 0:         {lcd_BusyL();break;}//左区 
                case 0x40:      {lcd_BusyR();break;}//右区 
        }
        x = Col&0x3f|0x40;      // col.and.0x3f.or.Set Y Address
        y = Page&0x07|0xb8;     // row.and.0x07.or.set Page     
        CheckBusy();                // waitting for enable 
        RS = 0;                 //指令
        RW = 0;                 //写
        Dataport = y;                 //设置页面地址
        E = 1;
        _nop_();
        E = 0;
        _nop_();
        CheckBusy();                // waitting for enable 
        RS = 0;
        RW = 0;
        Dataport = x;                 //设置列地址
        E = 1;
        _nop_();
        E = 0;
        _nop_();
} 
/***************写指令********************/

void WriteCommandL( uchar CommandByte )
{
        lcd_BusyL();
        Dataport = CommandByte;
        RS = 0;         //指令
        RW = 0;
        E = 1;
        _nop_();
        E = 0;
        _nop_();
} 
void WriteCommandR( uchar CommandByte )
{
        lcd_BusyR();
        Dataport = CommandByte;
        RS = 0;         //指令
        RW = 0;
        E = 1;
        _nop_();
        E = 0;
        _nop_();
} 
/****************读数据*******************/

uchar ReadData( void )
{
        uchar DataByte;
        Locatexy();     //坐标定位,返回时保留分区状态不变      */
        RS = 1;         //数据输出
        RW = 1;         //读入 
        Dataport = 0xff;              //输出0xff以便读取正确
        E = 1;         //读入到LCD
        _nop_();
        DataByte = Dataport; //数据读出到数据口P0
        E = 0;
        _nop_();
        return DataByte;
} 

/******************写数据***********************/
void WriteData( uchar DataByte )
{
        Locatexy();     //坐标定位,返回时保留分区状态不变   
        RS = 1;         //数据输出
        RW = 0;         //写输出 
        Dataport = DataByte; //数据输出到数据口 
        E = 1;         //写入到LCD
        _nop_();
        E = 0;
        _nop_();
}

/*****************清屏************************/
void lcdClear( void )
{
        Page = 0;
        Col = 0;
        for(Page=0;Page<8;Page++)
                for(Col=0;Col<128;Col++)
                        WriteData(0);
} 

/********************初始化*******************/
void lcdInit( void )
{
    Delay(200);     //等待复位
        WriteCommandL(0x3f);    //开显示
        WriteCommandR(0x3f);
        
        WriteCommandL(0xc0);    //设置起始地址=0
        WriteCommandR(0xc0); 
        WriteCommandL(0x3f);    //开显示
        WriteCommandR(0x3f); 
        lcdClear();
        Col = 0;
        Page= 0;
        Locatexy();
}
/************************输入ASC码********************/
void lcdPutAsc( uchar asc )
{
        uchar j;
        uint x;
        x = 5*(asc-32);
           for(j=0;j<5;j++)
               {
                       WriteData(ASC_57[x]);
                       x++;
                       Col++;
              }
           WriteData(0x00); 
           Col++;

}

void lcdPutstr( uchar row,uchar y,uchar * str )
{ unsigned char * x;
   x=str;
Page=row;
Col=y;
while(*x!='\0')
{ lcdPutAsc( *x );
    x++;
}

}
/**************************延时********************/
void Delay(uint MS)
{
        uchar us,usn;
        while(MS!=0)
        {
                usn = 2;        //for 12M
                while(usn!=0)
                {
                        us=0xf6;
                        while (us!=0){us--;};
                        usn--;
                }
                MS--;
        }
}

void Main( void )
{
        //uchar x,i;
        lcdInit();
        lcdClear();
        while(1)
        {
          //LcmClear();
             // LcmPutBMP(BMP1);
              //Delay(3000);
      lcdClear();
              //LcmReverseBMP();
              //Delay(1000);
          //LcmClear();
      //x=0;
      //for(i=0;i<8;i++)
     // {
      //          LcmPutHZ_12(x,i*7,i);
      //x=x+16;
      //}
		lcdPutstr(1,1,"shall by too dull doll by too jack won,");
		lcdPutstr(3,1,"dolphin long can Jim shall by too low,");
		lcdPutstr(5,1,"shall by too when dull low, doll car low,");
 		lcdPutstr(7,1,"dolphin long doll Ham Eason 'more power'!");




     //lcdPutstr( 4,2,"Hello" );
      //lcdPutstr( 6,35,"World!" );
              Delay(5000);
       
        }
}

//ASCII字符
uchar code ASC_57[]={
0x00, 0x00, 0x00, 0x00, 0x00, //space
0x00, 0x00, 0x4F, 0x00, 0x00, //!
0x00, 0x07, 0x00, 0x07, 0x00, //
0x14, 0x7F, 0x14, 0x7F, 0x14, //
0x24, 0x2A, 0x7F, 0x2A, 0x12, //
0x23, 0x13, 0x08, 0x64, 0x62, //
0x36, 0x49, 0x55, 0x22, 0x50, //
0x00, 0x05, 0x03, 0x00, 0x00, //
0x00, 0x1C, 0x22, 0x41, 0x00, //
0x00, 0x41, 0x22, 0x1C, 0x00, //
0x14, 0x08, 0x3E, 0x08, 0x14, //
0x08, 0x08, 0x3E, 0x08, 0x08, //
0x00, 0x50, 0x30, 0x00, 0x00, //
0x08, 0x08, 0x08, 0x08, 0x00, //
0x00, 0x60, 0x60, 0x00, 0x00, //
0x20, 0x10, 0x08, 0x04, 0x02, //
0x3E, 0x51, 0x49, 0x45, 0x3E, //0
0x00, 0x42, 0x7F, 0x40, 0x00, //1
0x42, 0x61, 0x51, 0x49, 0x46, //2
0x21, 0x41, 0x45, 0x4B, 0x31, //3
0x18, 0x14, 0x12, 0x7F, 0x10, //4
0x27, 0x45, 0x45, 0x45, 0x39, //5
0x3C, 0x4A, 0x49, 0x49, 0x30, //6
0x01, 0x01, 0x79, 0x05, 0x03, //7
0x36, 0x49, 0x49, 0x49, 0x36, //8
0x06, 0x49, 0x49, 0x29, 0x1E, //9
0x00, 0x36, 0x36, 0x00, 0x00, //
0x00, 0x56, 0x36, 0x00, 0x00, //
0x08, 0x14, 0x22, 0x41, 0x00, //
0x14, 0x14, 0x14, 0x14, 0x14, //
0x00, 0x41, 0x22, 0x14, 0x08, //
0x02, 0x01, 0x51, 0x09, 0x06, //
0x32, 0x49, 0x79, 0x41, 0x3E, //
0x7E, 0x11, 0x11, 0x11, 0x7E, //A
0x41, 0x7F, 0x49, 0x49, 0x36, //B
0x3E, 0x41, 0x41, 0x41, 0x22, //C
0x41, 0x7F, 0x41, 0x41, 0x3E, //D
0x7F, 0x49, 0x49, 0x49, 0x49, //E
0x7F, 0x09, 0x09, 0x09, 0x01, //F
0x3E, 0x41, 0x41, 0x49, 0x7A, //G
0x7F, 0x08, 0x08, 0x08, 0x7F, //H
0x00, 0x41, 0x7F, 0x41, 0x00, //I
0x20, 0x40, 0x41, 0x3F, 0x01, //J
0x7F, 0x08, 0x14, 0x22, 0x41, //K
0x7F, 0x40, 0x40, 0x40, 0x40, //L
0x7F, 0x02, 0x0C, 0x02, 0x7F, //M
0x7F, 0x06, 0x08, 0x30, 0x7F, //N
0x3E, 0x41, 0x41, 0x41, 0x3E, //O
0x7F, 0x09, 0x09, 0x09, 0x06, //P
0x3E, 0x41, 0x51, 0x21, 0x5E, //Q
0x7F, 0x09, 0x19, 0x29, 0x46, //R
0x26, 0x49, 0x49, 0x49, 0x32, //S
0x01, 0x01, 0x7F, 0x01, 0x01, //T
0x3F, 0x40, 0x40, 0x40, 0x3F, //U
0x1F, 0x20, 0x40, 0x20, 0x1F, //V
0x7F, 0x20, 0x18, 0x20, 0x7F, //W
0x63, 0x14, 0x08, 0x14, 0x63, //X
0x07, 0x08, 0x70, 0x08, 0x07, //Y
0x61, 0x51, 0x49, 0x45, 0x43, //Z
0x00, 0x7F, 0x41, 0x41, 0x00, //
0x02, 0x04, 0x08, 0x10, 0x20, //
0x00, 0x41, 0x41, 0x7F, 0x00, //
0x04, 0x02, 0x01, 0x02, 0x04, //
0x40, 0x40, 0x00, 0x40, 0x40, //
0x01, 0x02, 0x04, 0x00, 0x00, //
0x20, 0x54, 0x54, 0x54, 0x78, //a
0x7F, 0x48, 0x44, 0x44, 0x38, //b
0x38, 0x44, 0x44, 0x44, 0x28, //c
0x38, 0x44, 0x44, 0x48, 0x7F, //d
0x38, 0x54, 0x54, 0x54, 0x18, //e
0x00, 0x08, 0x7E, 0x09, 0x02, //f
0x0C, 0x52, 0x52, 0x4C, 0x3E, //g
0x7F, 0x08, 0x04, 0x04, 0x78, //h
0x00, 0x44, 0x7D, 0x40, 0x00, //i
0x20, 0x40, 0x44, 0x3D, 0x00, //j
0x00, 0x7F, 0x10, 0x28, 0x44, //k
0x00, 0x41, 0x7F, 0x40, 0x00, //l
0x7C, 0x04, 0x78, 0x04, 0x78, //m
0x7C, 0x08, 0x04, 0x04, 0x78, //n
0x38, 0x44, 0x44, 0x44, 0x38, //o
0x7E, 0x0C, 0x12, 0x12, 0x0C, //p
0x0C, 0x12, 0x12, 0x0C, 0x7E, //q
0x7C, 0x08, 0x04, 0x04, 0x08, //r
0x58, 0x54, 0x54, 0x54, 0x64, //s
0x04, 0x3F, 0x44, 0x40, 0x20, //t
0x3C, 0x40, 0x40, 0x3C, 0x40, //u
0x1C, 0x20, 0x40, 0x20, 0x1C, //v
0x3C, 0x40, 0x30, 0x40, 0x3C, //w
0x44, 0x28, 0x10, 0x28, 0x44, //x
0x1C, 0xA0, 0xA0, 0x90, 0x7C, //y
0x44, 0x64, 0x54, 0x4C, 0x44, //z
0x00, 0x08, 0x36, 0x41, 0x00, //
0x00, 0x00, 0x77, 0x00, 0x00, //
0x00, 0x41, 0x36, 0x08, 0x00, //
0x02, 0x01, 0x02, 0x04, 0x02, //
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //
};

⌨️ 快捷键说明

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