【Proteus仿真】STC15单片机+LCD1602驱动显示时间(DEMO)示例

【Proteus仿真】STC15单片机+LCD1602驱动显示时间(DEMO)示例


  • Proteus仿真
    在这里插入图片描述

Proteus加载 STC15单片机说明

Proteus里面唯一能找到的 STC15一款支持仿真的STC单片机,只能在Proteus8.9以上的版本以上中才可以找到,低于这个版本没有该型号的单片机。

  • 选择加载如下:
    在这里插入图片描述

Proteus仿真设置

  • 添加Hex文件
  • 设置相应的时钟频率,这个时钟频率直接运行仿真时的运行速度
    在这里插入图片描述

示例代码


/*************	本程序功能说明	**************

驱动LCD1602字符屏.

显示效果为: LCD显示时间.

第一行显示 ---Clock demo---
第二行显示     9-30-27

******************************************/

#define MAIN_Fosc		22118400L	//定义主时钟

#include	"STC15Fxxxx.H"

/*************	IO口定义	**************/


/*************	本地变量声明	**************/

u8	hour,minute,second;

void	DisplayRTC(void);
void	RTC(void);
void	delay_ms(u8 ms);
void	Initialize_LCD(void);
void	Write_AC(u8 hang,u8 lie);
void	Write_DIS_Data(u8 DIS_Data);
void	ClearLine(u8 row);
u8		BIN_ASCII(u8 tmp);
void 	PutString(u8 row, u8 column, u8 *puts);
void	WriteChar(u8 row, u8 column, u8 dat);



//========================================================================
// 函数: void main(void)
// 描述: 主函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void main(void)
{
	P0M1 = 0;	P0M0 = 0;	//设置为准双向口
	P1M1 = 0;	P1M0 = 0;	//设置为准双向口
	P2M1 = 0;	P2M0 = 0;	//设置为准双向口
	P3M1 = 0;	P3M0 = 0;	//设置为准双向口
	P4M1 = 0;	P4M0 = 0;	//设置为准双向口
	P5M1 = 0;	P5M0 = 0;	//设置为准双向口
	P6M1 = 0;	P6M0 = 0;	//设置为准双向口
	P7M1 = 0;	P7M0 = 0;	//设置为准双向口

	Initialize_LCD();
	ClearLine(0);//清屏第一行
	ClearLine(1);//清屏第二行

	PutString(0,0,"---Clock demo---");
	
	hour   = 9;	//初始化时间值
	minute = 30;
	second = 27;
	DisplayRTC();
	
	while(1)
	{
		delay_ms(250);		//延时1秒
		delay_ms(250);
		delay_ms(250);
		delay_ms(250);
		RTC();
		DisplayRTC();
	}
} 
/**********************************************/

//========================================================================
// 函数: void  delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void  delay_ms(u8 ms)
{
     unsigned int i;
	 do{
	      i = MAIN_Fosc / 13000;
		  while(--i)	;   //14T per loop
     }while(--ms);
}


//========================================================================
// 函数: void	DisplayRTC(void)
// 描述: 显示时钟函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void	DisplayRTC(void)
{
	if(hour >= 10)	WriteChar(1,4,hour / 10 + '0');
	else			WriteChar(1,4,  0x30);//不足10时,前面补零
	WriteChar(1,5,hour % 10 +'0');
	WriteChar(1,6,':');
	WriteChar(1,7,minute / 10 +'0');
	WriteChar(1,8,minute % 10 +'0');
	WriteChar(1,9,':');
	WriteChar(1,10,second / 10 +'0');
	WriteChar(1,11,second % 10 +'0');
}

//========================================================================
// 函数: void	RTC(void)
// 描述: RTC演示函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void	RTC(void)
{
	if(++second >= 60)
	{
		second = 0;
		if(++minute >= 60)
		{
			minute = 0;
			if(++hour >= 24)	hour = 0;
		}
	}
}


/************* LCD1602相关程序	*****************************************************/

#define LineLength	16		//16x2

/*************	Pin define	*****************************************************/

sfr		LCD_BUS = 0x90;	//P0--0x80, P1--0x90, P2--0xA0, P3--0xB0

sbit	LCD_B7  = LCD_BUS^7;	//D7 -- Pin 14		LED- -- Pin 16 
sbit	LCD_B6  = LCD_BUS^6;	//D6 -- Pin 13		LED+ -- Pin 15
sbit	LCD_B5  = LCD_BUS^5;	//D5 -- Pin 12		Vo   -- Pin 3
sbit	LCD_B4  = LCD_BUS^4;	//D4 -- Pin 11		VDD  -- Pin 2
sbit	LCD_B3  = LCD_BUS^3;	//D3 -- Pin 10		VSS  -- Pin 1
sbit	LCD_B2  = LCD_BUS^2;	//D2 -- Pin  9
sbit	LCD_B1  = LCD_BUS^1;	//D1 -- Pin  8
sbit	LCD_B0  = LCD_BUS^0;	//D0 -- Pin  7

