c51单片机矩阵键盘1602计算器_基于单片机的计算器设计资料 矩阵键盘+LCD1602显示...

//操作简介// 按第一个数,再按'+-*/',再按'='显示出结果,然后按C清屏// 加最大9999+9999=19998// 减最大9999-0 =9999// 乘最大9999*9999=99980001// 除 1/9=0.1111 保留小数点后4位#include#define uint unsigned int#define uchar unsigned char//--------...
摘要由CSDN通过智能技术生成

//操作简介

// 按第一个数,再按'+-*/',再按'='显示出结果,然后按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;

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C51单片机矩阵键盘LCD1602显示器编写的计算器程序示例: ```c #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit RS=P2^0; //LCD1602的RS引脚接在单片机的P2.0口 sbit RW=P2^1; //LCD1602的RW引脚接在单片机的P2.1口 sbit EN=P2^2; //LCD1602的EN引脚接在单片机的P2.2口 uchar code table[]="0123456789*#"; //定义矩阵键盘输入字符对应的数组 uchar flag; //定义标志位,用于判断是否按下了键 void delay(uint x) //延时函数 { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void write_com(uchar com) //向LCD1602写入指令 { RS=0; //RS置0表示写入指令 RW=0; //RW置0表示写入模式 P0=com; //将指令写入P0口 EN=1; //使能 delay(1); //延时 EN=0; //取消使能 } void write_data(uchar dat) //向LCD1602写入数据 { RS=1; //RS置1表示写入数据 RW=0; //RW置0表示写入模式 P0=dat; //将数据写入P0口 EN=1; //使能 delay(1); //延时 EN=0; //取消使能 } void init_lcd1602() //LCD1602初始化函数 { write_com(0x38); //8位数据接口,显示2行,5*7点阵字符 write_com(0x0c); //开显示(无光标,不闪烁) write_com(0x06); //文字不动,光标自动右移 write_com(0x01); //清屏 } void keyscan() //矩阵键盘扫描函数 { uchar i; flag=0; //将标志位清零 P1=0xf0; //将P1口的低四位设置为0xf0,用于读取行的状态 if(P1!=0xf0) //如果有一行的状态不为0xf0,表示有按键按下 { delay(5); //延时去抖 if(P1!=0xf0) //再次检测按键是否按下 { for(i=0;i<4;i++) //循环读取列的状态 { P1=0x0f; //将P1口的高四位设置为0x0f,用于读取列的状态 if(P1!=(0x0f&(0x01<<i))) //如果列的状态与当前循环的列不同,表示该列的按键按下 { while(P1!=(0x0f&(0x01<<i))); //等待按键释放 write_data(table[i*4+(P1>>4)]); //将输入字符写入LCD1602 flag=1; //将标志位设置为1,表示有按键按下 break; //跳出循环 } } } } } void main() { uchar a[16]; //定义一个存储输入字符的数组 uchar b; //定义一个字符变量,用于存储每次输入的字符 uchar i,j,k=0; //定义三个计数器 uint x,y,z; //定义三个整型变量,用于存储输入的数字 init_lcd1602(); //初始化LCD1602 while(1) { keyscan(); //扫描矩阵键盘 if(flag==1) //如果有按键按下 { b=P0; //将输入字符存储到变量b中 if(b=='#') //如果输入字符为# { a[k]='\0'; //将数组a末尾加上'\0'表示字符串结束 for(i=0;i<k;i++) //循环检测输入字符串中是否含有非数字字符 { if(a[i]<'0'||a[i]>'9') //如果有非数字字符 { write_com(0xc0); //将光标移动到第二行第一个字符位置 write_data('E'); //在LCD1602显示'E'表示错误 write_data('r'); write_data('r'); write_data('o'); write_data('r'); delay(1000); //延时1秒钟 write_com(0x01); //清屏 k=0; //将计数器k置0 break; //跳出循环 } } if(i==k) //如果输入字符串中没有非数字字符 { for(j=k-1,y=1,z=0;j>=0;j--,y*=10) //将输入字符串转换为整数 z+=y*(a[j]-'0'); write_com(0xc0); //将光标移动到第二行第一个字符位置 write_data('='); //在LCD1602显示'=' for(i=0;x=z;i++) //将整数转换为字符数组 { a[i]=x%10+'0'; x/=10; } for(i--;i>=0;i--) //从后往前输出字符数组,即为计算结果 write_data(a[i]); delay(1000); //延时1秒钟 write_com(0x01); //清屏 k=0; //将计数器k置0 } } else if(b=='*') //如果输入字符为* { write_com(0xc0); //将光标移动到第二行第一个字符位置 write_data('*'); //在LCD1602显示'*' a[k++]='*'; //将输入字符存储到数组a中 } else if(b>='0'&&b<='9') //如果输入字符为数字 { write_data(b); //在LCD1602显示输入字符 a[k++]=b; //将输入字符存储到数组a中 } } } } ``` 该程序使用P1口读取矩阵键盘的状态,通过判断行和列的状态来确定用户输入的字符。输入的字符会存储到一个字符数组中,最终通过将字符数组转换为整数进行计算,并将计算结果转换为字符数组输出到LCD1602显示。 需要注意的是,在使用矩阵键盘时,需要设置P1口的高四位为输入模式,低四位为输出模式,并将低四位全部置0,以便读取行的状态。同时,需要将高四位全部置1,以便读取列的状态。在LCD1602初始化时,需要先发送8位数据接口的指令,否则无法正常显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值