单片机实验报告(6)

2018-12-17 10:53

2、实验步骤

① 根据上述实验内容,参考 1.2.2,在 Proteus 环境下建立图 3.28 所示原理图,并将其保存为 lcd1602.DSN 文件。

② 将上面(3)中控制源程序保存为 lcd1602.c。

③ 运行 Keil uVision2 开发环境,按照 1.1.3 节介绍的方法建立工程 lcd1602.uV2, CPU 为 AT89C51,包含启动文件 STARTUP.A51。

④ 按照 1.2.2 第(6)节介绍的方法将 C 语言源程序 lcd1602.c 加入工程 lcd1602.uV2, 并设置工程 lcd1602.uV2 属性,将其晶振频率设置为 11.0592MHz,选择输出可执行文件,仿真方式为选择硬仿真,并选择其中的“PROTEUS VSM MONITOR 51 DRIVER” 仿真器。

⑤ 构造(Build)工程 lcd1602.uV2。如果输入有误进行修改,直至构造正确,生成可执行程序 lcd1602.hex 为止。

⑥ 为 AT89C51 设置可执行程序 lcd1602.hex。

⑦ 运行程序,点击图 2.28 中各按键,观察 1602 的显示是否符合程序要求。

3、编程思路

按键的扫描与识别可以参考“3.4.1 示例实验”中的方法。LCD1602 的显示控制可以参 考“3.7.2 LCD1602 示例实验”。编成时要有一个状态变量,该变量用于记录当前是输入的哪个变量。输入第一个变量,遇到输入运算符时结束第一个变量的输入。输入第二个变量,遇到“=”号时结束第二个变量的输入,并且开始计算结果。计算结果由于是 16 进制的,要将其转换成十进制,并将该十进制的数转换成字符串后逐位显示出来。减法时要注意结果是否为负,除法时要注意除数是否为 0,结果是否带有余数。 另外,按键要注意去抖动处理。

4、源程序

#include

#define uint unsigned int #define uchar unsigned char sbit lcden=P1^5; sbit rs=P1^7; sbit rw=P1^6; sbit busy=P2^7;

char i,j,temp,num,num_1; long a,b,c; float a_c,b_c; uchar flag,fuhao;

uchar code table[]={ 0,1,2,3, 4,5,6,7, 8,9,0,0, 0,0,0,0};

uchar code table1[]={ 0,1,2,3, 4,5,6,7,

8,9,0x2b-0x30,0x2d-0x30,

0x2a-0x30,0x2f-0x30,0x01-0x30,0x3d-0x30} ;

void delay(uchar z) {

uchar y; for(z;z>0;z--)

for(y=0;y<110;y++); }

void check() { do{

P2=0xFF; rs=0; rw=1; lcden=0; delay(1); lcden=1; }while(busy==1); }

void write_com(uchar com) {

P2=com; rs=0; rw=0; lcden=0; check(); lcden=1; }

void write_date(uchar date) {

P2=date; rs=1; rw=0; lcden=0; check(); lcden=1; }

void init() {

num=-1; lcden=1;

write_com(0x01); //清零

write_com(0x38); //设置16X2显示等

write_com(0x0c); //设置开显示,不显示光标

write_com(0x06);//写入新数据后,地址寄存器内容加1 //自动往下写 write_com(0x80); //第一行第一列开始 显示 write_com(0x01); num_1=0; i=0; j=0;

a=0; b=0; c=0; flag=0; fuhao=0; }

void keyscan() {

P3=0xfe; if(P3!=0xfe) {

delay(20); if(P3!=0xfe) {

temp=P3&0xf0; switch(temp) {

case 0xe0:num=0; break;

case 0xd0:num=1; break;

case 0xb0:num=2; break;

case 0x70:num=3; break; } }

while(P3!=0xfe);

if(num==0||num==1||num==2||num==3) {

if(j!=0)//j标志位:第二次计算时,把前面的清除 {

write_com(0x01);

j=0; }

if(flag==0) {

a=a*10+table[num]; } else {

b=b*10+table[num]; } }

i=table1[num]; write_date(0x30+i); }

P3=0xfd; if(P3!=0xfd) {

delay(5); if(P3!=0xfd) {

temp=P3&0xf0; switch(temp) {

case 0xe0:num=4; break;

case 0xd0:num=5; break;

case 0xb0:num=6; break;

case 0x70:num=7; break; } }

while(P3!=0xfd);

if(num==4||num==5||num==6||num==7) {

if(j!=0) {

write_com(0x01); j=0; }

if(flag==0) {

a=a*10+table[num]; } else {

b=b*10+table[num]; } }

i=table1[num]; write_date(0x30+i); }

P3=0xfb; if(P3!=0xfb) {

delay(5); if(P3!=0xfb) {

temp=P3&0xf0; switch(temp) {

case 0xe0:num=8; break;

case 0xd0:num=9; break;

case 0xb0:num=10; break;

case 0x70:num=11; break; } }

while(P3!=0xfb);

if(num==8||num==9) {

if(j!=0) {

write_com(0x01); j=0; }

if(flag==0) {

a=a*10+table[num]; } else


单片机实验报告(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:安全标准化 现场勘察及整改方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: