|
按照你的要求,我寫了一個程序:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit k1=P3^1;
sbit k2=P3^0;
unsigned char sz[12]="computation:",BUF[12]="0123456789+-";
void Lcd1602_Delay1ms(uint c)
{
uchar a,b;
for (; c>0; c--)
{
for (b=50;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void Delay15ms()
{
unsigned char i, j;
i = 30;
j = 43;
do
{
while (--j);
} while (--i);
}
void LcdWriteCom(uchar com)
{
LCD1602_E = 0;
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DATAPINS = com;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
void LcdWriteData(uchar dat)
{
LCD1602_E = 0;
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
void LcdInit()
{
LcdWriteCom(0x38);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x01);
LcdWriteCom(0x02);
LcdWriteCom(0x80);
}
void LCDreturn()
{
Delay15ms();
LcdWriteCom(0x38);
Delay15ms();
LcdWriteCom(0x38);
Delay15ms();
LcdWriteCom(0x38);
LcdWriteCom(0x08);
LcdWriteCom(0x01);
LcdWriteCom(0x02);
LcdWriteCom(0x38);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x80);
}
void main(void)
{
unsigned char i;
char j=0,k;
LCDreturn();
LcdInit();
for (i=0;i<12;i++)
{
LcdWriteData(sz[i]);
}
while(1)
{
if (k1==0)
{
Delay15ms();
if (k1==0)
{
j++;
if (j>125)
{
j=-125;
}
}
for (i=0;((i<20)&&(k1==0));i++)
{
Delay15ms();
}
}
if (k2==0)
{
Delay15ms();
if (k2==0)
{
j--;
if (j<-125)
{
j=125;
}
}
for (i=0;((i<20)&&(k2==0));i++)
{
Delay15ms();
}
}
LcdWriteCom(0x8c);
if (j<0)
{
LcdWriteData(BUF[11]);
k=-j;
}
else
{
LcdWriteData(BUF[10]);
k=j;
}
LcdWriteData(BUF[k/100]);//多位結果只能一次一次地找位
LcdWriteData(BUF[(k%100)/10]);
LcdWriteData(BUF[(k%10)/1]);
}
}
單片機:STC89C52RC,其它電路如圖所示。
|
-
1.jpg
(33.94 KB, 下載次數: 91)
下載附件
2017-7-16 10:32 上傳
-
2.jpg
(19.3 KB, 下載次數: 100)
下載附件
2017-7-16 10:32 上傳
|