单片机 > 单片机程序设计 > 详情

51单片机基础计算器

发布时间:2023-09-01 发布时间:
|



电路原理图如下:

单片机源程序如下:

/*

接盘按键说明:

--------------------------------------------------

| 1 | 2 | 3 | + |

- - - - - - - - - - - - -

| 4 | 5 | 6 | - |

- - - - - - - - - - - - -

| 7 | 8 | 9 | * |

- - - - - - - - - - - - -

| C | 0 | = | / |

--------------------------------------------------*/

//操作简介

// 按第一个数,再按'+-*/',再按'='显示出结果,然后按C清屏

// 加最大9999+9999=19998

// 减最大9999-0 =9999

// 乘最大9999*9999=99980001

// 除 1/9=0.1111 保留小数点后4位

#include

#define uint unsigned int

#define uchar unsigned char

//--------LCD1602-------------------

//P00-07==== D0-7

sbit rs=P2^5; //指令or数据

sbit wela=P2^6; //读or写

sbit lcden=P2^7; //使能信号

//--------LCD1602-------------------

//--------KEY-----------------------

//P1口

//--------KEY-----------------------

uchar code table[]= " ";


long int data_a,data_b; //第一个数和第二个数

long int data_c; //计算结果


uchar dispaly[10]; //显示缓冲


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

// 描述: 延时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

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) //初始化液晶,及画面初始化

{

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=0x0d;break;// 按键/

case 0x7b :a=0x0e; break;// 按键=

[1] [2] [3]
51单片机基础计算器1602液晶


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STC89C52RC单片机的NRF24L01无线通信程序.收发一体