|
本帖最后由 zhangmc419 于 2022-9-17 12:02 编辑
ICL7135-连接单片机,用1602显示的仿真。
/*ICL7135用LCD1602显示,用PROTEUS仿真
D0-D5连接P1.0-P14;B1、B2、B4、B8
接P2.0-P2.3;超量程全显示0*/
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 bNumber[5] = {0,0,0,0,0}; //五位数码数组
sbit rs=P3^4; //1602RS
sbit rw=P3^5; //1602RW
sbit e=P3^6; //1602EN
/*1602用P0口*/
void delay(u16 i)
{
u8 j,k;
for (;i>0;i--)
for (j=38;j>0;j--)
for (k=130;k>0;k--);
}
/*写命令到1602*/
void wrc(u8 c)
{
delay(1);
rs=0;
rw=0;
e=0;
_nop_();
_nop_();
e=1;
P0=c;
e=0;
}
/*写数据到1602*/
void wrd(u8 dat)
{
delay(1);
rs=1;
rw=0;
e=0;
_nop_();
_nop_();
e=1;
P0=dat;
e=0;
}
/*移动光标位置*/
void LCD_SetCursor(u8 Line,u8 Column)
{
if (Line==1)
{
wrc(0x80|(Column-1));
}
else if (Line==2)
{
wrc(0x80|(Column-1+0x40));
}
}
/*行,列,显示一个字符,上边行号为1,下边为2*/
void LCD_ShowChar(u8 Line,u8 Column,u8 Char)
{
LCD_SetCursor(Line,Column);
wrd(Char);
}
/*LCD1602初始化*/
void init()
{
delay(0);
wrc(0x38);
wrc(0x38);
wrc(0x38);
wrc(0x0c);
wrc(0x06);
wrc(0x01);
}
/*外部中断初始化*/
void initEx0()
{
EA = 1; //开启总中断
EX0 = 1; //开启0号外部中断 P32
IT0 = 1; //设置外部中断触发方式 //0 - 低电平触发 //1 - 负跳变触发
//STROBE触发
}
void main()
{
u8 Di=0;
init();
initEx0();
while (1)
{
LCD_ShowChar(1,1,'U');
LCD_ShowChar(1,3,'=');
LCD_ShowChar(1,12,'m');
LCD_ShowChar(1,13,'v');
LCD_ShowChar(1,5,bNumber[0]+48);
LCD_ShowChar(1,6,bNumber[1]+48);
LCD_ShowChar(1,7,bNumber[2]+48);
LCD_ShowChar(1,8,bNumber[3]+48);
LCD_ShowChar(1,9,'.');
LCD_ShowChar(1,10,bNumber[4]+48);
}
}
/*中断读取数据*/
void ADC_7135() interrupt 0
{
u8 Di = 0;
Di = P1&0x1f;
switch (Di)
{
case 0x01:
bNumber[4]=P2&0X0F;
break;
case 0x02:
bNumber[3]=P2&0X0F;
break;
case 0x04:
bNumber[2]=P2&0X0F;
break;
case 0x08:
bNumber[1]=P2&0X0F;
break;
case 0x10:
bNumber[0]=P2&0X0F;
break;
default:
break;
}
}
如果你没M币,可拷贝此程序,参考图片做PROTEUS文件。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|