求一个STC89C52单片机程序 : 用键盘控制 液晶显示器(型号为1602) 输出。

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-07
51单片机程序问题 单片机型号:STC89C52RC 我需要一个1602液晶的显示函数,要求向函

#define LCD1602_FLAG
#define LCD1602_PORT P0
#include
#include
#define INT8U unsigned char
sbit lcd1602_rs=P2^0;
sbit lcd1602_e=P3^6;
sbit lcd1602_rw=P2^1;
sbit lcd1602_busy=P0^7;
INT8U str[]=" My Name Is: xxxxxxxxxxxxxxxx";
/*
************************************
* 函数名称:lcd1602_CheckBusy()
* 函数功能:状态查询
************************************
*/
void lcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}
/*
***************************************
* 函数名称: lcd1602_WriteCmd()
* 函数功能:写命令
* 入口参数:命令字
* 出口参数:无
***************************************
*/
void lcd1602_WriteCmd(const INT8U cmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*******************************************
* 函数名称:lcd1602_WriteData()
* 函数功能:写数据
* 入口参数:c--待写数据
* 出口参数:无
*********************************************
*/
void lcd1602_WriteData(const INT8U c)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
***********************************************
* 函数名称:lcd1602_Init()
* 函数功能:初始化LCD
* 入口参数:无
* 出口参数:无
***********************************************
*/
void lcd1602_Init()
{
lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵
lcd1602_WriteCmd(0x0f); //display enable,flag enable,flash enable,
lcd1602_WriteCmd(0x06); //flag move to right,screen don't move
lcd1602_WriteCmd(0x01); //clear screen
}
/*
************************************************
* 函数名称:lcd1602_Display()
* 函数功能: 字符显示
* 入口参数:ptr--字符或字符串指针
* 出口参数:无
* 说 明:用户可通过以下方式来调用:
* 1)lcd1602_Display("Hello,world!");
* 2) INT8U 存储类型 txt[]="要显示的字符串";
* 或者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'};
* INT8U *ptr;
* ptr=&txt;
* lcd1602_Display(ptr);
* 或 lcd1602_Display(txt);
* 或 lcd1602_Display(&txt);
************************************************
*/
void lcd1602_Display(const INT8U *ptr)
{
INT8U data i=0;
INT8U *data q;
q=ptr;
lcd1602_WriteCmd(0x80);
while(q!=NULL && (*q!='\0') && i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
lcd1602_WriteCmd(0xc0);
while(q!=NULL && (*q!='\0') && i>=16 && i<32)
{
lcd1602_WriteData(*q);
q++;
i++;
}
}
main()
{
lcd1602_Init();
lcd1602_Display(str);
while(1);
}

最小系统 包括 电源电路,,复位电路 ,,晶振电路 就可以了 ,
电源电路就是加上电源就可以了
复位电路、晶振电路你可以 网上搜索下,
矩阵键盘 网上也有很多的, 直接搜索矩阵键盘原理图 就有的,,
1602液晶的话,电源供电,背光供电, 8个数据位 直接连接到IO口就好了,,还有3个控制端 也直接接到IO口就可以的,这些连接方式网上也有很多

给你一个lcd1602和键盘的程序,你稍加修改就可以用了#include "AT89X51.h"
#include "lcd_1602.c"
#include "key.c"
main()
{
unsigned char key;
LCD_Initial();
GotoXY(0,0);
Print("wait you press!");
while(1)
{
key=keyscan1();
if(key!=255)
{
GotoXY(0,1);
LCD_Write(1,key/100+0x30);
LCD_Write(1,key%100/10+0x30);
LCD_Write(1,key%10+0x30);
}
}
}
//端口定义
#define DBPort P0 //LCD数据端口
sbit LcdRs = P2^0;
sbit LcdRw = P2^1;
sbit LcdEn = P2^2;
sbit Lcdbf = P0^7; //LCD忙标志 Busy Flagvoid delay(unsigned int t) //延时
{
while(t--);
}void LCD_Wait(void) //读忙状态
{
LcdRs=0;
LcdRw=1;
LcdEn=1;delay(1);LcdEn=0; //下降沿
while(Lcdbf)
{
LcdEn=0;delay(1);LcdEn=1; //仿真才需要此语句,实际硬件中不需要
}
} void LCD_Write(bit style, unsigned char input) //写数据1/命令0
{
LcdRs=style;
LcdRw=0;
DBPort=input;
LcdEn=1;delay(1);LcdEn=0;
LCD_Wait();
}void LCD_Initial(void) //初始化LCD
{
LCD_Write(0,0x38); //8位数据端口,2行显示,5*7点阵
delay(300);
LCD_Write(0,0x0c); //显示模式
LCD_Write(0,0x01); //清屏
LCD_Write(0,0x06); //输入模式
delay(300);
}void GotoXY(unsigned char x, unsigned char y) //移动光标到指定位置
{
if(y==0) LCD_Write(0,0x80|x);
if(y==1) LCD_Write(0,0xc0|x);
}void Print(unsigned char *str) //指定坐标输出字符串
{
while(*str) LCD_Write(1,*str++);
}
//P1接4*4键盘
unsigned char keyscan1() //行列法1
{
unsigned char row,rol;
P1=0x0f;
if(P1!=0x0f)
{
delay(10); //延时消抖
if (P1_0==0) row=0;
else if(P1_1==0) row=1;
else if(P1_2==0) row=2;
else if(P1_3==0) row=3;
else return(255); P1=0xf0;
if (P1_4==0) rol=0;
else if(P1_5==0) rol=1;
else if(P1_6==0) rol=2;
else if(P1_7==0) rol=3;
else return(255); while(P1!=0xf0); //等待释放
return(row*4+rol);
}
else return(255);
}