- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
个人收集整理资料, 仅供交流学习, 勿作商业用途
3.1 硬件连接
图 3-1 所示为简易计算器的电路原理图。 P3 口用于键盘输入,接 4*4 矩阵键盘,键值与键盘的对应表如表 ---- 所示, p0 口和 p2
口用于显示, p2 口用于显示数值的高位, po 口用于显示数值的低位。
图 3-1 简易计算器电路原理图
1 / 32
个人收集整理资料, 仅供交流学习, 勿作商业用途
键值与功能对应表
键值
0
1
2
3
4
5
6
7
8
9
+
-
× / =
ON/C
功能
0
1
2
3
4
5
6
7
8
9
+
-
× ÷ =
清零
3-1
3.2 计算器的软件设计
#include<reg51.h> // 头文件
#define uint unsigned int //
#define uchar unsigned char
sbit lcden=P2^3 。 // 定义引脚
sbit rs=P2^4 。
sbit rw=P2^0 。
sbit busy=P0^7 。
char i,j,temp,num,num_1 。
long a,b,c 。 //a, 第一个数 b, 第二个数 c, 得数
float a_c,b_c 。
2 / 32
个人收集整理资料, 仅供交流学习, 勿作商业用途
uchar flag,fuhao 。//flag 表示是否有符号键按下, fuhao 表征按
下的是哪个符号
uchar code table[]={
7,8,9,0,
4,5,6,0,
1,2,3,0,
0,0,0,0} 。
uchar code table1[]={
7,8,9,0x2f-0x30,
4,5,6,0x2a-0x30,
1,2,3,0x2d-0x30,
0x01-0x30,0,0x3d-0x30,0x2b-0x30} 。
void delay(uchar z> // 延迟函数
{
3 / 32
个人收集整理资料, 仅供交流学习, 勿作商业用途
uchar y 。
for(z 。z>0。z-->
for(y=0 。y<110。y++>。
}
void check(> // 判断忙或空闲
{
do{
P0=0xFF。
rs=0 。 // 指令
rw=1 。 // 读
lcden=0 。 // 禁止读写
delay(1> 。 // 等待,液晶显示器处理数据
lcden=1 。 // 允许读写
}while(busy==1> 。 // 判断是否为空闲, 1 为忙, 0 为空闲
}
4 / 32
个人收集整理资料, 仅供交流学习, 勿作商业用途
void write_com(uchar com> // 写指令函数
{
P0=com。 //com 指令付给 P0 口
rs=0 。
rw=0。
lcden=0 。
check(> 。
lcden=1 。
}
void write_date(uchar date> // 写数据函数
{
P0=date 。
rs=1 。
rw=0。
lcden=0 。
5 / 32
个人收集整理资料, 仅供交流学习, 勿作商业用途
check(> 。
lcden=1 。
}
void init(> // 初始化
{
num=-1。
lcden=1 。 // 使能信号为高电平
write_com(0x38> 。 //8 位, 2 行
write_com(0x0c> 。 // 显示开,光标关,不闪烁 */
write_com(0x06> 。 // 增量方式不移位 显竟獗暌贫 柚?
write_com(0x80> 。 // 检测忙信号
write_com(0x01> 。 // 显示开,光标关,不闪烁
num_1=0。
i=0 。
j=0 。
6 / 32
个人收集整理资料, 仅供交流学习, 勿作商业用途
a=0。 // 第一个参与运算的数
b=0。 // 第二个参与运算的数
c=0。
flag=0 。 //flag 表示是否有符号键按下,
fuhao=0 。 // fuhao 表征按下的是哪个符号
}
void keyscan(> // 键盘扫描程序
{
P3=0xfe。
if(P3!=0xfe>
{
delay(20> 。 延迟 20ms
if(P3!=0xfe>
{
temp=P3&0xf0。
switch(temp>
{
case 0xe0:num=0 。
7 / 32
个人收集整理资料, 仅供交流学习, 勿作商业用途
break 。
case 0xd0:num=1 。
break 。
case 0xb0:num=2 。
break 。
case 0x70:num=3 。
break 。
}
}
while(P3!=0xfe> 。
if(num==0||num=
文档评论(0)