• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

基于51单片机的1602计算器设计(一)

04/22 08:29
855
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

单片机仿真设计合集资料获取.pdf

共1个文件

资料清单:C程序+仿真+设计报告+使用说明+元件清单+操作视频

仿真版本:Proteus8.6及以上版本

程序编译:Keil5 C51

编程语言:C语言

设计编号:【Q06】

1.? 简介

? 本文提出了一种基于51单片机LCD1602计算器设计。该设计是以AT89C51单片机为核心的计算器模拟系统,输入采用4×4矩阵键盘,可以进行加、减、乘、除数字运算,并在LCD1602上显示操作过程。

2.? 主要功能

a.通过LCD1602显示计算过程。

b.通过4×4矩阵键盘进行加、减、乘、除数字运算。

3.? 源程序(Keil5)

本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。

void init_lcd(void)            //初始化液晶,及画面初始化
{
	wela=0;                      //写液晶
	lcden=0;                     //使能1602
	write_com(0x38);             //8 位总线,双行显示,5X7 的点阵字符
	LCD_Delay_us(100);           //延时100us
	write_com(0x0c);             //开显示,无光标,光标不闪烁
	write_com(0x06);             //光标右移动
	write_com(0x01);             //清屏
	write_com(0x80);             //DDRAM 地址归0
}
//************************************************************************/
// 描述: 反转法键盘扫描 
//************************************************************************/
short keycheckdown()				/* 反转法键盘扫描 */
{

	short temp1,temp2,temp,a=0xff;
	P1=0xf0;						/* 输入行值(或列值) */
	LCD_Delay_ms(20);				/* 延时 */
	temp1=P1;						/* 读列值(或行值) */
	P1=0xff;
	LCD_Delay_ms(20);				/* 延时 */
	P1=0x0f;						/* 输入列值(或行值) */
	LCD_Delay_ms(20);				/* 延时 */	
	temp2=P1;						/* 读行值(或列值) */
	P1=0xff;
	temp=(temp1&0xf0)|(temp2&0xf);	/* 将两次读入数据组合 */
	switch(temp)					/* 通过读入数据组合判断按键位置 */
	{


		case 0x77 :a=0x0a;break;//  按键+   
		case 0x7b :a=0x0e; break;// 按键=	
		case 0x7d :a=0;	   break;// 按键0
		case 0x7e :a=0x0f; break;// 按键CE

		case 0xe7 :a=0x0d;break;// 	按键/
		case 0xbb :a=0x9;break; //  按键9
		case 0xbd :a=0x8;break; //  按键8 
		case 0xbe :a=0x7;break; // 	按键7

		case 0xd7 :a=0x0c;break;//  按键*
		case 0xdb :a=0x6;break; // 	按键6
		case 0xdd :a=0x5;break; // 	按键5
		case 0xde :a=0x4;break; // 	按键4

		case 0xb7 :a=0x0b; break;// 按键-
		case 0xeb :a=3;break;	//  按键3
		case 0xed :a=2;break;	//  按键2
		case 0xee :a=1;break;	//  按键1

		default :a=0xff;
	}
	return a;						/* 返回按键值 */
}
void display_a() //显示数据a
{
	dispaly[3]=data_a%10000/1000;    //千
	dispaly[2]=data_a%1000/100;      //百
	dispaly[1]=data_a%100/10;        //十
	dispaly[0]=data_a%10;            //个 

	write_com(0x80+0);               //显示数据a
	if(data_a>999){	write_date('0'+dispaly[3]);}      //显示千位
	if(data_a>99){	write_date('0'+dispaly[2]);}		 //显示百位
	if(data_a>9){	write_date('0'+dispaly[1]);}     //显示十位
	      	        write_date('0'+dispaly[0]);      //显示个位
}

void display_b() //显示数据b
{
	write_com(0x80+7); //第一行
	dispaly[3]=data_b%10000/1000;    //千
	dispaly[2]=data_b%1000/100;      //百
	dispaly[1]=data_b%100/10;        //十
	dispaly[0]=data_b%10;            //个 

if(data_b>999){	write_date('0'+dispaly[3]); }     //显示千位   
if(data_b>99) {	write_date('0'+dispaly[2]); }    //显示百位  
if(data_b>9)  {	write_date('0'+dispaly[1]); }     //显示十位
  			    write_date('0'+dispaly[0]);      //显示个位
}

//计算结果
void display_c(x)
{

	if(data_c<100000000&&data_c>-1)//溢出时显示错误
	{	

		dispaly[8]=data_c%1000000000/100000000;    	//万万
		dispaly[7]=data_c%100000000/10000000;    	//千万
		dispaly[6]=data_c%10000000/1000000;    		//百万
		dispaly[5]=data_c%1000000/100000;    		//十万
		dispaly[4]=data_c%100000/10000;    			//万
		dispaly[3]=data_c%10000/1000;    			//千
		dispaly[2]=data_c%1000/100;      			//百
		dispaly[1]=data_c%100/10;        			//十
		dispaly[0]=data_c%10;            			//个 
		write_com(0x80+6+0x40); //第一行
		if(x==4)
		{    
			if(data_c>99999999)	{	write_date('0'+dispaly[8]);}    //显示万万
			if(data_c>9999999)	{	write_date('0'+dispaly[7]);}   //千万
			if(data_c>999999)	{	write_date('0'+dispaly[6]);}    //百万
			if(data_c>99999)	{	write_date('0'+dispaly[5]);}    //十万
			if(data_b!=0)		{
									write_date('0'+dispaly[4]);    //万
									write_date('.');
									write_date('0'+dispaly[3]);    //千
									write_date('0'+dispaly[2]);    //百
									write_date('0'+dispaly[1]);    //十
									write_date('0'+dispaly[0]);    //个 
								}
		}
	else{
		if(data_c>99999999)	{	write_date('0'+dispaly[8]);}    //显示万万
		if(data_c>9999999)	{	write_date('0'+dispaly[7]);}    //千万
		if(data_c>999999)	{	write_date('0'+dispaly[6]);}    //百万
		if(data_c>99999)	{	write_date('0'+dispaly[5]);}    //十万
		if(data_c>9999)		{	write_date('0'+dispaly[4]);}    //万
		if(data_c>999)		{	write_date('0'+dispaly[3]);}    //千
		if(data_c>99)		{	write_date('0'+dispaly[2]);}    //百
		if(data_c>9)		{	write_date('0'+dispaly[1]);}    //十
								write_date('0'+dispaly[0]);    //个 
		}
	}

4.? 仿真proteus8.6

? 本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。

加:

减:

乘:

除:

5.? 设计报告

设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考

6.? 资料清单

设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。

7.? 资料获取链接

百度网盘下载链接:【Q06】百度网盘下载链接

更多单片机仿真设计合集:单片机仿真设计合集

  • 单片机仿真设计合集资料获取.pdf
    下载

相关推荐