• 方案介紹
    • 1.? 簡介
    • 2.? 主要功能
    • 3.? 源程序(Keil5)
    • 4.? 仿真proteus8.6
    • 5.? 設(shè)計報告
    • 6.? 資料清單
    • 7.? 資料獲取鏈接
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

基于51單片機的1602計算器設(shè)計(一)

04/22 08:29
355
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

單片機仿真設(shè)計合集資料獲取.pdf

共1個文件

資料清單:C程序+仿真+設(shè)計報告+使用說明+元件清單+操作視頻

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

程序編譯:Keil5 C51

編程語言:C語言

設(shè)計編號:【Q06】

1.? 簡介

? 本文提出了一種基于51單片機LCD1602計算器設(shè)計。該設(shè)計是以AT89C51單片機為核心的計算器模擬系統(tǒng),輸入采用4×4矩陣鍵盤,可以進行加、減、乘、除數(shù)字運算,并在LCD1602上顯示操作過程。

2.? 主要功能

a.通過LCD1602顯示計算過程。

b.通過4×4矩陣鍵盤進行加、減、乘、除數(shù)字運算。

3.? 源程序(Keil5)

本設(shè)計采用keil5 C51軟件(內(nèi)附安裝包)實現(xiàn)程序設(shè)計。如需用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
}
//************************************************************************/
// 描述: 反轉(zhuǎn)法鍵盤掃描 
//************************************************************************/
short keycheckdown()				/* 反轉(zhuǎn)法鍵盤掃描 */
{

	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);	/* 將兩次讀入數(shù)據(jù)組合 */
	switch(temp)					/* 通過讀入數(shù)據(jù)組合判斷按鍵位置 */
	{


		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() //顯示數(shù)據(jù)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);               //顯示數(shù)據(jù)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() //顯示數(shù)據(jù)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]);      //顯示個位
}

//計算結(jié)果
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

? 本設(shè)計采用proteus8.6軟件(內(nèi)附安裝包)實現(xiàn)仿真設(shè)計,如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導出的,所以請盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。

加:

減:

乘:

除:

5.? 設(shè)計報告

設(shè)計報告主要包括硬件電路、軟件設(shè)計、仿真調(diào)試等等,僅供參考

6.? 資料清單

設(shè)計資料主要包括C程序+仿真+設(shè)計報告+使用說明+元件清單+操作視頻等。

7.? 資料獲取鏈接

百度網(wǎng)盤下載鏈接:【Q06】百度網(wǎng)盤下載鏈接

更多單片機仿真設(shè)計合集:單片機仿真設(shè)計合集

  • 單片機仿真設(shè)計合集資料獲取.pdf
    下載

相關(guān)推薦