portues软件仿真--LCD12864

2023.7.25
非常荣幸19年的关于proteus 软件仿真的相关博文收到大家的关注,因本人能力有限,不能及时回复大家的评论区,现将19年本人所做过的关于51单片机的仿真文件和程序源文件开源给大家,如有问题欢迎大家讨论。
开源的链接地址
链接总是出错,可以进入我的文章里面进行查找开源的文章(本身没几篇比较好找)

proteus 软件仿真之LCD12864(中文显示) 二

大二电子专业小白一名,平时闲来无事在学校老师实验室自学,自学过程中发现一些有困扰到自己的地方,所以特来此记录。一是当作自己学习笔记;二是有幸帮助到有和自己遇到相同问题的童鞋,也是一大善事。因个人水平能力有限,错误之处还请及时纠正。

注:只适合于仿真使用与现实中LCD12864有不同!!!!

以下程序及原理图为实验室老师提供,亲测仿真

proteus仿真原理图

仿真原理图

程序源码


#include <reg51.h>
#define  uchar  signed char
#define  uint   unsigned  int
//#define in_real_board	//选择是否下载到实际电路
// 常量定义	 
#define lcdrow 		   0xc0//设置起始行
#define	lcdpage		   0xb8//设置起始页
#define	lcdcolumn	   0x40//设置起始列
#define	 c_page_max	   0x08//页数最大值
#define  c_column_max  0x40//列数最大值
//端口定义
#define  bus  P0
sbit  rst=P2^0;
sbit  e=P2^2;
sbit  rw=P2^3;
sbit  rs=P2^4;
sbit  cs1=P2^5;
sbit  cs2=P2^6;
//函数申明
void   delayms(uint);  //延时n ms 
void   delayus10(void);//延时10us
void   select(uchar);  //选择屏幕
void   send_cmd(uchar); //写命令
void   send_data(uchar); //写数据
void   clear_screen(void);//清屏
void   initial(void);  //LCD初始化
void   display_zf(uchar,uchar,uchar,uchar);   //显示字符
void   display_hz(uchar,uchar,uchar,uchar);   //显示汉字
void   display(void);  //在LCD上显示
//字符表
//*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
//取模方式:纵向取模下高位,从上到下,从左到右取模
uchar  code  table_zf[]={
//*--  文字:  P  --*/
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,
//*--  文字:  R  --*/
0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,
//*--  文字:  O  --*/
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,
//*--  文字:  T  --*/
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,
//*--  文字:  E  --*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,
//*--  文字:  U  --*/
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,
//*--  文字:  S  --*/
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00
};
//汉字表
//*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
//取模方式:纵向取模下高位,从上到下,从左到右取模
uchar code  table_hz[ ]={
//*--  文字:  电  --*/
0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,
//*--  文字:  子  --*/
0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xE2,0x12,0x0A,0x06,0x02,0x00,0x80,0x00,0x00,
0x01,0x01,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
//*--  文字:  设  --*/
0x40,0x41,0xCE,0x04,0x00,0x80,0x40,0xBE,0x82,0x82,0x82,0xBE,0xC0,0x40,0x40,0x00,
0x00,0x00,0x7F,0x20,0x90,0x80,0x40,0x43,0x2C,0x10,0x10,0x2C,0x43,0xC0,0x40,0x00,
//*--  文字:  计  --*/
0x20,0x21,0x2E,0xE4,0x00,0x00,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00,
0x00,0x00,0x00,0x7F,0x20,0x10,0x08,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,
//*--  文字:  与  --*/
0x00,0x00,0x00,0x00,0x7E,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xCC,0x08,0x00,
0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x24,0x46,0x44,0x20,0x1F,0x00,0x00,
//*--  文字:  创  --*/
0x40,0x20,0xD0,0x4C,0x43,0x44,0x48,0xD8,0x30,0x10,0x00,0xFC,0x00,0x00,0xFF,0x00,
0x00,0x00,0x3F,0x40,0x40,0x42,0x44,0x43,0x78,0x00,0x00,0x07,0x20,0x40,0x3F,0x00,
//*--  文字:  新  --*/
0x20,0x24,0x2C,0x35,0xE6,0x34,0x2C,0x24,0x00,0xFC,0x24,0x24,0xE2,0x22,0x22,0x00,
0x21,0x11,0x4D,0x81,0x7F,0x05,0x59,0x21,0x18,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,
//*--  文字:  的  --*/
0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,
0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00,
//*--  文字:  最  --*/
0x40,0x40,0xC0,0x5F,0x55,0x55,0xD5,0x55,0x55,0x55,0x55,0x5F,0x40,0x40,0x40,0x00,
0x20,0x20,0x3F,0x15,0x15,0x15,0xFF,0x48,0x23,0x15,0x09,0x15,0x23,0x61,0x20,0x00,
//*--  文字:  佳  --*/
0x40,0x20,0xF0,0x1C,0x47,0x4A,0x48,0x48,0x48,0xFF,0x48,0x48,0x4C,0x68,0x40,0x00,
0x00,0x00,0xFF,0x00,0x40,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x46,0x64,0x40,0x00,
//*--  文字:  平  --*/
0x00,0x01,0x05,0x09,0x71,0x21,0x01,0xFF,0x01,0x41,0x21,0x1D,0x09,0x01,0x00,0x00,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
//*--  文字:  台  --*/
0x00,0x00,0x40,0x60,0x50,0x48,0x44,0x63,0x22,0x20,0x20,0x28,0x70,0x20,0x00,0x00,
0x00,0x00,0x00,0x7F,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x00

};
void main()
{
initial();
display();
clear_screen();
display();
while(1);
}

