51单片机C语言1602液晶显示程序解析

51单片机C语言1602液晶显示程序解析,第1张

这个是1602内部结构决定的,你只需要在初始化的时候先设置三次显示,然后再设置你的其他要求。

芯片厂家推荐的用法:

INT:

MOV

A,#30H

MOV

DATR,#CW_ADD

MOV

R2,#03H

INT1:

MOVX

@DPTR,A

CALL

DELAY

DJNZ

R2,INT1

这上面就是1602对于51单片机推荐的初始化之前加的三次模式设置

#define LCD1602_FLAG

#define LCD1602_PORT P0

#include<reg51.h>

#include<stddef.h>

#define uchar unsigned char

sbit lcd1602_rs=P2^0

sbit lcd1602_e=P2^2

sbit lcd1602_rw=P2^1

sbit lcd1602_busy=P0^7

uchar str[]="This is Key Test"

uchar keyval,keystr[16]

void delay(uchar a)

{

uchar i

while(a--)for(i=0i<120i++)

}

/*

************************************

 * 函数名称: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 uchar 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 uchar 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(0x0c) //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 uchar *ptr,uchar line)

{

    uchar data i=0

uchar *data q

q=ptr

switch(line)

{

case 0:

lcd1602_WriteCmd(0x80)

while(q!=NULL && (*q!='\0') && i<16)

     {

lcd1602_WriteData(*q)

q++

i++

     }

break

case 1:

lcd1602_WriteCmd(0xc0)

while(q!=NULL && (*q!='\0') && i<16)

     {

lcd1602_WriteData(*q)

q++

i++

}

break

}

}

uchar kbscan(void)

{

unsigned char sccode,recode

P3=0x0f  //发0扫描,列线输入

if ((P3 & 0x0f) != 0x0f)  //有键按下

{

delay(20)   //延时去抖动

if ((P3&0x0f)!= 0x0f)

{

sccode = 0xef    //逐行扫描初值

while((sccode&0x01)!=0)

{

    P3=sccode

if((P3&0x0f)!=0x0f)

{

    recode=(P3&0x0f)|0xf0

while((P3&0x0f)!=0x0f)//等待键抬起

return((~sccode)+(~recode))

 }

        else

sccode=(sccode<<1)|0x01

}

}

}

return 0  //无键按下,返回0

}

uchar getkey(void)

{

uchar key

key=kbscan()

if(key==0){keyval=0xffreturn(0)}

switch(key)

{

case 0x11:keyval=7break

case 0x12:keyval=4break

case 0x14:keyval=1break

case 0x18:keyval=10break

case 0x21:keyval=8break

case 0x22:keyval=5break

case 0x24:keyval=2break

case 0x28:keyval=0break

case 0x41:keyval=9break

case 0x42:keyval=6break

case 0x44:keyval=3break

case 0x48:keyval=11break

case 0x81:keyval=12break

case 0x82:keyval=13break

case 0x84:keyval=14break

case 0x88:keyval=15break

default:keyval=0xffbreak

}

if(keyval!=0xff)return(1)

else return(0)

}

main()

{

uchar num

lcd1602_Init()

lcd1602_Display(str,0)

while(1)

{

if(getkey())

{

keystr[num]=keyval+0x30

lcd1602_Display(keystr,1)

num++

num%=16

}

}

}

void busy_test()//检测lcd是否忙

{

    u8 st            //忙状态标志 0:不忙,0x80:忙 

    if(f_init==0)     //如果某个东西没有初始化

    {

         return      // 退出忙判断,不执行下面的代码

    }

    lcd=0xff         // 先往数据端口赋高电平,便于读数据 

    rs=0             // 读忙设置

    rw=1//读

    do

    {

        e=1          // 数据端口读写使能

        st=lcd       // 读数据端口的值

        e=0          // 禁止数据端口读写

    }

    while(st&0x80)   // 如果忙位BF为1,就一直读端口数据,直到为0才退出忙判断。

                      // BF:忙标志位,为数据端口的BIT7位。所以为0x80

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存