无字库的12864今天终于调通了!今天来分享一下,提供仿真,还有我自己注解的说明,说明简单

2020-01-30 13:31发布

无字库的12864今天终于调通了!今天来分享一下,提供仿真,还有我自己注解的说明,说明简单明了。。。。。
让刚开始入手的学弟们,早早上手!
如果程序说明有问题或程序有问题的,多多指教。。。。
如果有不懂的,也可以提出来,我尽量回答


截图 (原文件名:捕获.JPG)

C语言程序包,含pdf,仿真ourdev_631293NVFR0Q.rar(文件大小:222K) (原文件名:无字库12864 Proteus仿真.rar)

部分程序 (原文件名:q.JPG)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
zhuyi25762
1楼-- · 2020-01-30 15:52
无法下载
SKYdai
2楼-- · 2020-01-30 17:15
无法下载是服务器在调整~~
winmcu
3楼-- · 2020-01-30 22:59
我下载到了,放出楼主的源程序。删除部分能违规的备注,望楼主见凉。
分割线。
---------------------------------------------------------------------------

/********************此程序及备注由贾俊峰制作*******************/
/*******************************************************/
/*******************************************************/
/*晶振:12MHZ*/
/*单片机:51系列单片机*/
/*数组取模:从上到下,列行式*/
/*注意:无字库的12864跟有字库的12864的PDF是不同的,请不要以有字库的PDF进行写程序*/


/*********此程序说明,在无字库的12864中是最完善,易懂的********************/
#include <reg52.h>

typedef unsigned char uchar;

#define LcdDataPort P1   //数据端口
sbit Reset = P3^0;   //复位
sbit RS = P3^7;    //指令数据选择
sbit E = P3^5;    //指令数据控制
sbit CS1 = P3^3;   //左屏幕选择,低电平有效
sbit CS2 = P3^4;   //右屏幕选择
sbit RW = P3^6;    //读写控制
sbit busy = P1^7;   //忙标志

void SetOnOff(uchar onoff);  //开关显示
void SelectScreen(uchar screen);//选择屏幕
void ClearScreen(uchar screen); //清屏
void Show1616(uchar lin,uchar colum,uchar *address);//显示一个汉字
void CheckState();   //判断状态
void LcdDelay(unsigned int time); //延时
void WriteData(uchar dat); //写数据
void SendCommand(uchar command); //写指令
void SetLine(uchar line);  //置页地址
void SetColum(uchar colum);//置列地址
void SetStartLine(uchar startline);//置显示起始行
void InitLcd();    //初始化
void ResetLcd();   //复位



