怎样在STC89C51单片机上用1602液晶显示字符“STC89C52RC”,求程序代码

怎样在STC89C51单片机上用1602液晶显示字符“STC89C52RC”,求程序代码,第1张

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]'STC89C52RC'!;//这边错了

sbit lcden=P3^4;

sbit lcdrs=P3^5;

sbit dula=P2^6;

sbit wela=P2^7;

uchar num;

void delay(uint z)

{

     uint x,y;

     for(x=z;x>0;x--);

          for(y=110;y>0;y--);

}

void write_com(uchar com)

{

     lcdrs=0;

     P0=com;

     delay(5);

     lcday=1;

     delay(5);

     lcden=0;

}

viod write_data(uchar date)//这个write_data函数只能写一个字节

{

     lcdrs=1;

     P0=date;

     delay(5);

     lcden=1;

     delay(5);

     lcden=0;

}

void init()

{

     dula=0;

     wela=0;

     lcden=0;

     write_com(0x38);

     write_com(0x0c);

     write_com(0x06);

     write_com(0x01);

}

void main();

{

     init();

     write_com(0x80);

     for(num=0;num<11;num++)

     {

          write_data(STC89C52RC);//write_data只能写一个字节,这边错了,还有如果要写单个字节,如果是字母的话,还得加引号

          //如果要写一个字符串,可以另外写个函数

          delay(5);

     }

     while(1)

}

常用的LCD有1602,可以查找其硬件电路,其程序也很容易找到,这是其常用的子程序

sbit rw=P1^4;//定义管脚,3个控制引脚 1个8位数据

sbit rs=P1^3;

sbit lcden=P1^5;

#define db P2

void write_com(uchar com)//液晶屏写命令,控制液晶屏开关或字符位置的数据是命令

{

db=com;

rs=0;

rw = 0;

lcden=0;

Delay1ms(12);

lcden=1;

Delay1ms(12);

lcden=0;

}

void write_date(uchar date)//液晶屏写数据,将要显示的字符是数据

{

db=date;

rs=1;

rw = 0;

lcden=0;

Delay1ms(12);

lcden=1;

Delay1ms(12);

lcden=0;

}

void init2()//液晶屏初始化

{

rw=0;

write_com(0x38);

Delay1ms(12);

write_com(0x0f);

Delay1ms(12);

write_com(0x06);

Delay1ms(12);

write_com(0x01);

Delay1ms(12);

}

void display_1602(uchar temp)//显示一个字符型变量的子程序

{

uchar A1,A2,A3;

A1=temp/1000;//分离出 个 十 百

A2=temp/100%10;

A3=temp%10;

write_com(0x80);//第1行,第1字

write_date(A1+0x30);送的是ASCI码,因此如果显示2,就 要送0x32

Delay1ms(1);

write_date( A2+0x30);

Delay1ms(1);

write_date(A3+0x30);

Delay1ms(12);

}

如果想显示字符"A" 就 write_date(‘A’);

;

LCD_RS EQU P33 LCD_RW EQU P34 LCD_EN EQU P35

; ORG 0000H AJMP MAIN ORG 0030H;MAIN: MOV SP,#60H ACALL LCD_INIT ;LCD初始化MAIN1: ACALL CLR_LCD ;清LCD MOV A,#80H ;显示在第一行左边第一位位置 ACALL LCD_CMD MOV DPTR,#LINE1 ;第一行字符串的起始地址送入DPTR。 ACALL WRITE MOV A,#0C0H ;显示在第二行左边第一位位置 ACALL LCD_CMD MOV DPTR,#LINE2 ;第二行字符串的起始地址送入DPTR。 ACALL WRITE MOV R4,#03H ;向右移动3格

dcLOOPA: MOV A,#1CH ;字符同时右移一格 ACALL LCD_CMD MOV R5,#03H CALL DELAY125MS ;延时375MS DJNZ R4,LOOPA MOV R4,#06H ;向左移动6格LOOPB: MOV A,#18H ;字符同时左移一格 ACALL LCD_CMD MOV R5,#03H ;延时375MS CALL DELAY125MS DJNZ R4,LOOPB AJMP MAIN1

