該計(jì)算器系統(tǒng)51 系列的單片機(jī)進(jìn)行的數(shù)字計(jì)算器系統(tǒng)設(shè)計(jì),可以完成計(jì)算器的鍵盤輸入, 進(jìn)行加、 減、乘、除的簡單四則運(yùn)算,并在 LCD屏幕上相應(yīng)的顯示結(jié)果。選擇內(nèi)部存儲(chǔ)資源豐富的 51 單片 機(jī),輸入采用 4×4矩陣鍵盤,顯示采用LCD1602屏幕模塊進(jìn)行顯示。軟件方面從分析計(jì)算器功能、 流程圖設(shè)計(jì),再到程序的編寫進(jìn)行系統(tǒng)設(shè)計(jì)。編程語言方面從程序總體設(shè)計(jì)以及高效性和功能性對 C 語言和匯編語言進(jìn)行比較分析, 針對計(jì)算器四則運(yùn)算算法特別是乘法和除法運(yùn)算的實(shí)現(xiàn),最終選 用全球編譯效率最高的KEIL 公司的μVision5 軟件,采用C語言進(jìn)行編程,并用 Proteus8 進(jìn)行仿真。
部分程序:
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^6; //數(shù)據(jù)命令選擇
sbit lcden=P2^7;//使能信號
uchar code table[]= " ";
long int data_a,data_b; //第一個(gè)數(shù)和第二個(gè)數(shù)
long int data_c; //計(jì)算結(jié)果
uchar dispaly[10]; //顯示緩沖
sbit MUSIC_REST =P2^2;//語音芯片復(fù)位腳
sbit MUSIC_DATA =P2^1;//語音芯片脈沖識(shí)別
sbit bus =P2^0;//語音芯片工作狀態(tài)識(shí)別信號
uchar bbh,xm1,xm2,xm0;
void delay_us(unsigned int us)//延時(shí)函數(shù)
{
while(us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void Music(unsigned char music_count)
{
MUSIC_REST=1;
delay_us(200);
MUSIC_REST=0;
delay_us(200);
while(music_count>0)
{
MUSIC_DATA=1;
delay_us(100);
MUSIC_DATA=0;
delay_us(100);
music_count--;
}
}
//************************************************************************/
// 描述: 延時(shí)t us函數(shù)
//************************************************************************/
void LCD_Delay_us(unsigned int t)
{
while(t--); //t=0,退出
}
//************************************************************************/
// 描述: 延時(shí)t ms函數(shù)
//************************************************************************/
void LCD_Delay_ms(unsigned int t)
{
unsigned int i,j;
for(i=0;i;i++)>
for(j=0;j<113;j++) //執(zhí)行113次循環(huán)
;
}
//************************************************************************/
// 描述: 1602液晶寫指令
//************************************************************************/
void write_com(uchar com) //1602液晶寫指令
{
rs=0; //寫指令
lcden=0; //使能1602
P0=com; //寫入指令com
LCD_Delay_ms(1); //延時(shí)1ms
lcden=1; //使能1602
LCD_Delay_ms(2); //延時(shí)2ms
lcden=0; //使能1602
}
//************************************************************************/
// 描述:1602液晶寫數(shù)據(jù)
//************************************************************************/
void write_date(uchar date) //1602液晶寫數(shù)據(jù)
{
rs=1; //寫數(shù)據(jù)
lcden=0; //使能1602
P0=date; //寫入數(shù)據(jù)date
LCD_Delay_ms(1); //延時(shí)1ms
lcden=1; //使能1602
LCD_Delay_ms(2); //延時(shí)2ms
lcden=0; //使能1602
}
//************************************************************************/
// 描述:指定x,y寫入字符函數(shù)
//************************************************************************/
void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0){write_com(0x80 + x);} //第一行
else{write_com(0xc0 + x);} //第二行
write_date( Data); //寫入數(shù)據(jù)
}
//指定x,y寫入字符串函數(shù)
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0){write_com(0x80 + x);} //第一行
else{write_com(0xC0 + x);} //第二行
while (*s) //
{write_date( *s); s++;} //寫入數(shù)據(jù)
}
//************************************************************************/
// 描述:初始化液晶,及畫面初始化
//************************************************************************/
void init_lcd(void) //初始化液晶,及畫面初始化
{
lcden=0; //使能1602
write_com(0x38); //8 位總線,雙行顯示,5X7 的點(diǎn)陣字符
LCD_Delay_us(100); //延時(shí)100us
write_com(0x0c); //開顯示,無光標(biāo),光標(biāo)不閃爍
write_com(0x06); //光標(biāo)右移動(dòng)
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); /* 延時(shí) */
temp1=P1; /* 讀列值(或行值) */
P1=0xff;
LCD_Delay_ms(20); /* 延時(shí) */
P1=0x0f; /* 輸入列值(或行值) */
LCD_Delay_ms(20); /* 延時(shí) */
temp2=P1; /* 讀行值(或列值) */
P1=0xff;
temp=(temp1&0xf0)|(temp2&0xf); /* 將兩次讀入數(shù)據(jù)組合 */
switch(temp) /* 通過讀入數(shù)據(jù)組合判斷按鍵位置 */
{
case 0x77 :a=0x0d;Music(27);while(!bus);break;// 按鍵/
case 0x7b :a=0x0e;Music(31);while(!bus); break;// 按鍵=
case 0x7d :a=0;Music(2);while(!bus);break;// 按鍵0
case 0x7e :a=0x0f; break;// 按鍵CE
case 0xb7 :a=0x0c;Music(26);while(!bus);break;// 按鍵*
case 0xbb :a=0x9;Music(11);while(!bus);break; // 按鍵9
case 0xbd :a=0x8;Music(10);while(!bus);break; // 按鍵8
case 0xbe :a=0x7;Music(9);while(!bus);break; // 按鍵7
case 0xd7 :a=0x0b;Music(25);while(!bus);break;// 按鍵-
case 0xdb :a=0x6;Music(8);while(!bus);break; // 按鍵6
case 0xdd :a=0x5;Music(7);while(!bus);break; // 按鍵5
case 0xde :a=0x4;Music(6);while(!bus);break; // 按鍵4
case 0xe7 :a=0x0a;Music(24);while(!bus);break;// 按鍵+
case 0xeb :a=3;Music(5);while(!bus);break; // 按鍵3
case 0xed :a=2;Music(4);while(!bus);break; // 按鍵2
case 0xee :a=1;Music(3);while(!bus);break; // 按鍵1
default :a=0xff;
}
return a; /* 返回按鍵值 */
}
?
-
lcd
+關(guān)注
關(guān)注
34文章
4406瀏覽量
166930 -
51單片機(jī)
+關(guān)注
關(guān)注
273文章
5697瀏覽量
122997 -
C語言
+關(guān)注
關(guān)注
180文章
7595瀏覽量
135866 -
計(jì)算器
+關(guān)注
關(guān)注
16文章
437瀏覽量
37251
發(fā)布評論請先 登錄
相關(guān)推薦
評論