const uchar code HZ_tab[] = {
0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0xFF,0x42,0x42,0x42,0x42,0x7F,0x42,0x42,0x42,0x42,0xFF,0x00,0x00,0x00,/*"由",0*/
0x00,0x02,0x7A,0x4A,0x4A,0x7E,0x4A,0x4A,0x4A,0x7E,0x4A,0x4A,0x7A,0x02,0x00,0x00,0x00,0x80,0x80,0x9F,0x41,0x41,0x21,0x1D,0x01,0x21,0x21,0x5F,0x40,0x80,0x00,0x00,/*"贾",0*/
0x00,0x80,0x60,0xF8,0x07,0x00,0x10,0x98,0x54,0x93,0x10,0x10,0x54,0x98,0x30,0x00,0x01,0x00,0x00,0xFF,0x00,0x80,0x89,0x44,0x46,0x2B,0x12,0x2A,0x46,0x80,0x81,0x00,/*"俊",0*/
0x00,0xF0,0x00,0xFF,0x00,0xF0,0x80,0x90,0x4C,0x57,0xA4,0x54,0x4C,0x84,0x80,0x00,0x00,0x1F,0x10,0x0F,0x08,0x1F,0x10,0x10,0x15,0x15,0xFF,0x15,0x15,0x10,0x10,0x00,/*"峰",0*/
0x40,0x50,0x4E,0x48,0x48,0xFF,0x48,0x48,0x48,0x40,0xF8,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x3E,0x02,0x02,0xFF,0x12,0x22,0x1E,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,/*"制",0*/
0x00,0x80,0x60,0xF8,0x07,0x40,0x30,0x0F,0xF8,0x88,0x88,0x88,0x88,0x08,0x08,0x00,0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x08,0x08,0x00,0x00,/*"作",0*/
0x02,0x02,0xE2,0x22,0x22,0x32,0x2A,0x26,0x22,0x22,0x22,0x22,0xE2,0x02,0x02,0x00,0x00,0x00,0xFF,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFF,0x00,0x00,0x00,/*"百",0*/
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,/*"度",0*/
0x00,0x82,0x84,0x08,0x10,0x20,0x46,0x86,0x40,0x20,0x10,0x08,0x84,0x82,0x00,0x00,0x40,0x21,0x11,0x08,0x04,0x02,0x31,0x30,0x01,0x02,0x04,0x08,0x11,0x21,0x40,0x00,/*"※",0*/
/*--  文字:  智  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x94,0x53,0x32,0x1E,0x32,0x52,0x10,0x00,0x7E,0x42,0x42,0x42,0x7E,0x00,0x00,
0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,

/*--  文字:  俊  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x80,0x60,0xF8,0x07,0x00,0x10,0x98,0x54,0x93,0x10,0x10,0x54,0x98,0x30,0x00,
0x01,0x00,0x00,0xFF,0x00,0x80,0x89,0x44,0x46,0x2B,0x12,0x2A,0x46,0x80,0x81,0x00,

/*--  文字:  电  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,
0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,

/*--  文字:  子  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x82,0x84,0x08,0x10,0x20,0x46,0x86,0x40,0x20,0x10,0x08,0x84,0x82,0x00,0x00,0x40,0x21,0x11,0x08,0x04,0x02,0x31,0x30,0x01,0x02,0x04,0x08,0x11,0x21,0x40,0x00,/*"※",0*/

};

void main()
{
uchar i,line,colum ;
uchar *address ;
InitLcd();
      while(1)
     {
  /****************这里是显示第一行***************************************/

  colum = 16;//开始从第16列显示
  line = 1;//开始从1页显示,既第9行
  address = HZ_tab;
  SetOnOff(0);                //关显示
                    for(i = 1;i < 7;i ++)//因为第一行汉字是6个,前3个显示在左半屏,后3个显示在右半屏。
                    {
                 if(i < 4)
                 SelectScreen(0);//左半屏
                 else
                  SelectScreen(1);//右半屏
                                 
                 Show1616(line,colum ,address);//设置了第1页,第16列开始显示,因为SHOW1616函数  显示一个汉字16x16,所以读取address 中32个字节,

                                  colum += 16;//如果不加16 ,会在原位置覆盖
                           
               address += 32;       //加32 是读取下个字符的字节,上面有陈述。
                      if(colum >63)//在这个刚好是显示第3个字符时,第4个要在右半屏显示,所以清0
                            colum = 0;

                                        }

/**************这里是显示第2行*****************************************/

   line = 5;//开始从第5页显示
  colum = 0;//从第1列显示
                      for(i = 0;i <8; i ++)//因为要显示8个字符,前4个显示在左半屏,后4个要显示在右半屏
                        {
                     if(i < 4)
                   SelectScreen(0);//左半屏
                     else
                    SelectScreen(1);//右半屏

                                         
   Show1616(line,colum ,address);
   colum += 16;

   
                   if(colum >63)
                    colum = 0;
                    address += 32; }


                                          
  SelectScreen(2);//选择全屏,这句话可以不写
  SetOnOff(1);    // 开启总显示
  for(i = 0;i < 50;i ++)  //延时
   LcdDelay(30000);
       }

}



/**********************************以下是液晶的内部设置与驱动**********************************************/   


/***************液晶延迟*****************/
void LcdDelay(unsigned int time)
{
while(time --);
}




/***************检测读忙******************/
void CheckState()
{
E = 1;
RS = 0;
RW = 1;
LcdDataPort = 0xff;
while(!busy);
}


/***************写数据函数*************************/
void WriteData(uchar dat)
{
//CheckState();
E = 1;
RS = 1;
RW = 0;
LcdDataPort = dat;
E = 0;
}


/****************写指令函数***************************/
void SendCommand(uchar command)
{
//CheckState();
E = 1;
RW = 0;
RS = 0;
LcdDataPort = command;
E = 0;
}


/*****************选择显示左右屏*******************************/
void SelectScreen(uchar screen) //0-左屏,1—右屏,2-全屏
{
switch(screen)
{
  case 0 :
   CS1 = 0;
   LcdDelay(2);
   CS2 = 1;
   LcdDelay(2);
   break;
  case 1 :
   CS1 = 1;
   LcdDelay(2);
   CS2 = 0;
   LcdDelay(2);
   break;
  case 2 :
   CS1 = 0;
   LcdDelay(2);
   CS2 = 0;
   LcdDelay(2);
   break;
}
}


/********************软件清屏,screen 0-全屏,1—左屏,2-右屏******************************/
void ClearScreen(uchar screen)  // screen 0-全屏,1—左屏,2-右屏
{
uchar i,j;
SelectScreen(screen);
for(i = 0;i < 8;i ++)
{
  SetLine(i);//页设置0-7
  SetColum(0);//列设置 0-63
  for(j = 0;j < 64; j ++)
   WriteData(0);//为1时 液晶的点阵点亮。
}
}



/**********页设置0-7,既把X方向的点阵-64点-分为8份,方便显示汉字,不会自动加1********/
void SetLine(uchar line)  //line -> 0 : 7 页 设置
{
line = line & 0x07;//只取后三位xxxx x111  ,这3个是要改变位置的数据
line = line | 0xb8;   //1011 1xxx ,必须发送1011 1xxx,这个是页设置的固定指令
SendCommand(line);
}



/*****************列设置0-63,因为有左右半屏,就平等的把Y方向的分成2份,每份为64个点,会自动加1************/
void SetColum(uchar colum) //colum -> 0 :63//列设置
{
colum = colum & 0x3f;//xx11 1111,这个是要改变Y位置的数据
colum = colum | 0x40;  //必须发送01xx xxxx,是列设置的固定指令
SendCommand(colum);
}


/**********设置显示起始行0-63,因为在X方向上有64个点,可以任意选择,不会自动加1,程序设置为0开始****************/
void SetStartLine(uchar startline) //startline -> 0 : 63设置显示起始行
{
startline = startline & 0x3f;///xx11 1111,这个是要改变x位置的数据
startline = startline | 0xc0; //11xxxxxx,是起始行设置的固定指令。
SendCommand(startline);
}




/******************屏幕总显示开关,1为开,0为关*************************************/
void SetOnOff(uchar onoff) //开显示 1,关显示0.
{
if(onoff == 1)
  SendCommand(0x3f);   //0011 111x
else
  SendCommand(0x3e);//0011 1110
}


/*******************复位函数************************************/
void ResetLcd()//复位 函数
{
Reset = 0;
LcdDelay(2);
Reset = 1;
LcdDelay(2);
RS0 = 0;
LcdDelay(2);
RS1 = 0;
LcdDelay(2);
SetOnOff(1);
}



/********************液晶初始化,跟有字库的不同***********************************/
void InitLcd()
{
ResetLcd();//重启
SetOnOff(0);//显示关
ClearScreen(2);//清屏
SetLine(0);//页设置
SetColum(0);//列设置
SetStartLine(0);//设置起始页
SetOnOff(1);//显示开
}



/********************液晶显示函数仅显示一个16x16汉字,lin 0-7 控制x方向第几页位置,colum0-63 控制y方向第几列位置,address为数据***********************************/
/********************这个显示函数只是单片的显示,所以在主函数中要设置CS1和CS2***********************************/
/********************address的格式:要有32个16进制的数组,取模方向为从上到下,列行式***********************************/
void Show1616(uchar lin,uchar colum,uchar *address)
{
uchar i;
SetLine(lin);//页设置
SetColum(colum);//列设置
for(i = 0;i < 16;i ++)
  WriteData(*(address ++));//写数据
SetLine(lin + 1);//页设置
SetColum(colum);//列设置
for(i = 0;i < 16;i ++)
  WriteData(*(address ++));//写数据。
}
rifjft
4楼-- · 2020-01-31 00:14
 精彩回答 2  元偷偷看……
jayhhuh
5楼-- · 2020-01-31 01:41
谢谢~~
assingle
6楼-- · 2020-01-31 05:02
谢谢楼主。

一周热门 更多>