sbit	LCD_ENA	= P2^2;	//Pin 6
sbit	LCD_RW	= P2^1;	//Pin 5	//LCD_RS   R/W   DB7--DB0        FOUNCTION
sbit	LCD_RS	= P2^0;	//Pin 4	//	0		0	  INPUT      write the command to LCD model
								//	0		1     OUTPUT     read BF and AC pointer from LCD model
								//	1		0     INPUT      write the data to LCD  model
								//	1		1     OUTPUT     read the data from LCD model
/*
total 2 lines, 16x2= 32
first line address:  0~15
second line address: 64~79

*/

#define C_CLEAR			0x01		//clear LCD
#define C_HOME 			0x02		//cursor go home
#define C_CUR_L			0x04		//cursor shift left after input
#define C_RIGHT			0x05		//picture shift right after input
#define C_CUR_R			0x06		//cursor shift right after input
#define C_LEFT 			0x07		//picture shift left after input
#define C_OFF  			0x08		//turn off LCD
#define C_ON   			0x0C		//turn on  LCD
#define C_FLASH			0x0D		//turn on  LCD, flash 
#define C_CURSOR		0x0E		//turn on  LCD and cursor
#define C_FLASH_ALL		0x0F		//turn on  LCD and cursor, flash
#define C_CURSOR_LEFT	0x10		//single cursor shift left
#define C_CURSOR_RIGHT	0x10		//single cursor shift right
#define C_PICTURE_LEFT	0x10		//single picture shift left
#define C_PICTURE_RIGHT	0x10		//single picture shift right
#define C_BIT8			0x30		//set the data is 8 bits
#define C_BIT4			0x20		//set the data is 4 bits
#define C_L1DOT7		0x30		//8 bits,one line 5*7  dots
#define C_L1DOT10		0x34		//8 bits,one line 5*10 dots
#define C_L2DOT7		0x38		//8 bits,tow lines 5*7 dots
#define C_4bitL2DOT7	0x28		//4 bits,tow lines 5*7 dots
#define C_CGADDRESS0	0x40		//CGRAM address0 (addr=40H+x)
#define C_DDADDRESS0	0x80		//DDRAM address0 (addr=80H+x)


#define	LCD_DelayNop()	NOP(15)

#define		LCD_BusData(dat)	LCD_BUS = dat


//========================================================================
// 函数: void	CheckBusy(void)
// 描述: 检测忙函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void	CheckBusy(void)
{
	u16	i;
	for(i=0; i<5000; i++)	{if(!LCD_B7)	break;}		//check the LCD busy or not. With time out
//	while(LCD_B7);			//check the LCD busy or not. Without time out
}

//========================================================================
// 函数: void IniSendCMD(u8 cmd)
// 描述: 初始化写命令(不检测忙)
// 参数: cmd: 要写的命令.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void IniSendCMD(u8 cmd)
{
	LCD_RW = 0;
	LCD_BusData(cmd);
	LCD_DelayNop();
	LCD_ENA = 1;
	LCD_DelayNop();
	LCD_ENA = 0;
	LCD_BusData(0xff);
}

//========================================================================
// 函数: void Write_CMD(u8 cmd)
// 描述: 写命令(检测忙)
// 参数: cmd: 要写的命令.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void Write_CMD(u8 cmd)
{
	LCD_RS  = 0;
	LCD_RW = 1;
	LCD_BusData(0xff);
	LCD_DelayNop();
	LCD_ENA = 1;
	CheckBusy();			//check the LCD busy or not.
	LCD_ENA = 0;
	LCD_RW = 0;
	
	LCD_BusData(cmd);
	LCD_DelayNop();
	LCD_ENA = 1;
	LCD_DelayNop();
	LCD_ENA = 0;
	LCD_BusData(0xff);
}

//========================================================================
// 函数: void Write_DIS_Data(u8 dat)
// 描述: 写显示数据(检测忙)
// 参数: dat: 要写的数据.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void Write_DIS_Data(u8 dat)
{
	LCD_RS = 0;
	LCD_RW = 1;

	LCD_BusData(0xff);
	LCD_DelayNop();
	LCD_ENA = 1;
	CheckBusy();			//check the LCD busy or not.
	LCD_ENA = 0;
	LCD_RW = 0;
	LCD_RS  = 1;

	LCD_BusData(dat);
	LCD_DelayNop();
	LCD_ENA = 1;
	LCD_DelayNop();
	LCD_ENA = 0;
	LCD_BusData(0xff);
}


//========================================================================
// 函数: void Initialize_LCD(void)
// 描述: 初始化函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void Initialize_LCD(void)
{
	LCD_ENA = 0;
	LCD_RS  = 0;
	LCD_RW = 0;

	delay_ms(100);
	IniSendCMD(C_BIT8);		//set the data is 8 bits

	delay_ms(10);
	Write_CMD(C_L2DOT7);		//tow lines 5*7 dots

	delay_ms(6);
	Write_CMD(C_CLEAR);		//clear LCD RAM
	Write_CMD(C_CUR_R);		//Curror Shift Right
	Write_CMD(C_ON);		//turn on  LCD
}



