谁有单片机控制1602的显示程序??要proteus能仿真成功的

谁有单片机控制1602的显示程序??要proteus能仿真成功的,第1张

你好回答如下:

程序C和H文件:

#ifndef LCD_CHAR_1602_2005_4_9

#define LCD_CHAR_1602_2005_4_9

#include <intrinsh>

//Port Definitions

sbit LcdRs  = P2^0;

sbit LcdRw  = P2^1;

sbit LcdEn   = P2^2;

sfr  DBPort  = 0x80;  //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0数据端口

//内部等待函数

unsigned char LCD_Wait(void)

{

LcdRs=0;

LcdRw=1; _nop_();

LcdEn=1; _nop_();

//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,

//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80

//实际硬件时打开此语句

LcdEn=0;

return DBPort;

}

//向LCD写入命令或数据

#define LCD_COMMAND   0      // Command

#define LCD_DATA   1      // Data

#define LCD_CLEAR_SCREEN 0x01      // 清屏

#define LCD_HOMING    0x02      // 光标返回原点

void LCD_Write(bit style, unsigned char input)

{

LcdEn=0;

LcdRs=style;

LcdRw=0;  _nop_();

DBPort=input; _nop_();//注意顺序

LcdEn=1;  _nop_();//注意顺序

LcdEn=0;  _nop_();

LCD_Wait();

}

//设置显示模式

#define LCD_SHOW   0x04    //显示开

#define LCD_HIDE   0x00    //显示关

#define LCD_CURSOR   0x02  //显示光标

#define LCD_NO_CURSOR  0x00    //无光标

#define LCD_FLASH   0x01    //光标闪动

#define LCD_NO_FLASH  0x00    //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)

{

LCD_Write(LCD_COMMAND, 0x08|DisplayMode);

}

//设置输入模式

#define LCD_AC_UP   0x02

#define LCD_AC_DOWN   0x00      // default

#define LCD_MOVE   0x01      // 画面可平移

#define LCD_NO_MOVE   0x00      //default

void LCD_SetInput(unsigned char InputMode)

{

LCD_Write(LCD_COMMAND, 0x04|InputMode);

}

//移动光标或屏幕

/

#define LCD_CURSOR  0x02

#define LCD_SCREEN  0x08

#define LCD_LEFT  0x00

#define LCD_RIGHT  0x04

void LCD_Move(unsigned char object, unsigned char direction)

{

if(object==LCD_CURSOR)

LCD_Write(LCD_COMMAND,0x10|direction);

if(object==LCD_SCREEN)

LCD_Write(LCD_COMMAND,0x18|direction);

}

/

//初始化LCD

void LCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,57点阵

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动

}

//

void GotoXY(unsigned char x, unsigned char y)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

void Print(unsigned char str)

{

while(str!='\0')

{

LCD_Write(LCD_DATA,str);

str++;

}

}

/

void LCD_LoadChar(unsigned char user[8], unsigned char place)

{

unsigned char i;

LCD_Write(LCD_COMMAND,0x40|(place8));

for(i=0; i<8; i++)

LCD_Write(LCD_DATA,user[i]);

}

/

//

#endif

#include <REGX52H>

#include "LCD1602h"

unsigned char TempBuffer[10];

void IntToStr(unsigned int t, unsigned char str, unsigned char n)

{

unsigned char a[5]; char i, j;

a[0]=(t/10000)%10;         //取得整数值到数组

a[1]=(t/1000)%10;

a[2]=(t/100)%10;

a[3]=(t/10)%10;

a[4]=(t/1)%10;

for(i=0; i<5; i++)         //转成ASCII码

a[i]=a[i]+'0';

for(i=0; a[i]=='0' && i<=3; i++);

for(j=5-n; j<i; j++)       //填充空格

{ str=' ';  str++; }

for(; i<5; i++)

{ str=a[i]; str++; }  //加入有效的数字

str='\0';

}

void Delay1ms(unsigned int count)

{

unsigned int i,j;

for(i=0;i<count;i++)

for(j=0;j<120;j++);

}

main()

{

unsigned int Count = 0;

LCD_Initial();

GotoXY(0,0);

Print("The 1602LCD Test");

GotoXY(0,1);

Print("zhaoyao");

while(1)

{

IntToStr(Count++,&TempBuffer[0],5);

GotoXY(3,1);

Print(&TempBuffer[0]);

Delay1ms(100);

}

}

AT只是一个公司名,只要后面的型号相同就能用,告诉你怎么找(ISIS):
我的是75 SP3,打开ISIS,点元件模式,点P(从库中选取),在关键字栏内输入24C02,右边会出现五种02,都和你的AT24C02通用,随便选一个就行。
同样是在关键字栏内输入LM016L,这个就是LCD1602
89C52和89S52的区别很小,看你怎么用了:
1、前者不支持在系统编程,后者支持
2、89C52具有一个数据指针DPTR,而89S52具有两个数据指针DPTR0和DPTR1
3、89S52含有一个看门狗定时器,具有断电标志POF;而前者无。
如果你的程序只用到一个数据指针并且没有用到看门狗定时器的话,这两个型号就通用。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12903412.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-28
下一篇 2023-05-28

发表评论

登录后才能评论

评论列表(0条)

保存