該計算器系統51 系列的單片機進行的數字計算器系統設計,可以完成計算器的鍵盤輸入, 進行加、 減、乘、除的簡單四則運算,并在 LCD屏幕上相應的顯示結果。選擇內部存儲資源豐富的 51 單片 機,輸入采用 4×4矩陣鍵盤,顯示采用LCD1602屏幕模塊進行顯示。軟件方面從分析計算器功能、 流程圖設計,再到程序的編寫進行系統設計。編程語言方面從程序總體設計以及高效性和功能性對 C 語言和匯編語言進行比較分析, 針對計算器四則運算算法特別是乘法和除法運算的實現,最終選 用全球編譯效率最高的KEIL 公司的μVision5 軟件,采用C語言進行編程,并用 Proteus8 進行仿真。
部分程序:
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^6; //數據命令選擇
sbit lcden=P2^7;//使能信號
uchar code table[]= " ";
long int data_a,data_b; //第一個數和第二個數
long int data_c; //計算結果
uchar dispaly[10]; //顯示緩沖
sbit MUSIC_REST =P2^2;//語音芯片復位腳
sbit MUSIC_DATA =P2^1;//語音芯片脈沖識別
sbit bus =P2^0;//語音芯片工作狀態識別信號
uchar bbh,xm1,xm2,xm0;
void delay_us(unsigned int us)//延時函數
{
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--;
}
}
//************************************************************************/
// 描述: 延時t us函數
//************************************************************************/
void LCD_Delay_us(unsigned int t)
{
while(t--); //t=0,退出
}
//************************************************************************/
// 描述: 延時t ms函數
//************************************************************************/
void LCD_Delay_ms(unsigned int t)
{
unsigned int i,j;
for(i=0;i;i++)>
for(j=0;j<113;j++) //執行113次循環
;
}
//************************************************************************/
// 描述: 1602液晶寫指令
//************************************************************************/
void write_com(uchar com) //1602液晶寫指令
{
rs=0; //寫指令
lcden=0; //使能1602
P0=com; //寫入指令com
LCD_Delay_ms(1); //延時1ms
lcden=1; //使能1602
LCD_Delay_ms(2); //延時2ms
lcden=0; //使能1602
}
//************************************************************************/
// 描述:1602液晶寫數據
//************************************************************************/
void write_date(uchar date) //1602液晶寫數據
{
rs=1; //寫數據
lcden=0; //使能1602
P0=date; //寫入數據date
LCD_Delay_ms(1); //延時1ms
lcden=1; //使能1602
LCD_Delay_ms(2); //延時2ms
lcden=0; //使能1602
}
//************************************************************************/
// 描述:指定x,y寫入字符函數
//************************************************************************/
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); //寫入數據
}
//指定x,y寫入字符串函數
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++;} //寫入數據
}
//************************************************************************/
// 描述:初始化液晶,及畫面初始化
//************************************************************************/
void init_lcd(void) //初始化液晶,及畫面初始化
{
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=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
+關注
關注
34文章
4424瀏覽量
167412 -
51單片機
+關注
關注
274文章
5702瀏覽量
123498 -
C語言
+關注
關注
180文章
7604瀏覽量
136703 -
計算器
+關注
關注
16文章
437瀏覽量
37330
發布評論請先 登錄
相關推薦
評論