LINE1: DB "A CALL IS COMING ",00HLINE2: DB "NAME:1592560",00H

;;LCD初始化设定子程序;LCD_INIT: ACALL DELAY5MS ;延时15MS ACALL DELAY5MS ;等待LCD电源稳定 ACALL DELAY5MS

MOV A,#38H ;162显示,57点阵,8位数据 ACALL LCD_CMD_NC ;不进行LCD忙检测 ACALL DELAY5MS

MOV A,#38H ;162显示,57点阵,8位数据 ACALL LCD_CMD_NC ;不进行LCD忙检测 ACALL DELAY5MS

MOV A,#38H ;162显示,57点阵,8位数据 ACALL LCD_CMD_NC ;不进行LCD忙检测 ACALL DELAY5MS

MOV A,#08H ;显示关 ACALL LCD_CMD ;进行LCD忙检测

MOV A,#01H ;清除屏幕 ACALL LCD_CMD ;进行LCD忙检测

MOV A,#0CH ;显示开,关光标 ACALL LCD_CMD ;进行LCD忙检测

RET;;清LCD子程序;CLR_LCD: MOV A,#01H ;清除屏幕 ACALL LCD_CMD ;进行LCD忙检测 RET

;;写指令数据到LCD;RS=L,RW=L,D0-D7=指令码,E=高脉冲;LCD_CMD: CALL CHECKBUSYLCD_CMD_NC: CLR LCD_RS CLR LCD_RW MOV P0,A SETB LCD_EN NOP NOP NOP NOP CLR LCD_EN RET;;写显示数据到LCD;RS=H,RW=L,D0-D7=数据,E=高脉冲;LCD_WDATA: ACALL CHECKBUSY SETB LCD_RS CLR LCD_RW MOV P0,A SETB LCD_EN NOP NOP NOP NOP CLR LCD_EN RET;;检测LCD控制器忙状态;读数据;RS=L,RW=H,E=H,输出:D0-D7=数据;P07=1,LCD忙,等待。P07=0,LCD闲,可以进行读写 *** 作。;CHECKBUSY: PUSH ACC MOV P0,#0FFH CLR LCD_RS SETB LCD_RW SETB LCD_ENBUSYLOOP: NOP JB P07,BUSYLOOP CLR LCD_EN POP ACC RET;; 发送字符串子程序;WRITE: PUSH ACCWRITE1: CLR A MOVC A,@A+DPTR JZ WRITE2 INC DPTR ACALL LCD_WDATA MOV R5,#01H CALL DELAY125MS ;延时,形成逐字显示效果。 SJMP WRITE1WRITE2: POP ACC RET

;;延时5MS子程序;LCD初始化使用;DELAY5MS: MOV R6,#10DL1: MOV R7,#249DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET;;;延时125MS子程序;字符串移动时使用;DELAY125MS:DL3: MOV R6,#250DL4: MOV R7,#249DL5: DJNZ R7,DL5 DJNZ R6,DL4 DJNZ R5,DL3 RET

你好:

其余为黑块说明这个指针的第二个数据开始时没有值的。

你可以换一种方式,先把单个数据的函数做好,然后重写一个子函数,这个子函数使用for循环调用那个读取的函数,这样每次都从开始信号到结束信号为一次的读取。

希望我的回答能帮助到你。

这个你看看可以参考!

#include<reg51h>

#include<intrinsh>

#define uint unsigned int

#define uchar unsigned char

uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

//这三个引脚参考资料

sbit E=P2^7; //1602使能引脚

sbit RW=P2^6; //1602读写引脚

sbit RS=P2^5; //1602数据/命令选择引脚

/

名称 : Delay_1ms()

功能 : 延时子程序,延时时间为 1ms x

输入 : x (延时一毫秒的个数)

