山东大学单片机实验 实验6.docx
- 文档编号:30089397
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:19
- 大小:82.97KB
山东大学单片机实验 实验6.docx
《山东大学单片机实验 实验6.docx》由会员分享,可在线阅读,更多相关《山东大学单片机实验 实验6.docx(19页珍藏版)》请在冰豆网上搜索。
山东大学单片机实验实验6
信息科学与工程学院
2016-2017学年第二学期
实验报告
课程名称:
单片机原理与应用
实验名称:
3.7LCD1602显示实验
实验报告
【实验题目】
本实验利用LCD1602和16个按键实现简单的十进制数的加减乘除四则混合运算。
其中按键KEY0~KEY9分别代表数字0~9,;按键KEY10~KEY13分别代表运算符“+”“-”“*”“/”;按键KEY15代表“=”;按键KEY14代表清除命令,以便进行下一次的输入和计算。
不管什么时候按下“清除”按键,计算过程均将停止,两个输入变量都将清0,屏幕将清屏。
【实验要求】
1.编写源程序并进行必要的注释;
2.记录实验过程;
3.记录程序运行结果;
【实验过程及结果记录】
自我完成实验
A.电路图
B.运行结果
【实验源程序】
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeKEY_TABLE[]={0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88};
sbitLCD_RS=P1^7;
sbitLCD_RW=P1^6;
sbitLCD_EN=P1^5;
longintnum1=0;
longintnum2=0;
ucharflag=0;
ucharKEYY=0;
uchartemp,key,num,n1,n2;
longintresults,shang,yu;
voiddelay_ms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
{
for(j=110;j>0;j--);
}
}
bitlcd_busy();LCD忙检查子程序
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P2&0x80);
LCD_EN=0;
returnresult;
}
voidlcd_wcmd(ucharcmd);写命令子程序
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P2=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=0;
}
voidlcd_clr();LCD清屏子程序
{
lcd_wcmd(0x01);
delay_ms
(2);
}
voidlcd_wdat(uchardat);写数据子程序
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P2=dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=0;
}
voidlcd_init()//初始化子程序
{
delay_ms(15);
lcd_wcmd(0x38);//8位数据总线,显示2行,5*7点阵
delay_ms(5);
lcd_wcmd(0x0c);//显示开,关光标,不闪烁
delay_ms(5);
lcd_wcmd(0x06);//进入模式设置指令中,地址自动增加
delay_ms(5);
lcd_wcmd(0x01);//清除LCD显示内容
delay_ms(5);
}
voidlcd_wrst(longintrst)
{
ucharscw;
ucharzdw=0;
scw=rst/1000000000;
rst=rst%1000000000;
if(scw!
=0)
{
zdw=1;最大位输出标志位
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
scw=rst/100000000;
rst=rst%100000000;
if(zdw==1)
{
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
else
{
if(scw!
=0)
{
zdw=1;
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
}
scw=rst/10000000;
rst=rst%10000000;
if(zdw==1)
{
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
else
{
if(scw!
=0)
{
zdw=1;
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
}
scw=rst/1000000;
rst=rst%1000000;
if(zdw==1)
{
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
else
{
if(scw!
=0)
{
zdw=1;
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
}
scw=rst/100000;
rst=rst%100000;
if(zdw==1)
{
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
else
{
if(scw!
=0)
{
zdw=1;
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
}
scw=rst/10000;
rst=rst%10000;
if(zdw==1)
{
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
else
{
if(scw!
=0)
{
zdw=1;
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
}
scw=rst/1000;
rst=rst%1000;
if(zdw==1)
{
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
else
{
if(scw!
=0)
{
zdw=1;
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
}
scw=rst/100;
rst=rst%100;
if(zdw==1)
{
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
else
{
if(scw!
=0)
{
zdw=1;
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
}
scw=rst/10;
rst=rst%10;
if(zdw==1)
{
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
else
{
if(scw!
=0)
{
zdw=1;
scw=scw+'0';
lcd_wdat(scw);
delay_ms(10);
}
}
rst=rst+'0';
lcd_wdat(rst);
}
voidKEY_SCAN()
{
uchari;
P3=0xf0;
if(P3!
=0xf0)
{
delay_ms(10);
P3=0xf0;
if(P3!
=0xf0)
{
KEYY=1;
temp=P3;
P3=0x0f;
key=temp|P3;
key=0xff-key;
for(i=0;i<16;i++)
{
if(key==KEY_TABLE[i])
{
num=i;
break;
}
}
while(P3!
=0xf0)
P3=0xf0;
}
}
}
voidmain()
{
lcd_init();
lcd_clr();
delay_ms(5);
lcd_wcmd(0x80);
while
(1)
{
KEY_SCAN();
if(KEYY==1)
{
KEYY=0;
if(num<10)
{
if(flag==0)
{
num1=num1*10;
num1=num1+num;
n1=num+'0';
lcd_wdat(n1);
delay_ms(100);
}
else
{
num2=num2*10;
num2=num2+num;
n2=num+'0';
lcd_wdat(n2);
delay_ms(100);
}
}
if(num==10)
{
flag=1;
lcd_wdat('+');
}
if(num==11)
{
flag=2;
lcd_wdat('-');
}
if(num==12)
{
flag=3;
lcd_wdat('*');
}
if(num==13)
{
flag=4;
lcd_wdat('/');
}
if(num==14)
{
num1=0;
num2=0;
flag=0;
lcd_clr();
delay_ms(5);
}
if(num==15)
{
switch(flag)
{
case0:
num1=num1+'0';
lcd_wcmd(0x40|0x80);
lcd_wdat(num1);
while(num!
=14)
{
KEY_SCAN();
}
break;
case1:
results=num1+num2;
lcd_wcmd(0x40|0x80);
lcd_wrst(results);
while(num!
=14)
{
KEY_SCAN();
}
break;
case2:
if(num1>=num2)
{
results=num1-num2;
lcd_wcmd(0x40|0x80);
lcd_wrst(results);
while(num!
=14)
{
KEY_SCAN();
}
}
else
{
results=num2-num1;
lcd_wcmd(0x40|0x80);
lcd_wdat('-');
lcd_wrst(results);
while(num!
=14)
{
KEY_SCAN();
}
}
break;
case3:
results=num1*num2;
lcd_wcmd(0x40|0x80);
lcd_wrst(results);
while(num!
=14)
{
KEY_SCAN();
}
break;
case4:
if(num2==0)
{
lcd_wcmd(0x40|0x80);
lcd_wdat('E');
delay_ms(5);
lcd_wdat('R');
delay_ms(5);
lcd_wdat('R');
delay_ms(5);
lcd_wdat('O');
delay_ms(5);
lcd_wdat('R');
break;
}
shang=num1/num2;
yu=num1%num2;
lcd_wcmd(0x40|0x80);
lcd_wrst(shang);
delay_ms(100);
if(yu!
=0)
{
lcd_wdat('.');
delay_ms(100);
lcd_wdat('.');
delay_ms(100);
lcd_wdat('.');
delay_ms(100);
lcd_wrst(yu);
}
while(num!
=14)
{
KEY_SCAN();
}
break;
}
}
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东大学单片机实验 实验6 山东大学 单片机 实验