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