//延时10us
void  delayus10(void)
{
uchar i=5;
while(--i);
}
//延时10ms
void  delayms(uint j)
{
uchar i=250;
for(;j>0;j--){ while(--i); i=249;while(--i);i=250;}
						
}
//屏幕选择-cs=0选择双屏,cs=1选择左半屏,cs=2选择右半屏
void   select(uchar cs)
{
#ifdef  in_real_board
if(cs==0)cs1=1,cs2=1;
	else if(cs==1)cs1=1,cs2=0;
		  else  cs1=0,cs2=1;
#else
if(cs==0)cs1=0,cs2=0;
	else if(cs==1)cs1=0,cs2=1;
		  else  cs1=1,cs2=0;
#endif
}
//写命令
void  send_cmd(uchar cmd)
{
rs=0;rw=0; bus=cmd;delayus10();e=1;e=0;
}
//写数据
void  send_data(uchar dat)
{
rs=1;rw=0; bus=dat;delayus10();e=1;e=0;
}
//清屏
void  clear_screen(void)
{
uchar c_page,c_column;
	select(0);
	for(c_page=0;c_page<c_page_max;c_page++)
		{ 	
		send_cmd(c_page+lcdpage);
	  	send_cmd(lcdcolumn);
	 	for(c_column=0;c_column<c_column_max;c_column++)
	  		{	    
			 send_data(0X00);              
	   		}	
		}
}
//LCD初始化
void   initial(void)
{
select(0);
rst=0;delayms(10);rst=1;
clear_screen();
send_cmd(lcdrow);
send_cmd(lcdcolumn);
send_cmd(lcdpage);
send_cmd(0x3f);
}
//写字符
//c_page为当前页,c_column为当前列,num为字符数,
//offset为所取字符在显示缓冲区中的偏移单位
void   display_zf(uchar c_page,uchar c_column,uchar num,uchar offset)
{
uchar c1,c2,c3;
for(c1=0;c1<num;c1++)
	{for(c2=0;c2<2;c2++)
		{for(c3=0;c3<8;c3++)
			{
			 send_cmd(lcdpage+c_page+c2);
			 send_cmd(lcdcolumn+c_column+c1*8+c3);
			 send_data(table_zf[(c1+offset)*16+c2*8+c3]);
			}
		}
	}
}
//写汉字
//c_page为当前页,c_column为当前列,num为字符数,
//offset为所取汉字在显示缓冲区中的偏移单位
void   display_hz(uchar c_page,uchar c_column,uchar num,uchar offset)
{
uchar c1,c2,c3;
for(c1=0;c1<num;c1++)
	{for(c2=0;c2<2;c2++)
		{for(c3=0;c3<16;c3++)
			{
			 send_cmd(lcdpage+c_page+c2);
			 send_cmd(lcdcolumn+c_column+c1*16+c3);
			 send_data(table_hz[(c1+offset)*32+c2*16+c3]);
			}
		}
	}
}
//在LCD上显示
void  display(void)
{
select(1);
display_zf(0,40,3,0);
display_hz(2,0,4,0);
display_hz(4,32,2,8);
select(2);
display_zf(0,0,4,3);
display_hz(2,0,4,4);
display_hz(4,0,2,10);
}

G.Z.W
2019年6月9日

  • 4
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G.Z.W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值