输出 : 无

/

void Delay_1ms(uint i)//1ms延时

{

uchar x,j;

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

for(x=0;x<=148;x++);

}

/

名称 : delay()

功能 : 延时,延时时间大概为5US。

输入 : 无

输出 : 无

/

void delay()

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

/

名称 : bit Busy(void)

功能 : 这个是一个读状态函数,读出函数是否处在忙状态

输入 : 输入的命令值

输出 : 无

/

bit Busy(void)

{

bit busy_flag = 0;

RS = 0;

RW = 1;

E = 1;

delay();

busy_flag = (bit)(P0 & 0x80);

E = 0;

return busy_flag;

}

/

名称 : wcmd(uchar del)

功能 : 1602命令函数

输入 : 输入的命令值

输出 : 无

/

void wcmd(uchar del)

{

while(Busy());

RS = 0;

RW = 0;

E = 0;

delay();

P0 = del;

delay();

E = 1;

delay();

E = 0;

}

/

名称 : wdata(uchar del)

功能 : 1602写数据函数

输入 : 需要写入1602的数据

输出 : 无

/

void wdata(uchar del)

{

while(Busy());

RS = 1;

RW = 0;

E = 0;

delay();

P0 = del;

delay();

E = 1;

delay();

E = 0;

}

/

名称 : L1602_init()

功能 : 1602初始化,请参考1602的资料

输入 : 无

输出 : 无

/

void L1602_init(void)

{

wcmd(0x38);

wcmd(0x0c);

wcmd(0x06);

wcmd(0x01);

}

/

名称 : L1602_char(uchar hang,uchar lie,char sign)

功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下

L1602_char(1,5,'b')

输入 : 行,列,需要输入1602的数据

输出 : 无

/

void L1602_char(uchar hang,uchar lie,char sign)

{

uchar a;

if(hang == 1) a = 0x80;

if(hang == 2) a = 0xc0;

a = a + lie - 1;

wcmd(a);

wdata(sign);

}

/

名称 : L1602_string(uchar hang,uchar lie,uchar p)

功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

L1602_string(1,5,"ab cd ef;")

输入 : 行,列,需要输入1602的数据

输出 : 无

/

void L1602_string(uchar hang,uchar lie,uchar p)

{

uchar a,b=0;

if(hang == 1) a = 0x80;

if(hang == 2) a = 0xc0;

a = a + lie - 1;

while(1)

{

wcmd(a++);

b++;

if((p == '\0')||(b==16)) break;

wdata(p);

p++;

}

}

/

名称 : Keyscan()

功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。

输入 : 无

输出 : 按键值

/

uchar Keyscan(void)

{

uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};

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

{

P1 = Buffer[j];

temp = 0x10;

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

{

if(!(P1 & temp))

{

return (i+j4);

}

temp <<= 1;

}

}

}

/

名称 : Main()

功能 : 主函数

输入 : 无

输出 : 无

/

void Main(void)

{

uchar Key_Value; //读出的键值

L1602_init();

L1602_string(1,1," 44 KeyBoard ");

L1602_string(2,1,"You Press The ");

while(1)

{

P1 = 0xf0;

if(P1 != 0xf0)

{

Delay_1ms(20); //按键消抖

if(P1 != 0xf0)

{

Delay_1ms(20); //按键消抖

if(P1 != 0xf0)

{

Key_Value = Keyscan();

}

}

}

L1602_char(2,15,Key_Value / 10 + 48);

L1602_char(2,16,Key_Value % 10 + 48);

}

}

以上就是关于怎样在STC89C51单片机上用1602液晶显示字符“STC89C52RC”,求程序代码全部的内容,包括:怎样在STC89C51单片机上用1602液晶显示字符“STC89C52RC”,求程序代码、怎么才能把单片机里的数据在LCD上显示、变一个汇编程序,实现1602显示 A CALL IS COMING;NAME:159****2560,并驱动蜂鸣器发出声音等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9278210.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存