
#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,并驱动蜂鸣器发出声音等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)