LCD16023.3v供电和5V供电,与MSP430F149单片机连接有什么不同?电源怎么处理?,请问如何利用51单片机在LCD1602液晶屏上实现一个简单的计算器功能?,proteus仿真是1602液晶不显示字符 求高人指点,51单片机1602液晶显示代码在keil中没有错误,但在proteus中
LCD16023.3v供电和5V供电,与MSP430F149单片机连接有什么不同?电源怎么处理?
MSP430是3.3V供电单片机,自然他的所有的I/O口的逻辑高电平就是3.3V的。你的LCD1602如果与3.3V的单片机连接,首先你的液晶屏要支持3.3V的逻辑电平。如果你的1602是5V供电的,那么他的数据端口一般也采用5V作为逻辑高电平,如果5V供电的LCD1602与3.3V的单片机连接,从理论上来说,5V的LCD1602应该无法识别3.3V的逻辑高电平,造成的后果就是1602无法接收到单片机发送的数据。不过在实际使用的时候,5V的LCD1602可能也偶尔因为某种原因识别到3.3V电平,在液晶屏上显示乱码甚至正确显示,但是一定很不稳定。
市场上有卖3.3V逻辑电平的1602,可以与MSP430这样的3.3V单片机连接,如果你只有5V供电的1602,还要与MSP430连接,直接连接肯定是不行的。这个时候你可以在这二者之间加电平转换芯片(比如74LVC4245),就可以实现3.3-5V的电平转换!
这个解释清楚吗?
请问如何利用51单片机在LCD1602液晶屏上实现一个简单的计算器功能?
#include
#include
#include "lcd_drive.h"
#define uchar unsigned char
#define uint unsigned int
void main()
{
uint key();
void deplay(uchar j_p);
void deplay_s(long a);
uchar i=1;
uchar jp=-1;
uchar flat;
uint a,b;
delay_ms(10);
lcd_init();
lcd_clr();
lcd_wcmd(0x80);
while(1)
{
while(jp==-1)
jp=key();
deplay(jp);
switch (jp)
{
case '=': switch(flat)
{
case '+': a+=b; deplay_s(a); break;
case '-': a=b-a; deplay_s(a); break;
case '*': a*=b; deplay_s(a); break;
case '/': a=b/a; deplay_s(a); break;
default:break;
}
break;
case '+':flat='+';b=a;i=0;break;
case '-':flat='-';b=a;i=0;break;
case '*':flat='*';b=a;i=0;break;
case '/':flat='/';b=a;i=0;break;
case 'c':a=0;b=0;lcd_clr();break;
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:a=a*10*i+jp;i=1;break;
}
jp=-1;
}
}
//-------矩阵键盘扫描-------
uint key()
{
uchar h = 0,l = 0;//矩阵行h,列l
uchar j_p;
P3 = 0x0f;
if(P3 != 0x0f)
{
delay_ms( 2 );
if(P3!=0x0f)
{
l = P3 & 0x0f ;
P3 = 0xf0;
h = P3 & 0xf0;
}
}
switch(l | h)
{
case 0x7e:j_p=0;break; //按键0
case 0x7d:j_p=1;break; //按键1
case 0x7b:j_p=2;break; //按键2
case 0x77:j_p=3;break; //按键3
case 0xbe:j_p=4;break; //按键4
case 0xbd:j_p=5;break; //按键5
case 0xbb:j_p=6;break; //按键6
case 0xb7:j_p=7;break; //按键7
case 0xde:j_p=8;break; //按键8
case 0xdd:j_p=9;break; //按键9
case 0xdb:j_p='+';break; //按键a
case 0xd7:j_p='-';break; //按键b
case 0xee:j_p='=';break; //按键Enter
case 0xed:j_p='*';break; //按键c
case 0xeb:j_p='/';break; //按键e
case 0xe7:j_p='c';break; //按键取消
default:return -1;break;
}
P3=0x0f;
while(P3!=0x0f);
return j_p;
}
void deplay(uchar j_p)
{
if(j_p != -1)
{
if(j_p >= 0 && j_p <= 9)
j_p+=48;
lcd_wdat(j_p);
}
}
void deplay_s(long a)
{
int n[10];
uint i=0;
while(a)
{
n[i]=a%10;
a/=10;
i++;
}
while(i)
deplay(n[--i]);
}
proteus仿真是1602液晶不显示字符 求高人指点
绝b是程序的问题吧,程序发过来我看看,后者你先认真参考一下时序,单片机难就难在这个时序上面。电路图没错啊,我照你的画了,刚好我这里有以前做实验的程序,试了一下没问题,不过我的程序里面有关于中断的东东,电路有点不一样,但我是试了你的电路的,说明电路没问题。程序如下,你拷贝过去试试,看看行不行。#include #define uchar unsigned char #define uint unsigned int sbit lcdrs=P3^4; sbit lcden=P3^5; uchar code table[]=" ELECFANS "; uchar code table1[]="MADE BY PENG LEI"; uchar num; void delay(uchar); void Init(); void write_com(uchar); void write_data(uchar); void main() { Init(); delay(100); EA=1; EX0=1; EX1=1; while(1); } void Init() { lcden=0; write_com(0x38); write_com(0x0f); write_com(0x06); write_com(0x01); write_com(0x80+0x1); } void write_com(uchar com) { lcdrs=0; P2=com; delay(5); lcden=1; delay(5); lcden=0; } void delay(uchar z) { uchar i,j; for(i=z;i>0;i--) { for(j=100;j>0;j--); } } void write_data(uchar Data) { lcdrs=1; P2=Data; delay(5); lcden=1; delay(5); lcden=0; } void int0() interrupt 0 { for(num=0;num<16;num++) { write_data(table[num]); delay(500); } write_com(2); write_com(0x80+0x40); for(num=0;num<16;num++) { write_data(table1[num]); delay(500); } } void int1() interrupt 2 { write_com(1); }
51单片机1602液晶显示代码在keil中没有错误,但在proteus中运行无结果?
这是你要的效果吧,程序帮你修改了,你对比看一下,满意请采纳 #include #define uchar unsigned char #define uint unsigned int sbit rs=P2^0; //根据你实际修改 sbit rw=P2^1; //根据你实际修改 sbit e=P2^2; //根据你实际修改 uchar table1[]="qqqqqqqqq"; uchar table2[]="qqqqqqqqq"; void delay_50us(uint t)//延迟函数; { uchar j;for(;t>0;t--)for(j=6245;j>0;j--);} void write_com(uchar com){e=0;rs=0;rw=0;P0=com; //根据你实际修改delay_50us(10);e=1;delay_50us(20);e=0;}void write_data(uchar dat){e=0;rs=1;rw=0; //根据你实际修改P0=dat;delay_50us(10);e=1;delay_50us(20);e=0;}void init(void){delay_50us(300);write_com(0x38);delay_50us(100);write_com(0x38);delay_50us(100);write_com(0x38);write_com(0x38);write_com(0x08);write_com(0x01);write_com(0x06);write_com(0x0c);}void main(){uchar j;init();write_com(0x80);for(j=0;j<9;j++){write_data(table1[j]);delay_50us(10);}write_com(0x80+0x40); //根据你实际字符写屏for(j=0;j<9;j++){write_data(table2[j]); //根据你实际字符写屏delay_50us(10);} while(1) //你原来没有的 { }}
下一篇:没有了