//========================================================================
// 函数: void ClearLine(u8 row)
// 描述: 清除1行
// 参数: row: 行(0或1)
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void ClearLine(u8 row)
{
	u8 i;
	Write_CMD(((row & 1) << 6) | 0x80);
	for(i=0; i<LineLength; i++)	Write_DIS_Data(' ');
}

//========================================================================
// 函数: void	WriteChar(u8 row, u8 column, u8 dat)
// 描述: 指定行、列和字符, 写一个字符
// 参数: row: 行(0或1),  column: 第几个字符(0~15),  dat: 要写的字符.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void	WriteChar(u8 row, u8 column, u8 dat)
{
	Write_CMD((((row & 1) << 6) + column) | 0x80);
	Write_DIS_Data(dat);
}

//========================================================================
// 函数: void PutString(u8 row, u8 column, u8 *puts)
// 描述: 写一个字符串,指定行、列和字符串首地址
// 参数: row: 行(0或1),  column: 第几个字符(0~15),  puts: 要写的字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void PutString(u8 row, u8 column, u8 *puts)
{
	Write_CMD((((row & 1) << 6) + column) | 0x80);
	for ( ;  *puts != 0;  puts++)		//遇到停止符0结束
	{
		Write_DIS_Data(*puts);
		if(++column >= LineLength)	break;
	}
}

程序源码和仿真资源

本示例基于Proteus8.12平台,低于这个版本不能运行。

链接:https://pan.baidu.com/s/1M8z3CnzKMu4mTNqfalgdmg 
提取码:80sz   //请使用复制粘贴命令,手动输入容易出错!

不迎合,话少,不喜欢拐弯抹角,习惯一个人安静的独活,能处就处,处不来不接近。
  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
<h3>回答1:</h3><br/>Proteus是一款常用的电路仿真软件,可以用来仿真STC15W4K32S4单片机。在Proteus中,可以添加STC15W4K32S4的元件库,并进行电路设计和仿真。通过仿真,可以验证电路的正确性和性能,提高电路设计的效率和可靠性。同时,Proteus还支持多种外设的仿真,如LCD、LED、按键等,可以更加全面地验证电路的功能。 <h3>回答2:</h3><br/>Proteus是一款广泛使用的电子电路仿真软件,可以模拟各种电路,包括单片机STC15W4K32S4是一款由STC微电子开发的单片机,具有高性能、低功耗等特点,是广泛应用于各种电子设备中的单片机。 在Proteus仿真STC15W4K32S4的过程中,需要先准备好STC15W4K32S4的电路图,可以通过电路软件绘制。然后,在Proteus中打开仿真软件,选择STC15W4K32S4的型号,将电路图导入仿真软件中,接着进行电路仿真。 在STC15W4K32S4的电路图中,需要加入各种外部器件,如晶振、电容、电阻、LED、按键等,以便进行电路正常的运行。在Proteus中,可仿真外部器件的功能,进行各种电路组合,从而实现模拟整个电路的工作原理。 在仿真过程中,可以通过调试器,观察单片机的工作状态,比如时钟频率、寄存器值等,以此判断电路是否正常工作。同时,还可以通过添加波形显示,实时观测各种波形信号的变化,从而更直观地了解电路的工作原理。 总之,Proteus仿真STC15W4K32S4可以帮助工程师更好地理解和设计单片机电路,提高电路设计和调试的效率。 <h3>回答3:</h3><br/>Proteus是一款非常强大的电路仿真软件,可以模拟具有复杂CPU结构的芯片,例如STC15W4K32S4。STC15W4K32S4是一款具有单片机结构的嵌入式处理器,具有高性能、低功耗、先进的功能和完善的接口。 要在Proteus仿真STC15W4K32S4,首先需要在软件中添加STC15W4K32S4的仿真模型。这个模型可以从STC官方网站上下载,并且可以与软件实现非常好的兼容性。添加模型之后,就可以使用Proteus搭建出实际运行的电路,例如设置外部晶振、电源和其他借口。然后可以通过连接仿真器与目标板来实现仿真。 在使用Proteus仿真STC15W4K32S4的过程中,会发现它非常稳定,并且可以帮助工程师对硬件开发过程中的问题进行预防和调试。使用Proteus仿真器模拟STC15W4K32S4之后,可以更好地理解单片机的软件结构以及整个嵌入式系统的设计和调试流程。 总之,Proteus是一款非常强大的电路仿真软件,可以帮助工程师更好地了解和开发单片机。在模拟STC15W4K32S4的过程中,可以通过建立仿真器模型和电路连接,对单片机进行全面的测试和分析,从而实现稳定和可靠的系统设计。无论是在教学还是实际开发中,Proteus都是必不可少的工具之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值