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日