AT89S52单片机的汇编程序如下,请帮我写成C语言的。这是个写串行LCD驱动的子程序。【会追加200分的!】

串行模式的驱动子程序如下:
CS EQU P3.0 ;
SID EQU P3.1 ;
CLK EQU P3.2 ;
1、写指令代码子程序
WRITE_COM:
LCALL DELAY1 ;INSTEAD OF CHECKING BF STATE
SETB CS
PUSH ACC
MOV R0,#8
MOV A,#11111000B
COMM1:
CLR C
RLC A
CLR CLK
MOV SID,C
SETB CLK
DJNZ R0,COMM1

POP ACC
MOV R5,A
ANL A,#0F0H
MOV R0,#8
COMM2: CLR C
RLC A
CLR CLK
MOV SID,C
SETB CLK
DJNZ R0,COMM2
MOV A,R5
SWAP A
ANL A,#0F0H
MOV R0,#8
COMM3: CLR C
RLC A
; CLR CLK
CLR CLK
MOV SID,C
SETB CLK
DJNZ R0,COMM3
CLR CS
RET
2、写显示数据子程序
WRITE_DAT:
LCALL DELAY1
SETB CS
PUSH ACC
MOV R0,#8
MOV A,#11111010B
DATA1: CLR C
RLC A
CLR CLK
MOV SID,C
SETB CLK
DJNZ R0,DATA1
POP ACC
MOV R5,A

ANL A,#0F0H
MOV R0,#8
DATA2: CLR C
RLC A
CLR CLK
MOV SID,C
SETB CLK
DJNZ R0,DATA2
MOV A,R5
SWAP A
ANL A,#0F0H
MOV R0,#8
DATA3: CLR C
RLC A
CLR CLK
MOV SID,C
SETB CLK
DJNZ R0,DATA3
CLR CS
RET

楼主可以参考这个程序,只要稍微修改一下端口或参考一些函数即可,希望对您有用,有什么问题的话可以问我~~
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

//这三个引脚参考资料
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚

/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/

void delay()
{
int i,j;
for(i=0; i<=100; i++)
for(j=0; j<=20; j++)
;
}

/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/

void enable(uchar del)
{
P0 = del;
RS = 0;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}

/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/

void write(uchar del)
{
P0 = del;
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}

/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}

/********************************************************************
* 名称 : 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;
enable(a);
write(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;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == '\0') break;
write(*p);
p++;
}
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
uchar i = 48;
L1602_init();
L1602_char(1,5,'b');
L1602_string(1,1," 0123456789 ");
L1602_string(2,1," ABCDEDGHIJ ");
while(1);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-24
#include "reg52.h"
#define uchar unsigned char
sbit CS=P3.0;
sbit SID=P3.1;
sbit CLK=P3.2;
uchar temp;//保护ACC的值,代替入栈

void delay1();//---------------LCALL DELAY1----题目没有给出具体内容
{ //-------------------------------需要楼主注意
}

//写指令代码子程序
void write_com()
{
uchar R0,R5;
delay1();//---------------LCALL DELAY1----题目没有给出具体内容
//-------------------------------需要楼主注意
CS=1;
temp=ACC;//代替入栈

ACC=248;//ACC=#11111000
for(R0=0;R0<8;R0++)//实现COMM1将ACC的数据从高位向低位的依次传送
{
CLK=0;
SID=ACC^7;
CLK=1
ACC<<1;
}
ACC=temp;//代替出栈
R5=ACC;
ACC=(ACC&0xf0);
for(R0=0;R0<8;R0++)//实现COMM2将ACC的数据从高位向低位的依次传送
{
CLK=0;
SID=ACC^7;
CLK=1
ACC<<1;
}
ACC=R5;
ACC<<4;//实现半字节交换,且低4位为0;
for(R0=0;R0<8;R0++)//实现COMM3将ACC的数据从高位向低位的依次传送
{
CLK=0;
SID=ACC^7;
CLK=1
ACC<<1;
}
CS=0;
}

//2写显示数据子程序
void write_dat()
{
uchar R0,R5;
delay1();//---------------LCALL DELAY1----题目没有给出具体内容 //-------------------------------需要楼主注意
CS=1;
temp=ACC;
ACC=0xfa;//MOV A,#11111010;
for(R0=0;R0<8;R0++)//实现DATA1将ACC的数据从高位向低位的依次传送
{
CLK=0;
SID=ACC^7;
CLK=1
ACC<<1;
}
ACC=temp;//代替出栈
R5=ACC;
ACC=(ACC&0xf0);
for(R0=0;R0<8;R0++)//实现DATA2将ACC的数据从高位向低位的依次传送
{
CLK=0;
SID=ACC^7;
CLK=1
ACC<<1;
}
ACC=R5;
ACC<<4;//实现半字节交换,且低4位为0;
for(R0=0;R0<8;R0++)//实现DATA3将ACC的数据从高位向低位的依次传送
{
CLK=0;
SID=ACC^7;
CLK=1
ACC<<1;
}
CS=0;
}

main()//--------------C程序起止于main函数
{
}本回答被提问者采纳
第2个回答  2011-08-23
23233
相似回答