LCD12864的串口驱动(asm/c51)

发布者:美丽花朵最新更新时间:2016-09-29 来源: eefocus关键字:LCD12864  串口驱动 手机看文章 扫描二维码
随时随地手机看文章
AT89S52串/并口驱动LCD12864(ST7920芯片组) - 随梦飞翔 - 随梦飞翔 的博客

串行数据传送共分三个字节完成: 
第一字节:串口控制—格式 11111ABC 
        A 为数据传送方向控制:H 表示数据从LCD 到MCU,L 表示数据从MCU 到LCD 
        B 为数据类型选择:H 表示数据是显示数据,L 表示数据是控制指令 
        C 固定为0 
第二字节:(并行)8 位数据的高4 位—格式 DDDD0000 
第三字节:(并行)8 位数据的低4 位—格式 0000DDDD 
串行接口时序参数:(测试条件:T=25℃ VDD=4.5V)

AT89S52串/并口驱动LCD12864(ST7920芯片组) - 随梦飞翔 - 随梦飞翔 的博客

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

2.  串口程序 

     PSB 接低时,串口模式被选择。在该模式下,只用两根线(SID 与 SCLK)来完 
成数据传输。当同时使用多颗 ST7920 时,CS 线被配合使用,CS 是高有效。 
     ST7920 的他不时钟SCLK 有独立的操作时序,当多个连续的指令需要被送 
入时,指令执行时间需要被考虑。必须等待上一个指令执行完毕才送入下一个指 
令,因为 ST7920 内部没有传送/接收缓冲区。 
     一个完整的串行传输周期由一下部分组成: 
     首先送入启动字节,送入 5 个连续的“1”用来启动一个周期,此时传输计 
数被重置,并且串行传输被同步。紧接的两个位指定传输方向(RW,确定读还 
是写)和传输性质(RS,确定是命令寄存器还是数据寄存器),最后的第八位是 
一个“0”。 
    送完启动字节之后,可以送入指令或是显示数据(或是字型代码)。指令或 
者代码是以字节为单位的,每个字节的内容(指令或数据)在被送入时分为两个 
字节来处理:高四位放在第一个字节的高四位,低四位放在第二个字节的高四位。 
无关位都补“0”。请参照第四章串行通讯时序图。

;//////////////////////////////////////////
;AT89S52串口驱动LCD12864
;LCD与AT89S52之间的接口:
;CS-P2.4,SID-P2.5,CLK-P2.6
;PSB-P2.1,LRET-P2.3。
;//////////////////////////////////////////
CS EQU P2.4
SID EQU P2.5
CLK EQU P2.6
PSB EQU P2.1
LRET EQU P2.3

COM DATA 40H;指令暂存器
DAT DATA 41H;显示数据暂存器
ADDR DATA 42H;显示地址寄存器

ORG 0000H
SJMP START
ORG 0030H
;主程序
START:CLR PSB
      SETB LRET
      MOV SP,50H
      CLR A
      LCALL DEL40
      LCALL INIR
      
      MOV ADDR,#80H;显示第一页内容
      MOV DPTR,#DISA1
      LCALL LINE
      MOV ADDR,#90H
      MOV DPTR,#DISA2
      LCALL LINE
      MOV ADDR,#88H
      MOV DPTR,#DISA3
      LCALL LINE
      MOV ADDR,#98H
      MOV DPTR,#DISA4
      LCALL LINE
      LCALL DEL2S
      
      MOV ADDR,#80H;显示第二页内容
      MOV DPTR,#DISA5
      LCALL LINE
      MOV ADDR,#90H
      MOV DPTR,#DISA6
      LCALL LINE
      MOV ADDR,#88H
      MOV DPTR,#DISA7
      LCALL LINE
      MOV ADDR,#98H
      MOV DPTR,#DISA8
      LCALL LINE
      LCALL DEL2S
      
      MOV ADDR,#80H;显示第三页内容
      MOV DPTR,#DISB1
      LCALL LINE
      MOV ADDR,#90H
      MOV DPTR,#DISB2
      LCALL LINE
      MOV ADDR,#88H
      MOV DPTR,#DISB3
      LCALL LINE
      MOV ADDR,#98H
      MOV DPTR,#DISB4
      LCALL LINE
      LCALL DEL2S
      
      MOV ADDR,#80H;显示第四页内容
      MOV DPTR,#DISB5
      LCALL LINE
      MOV ADDR,#90H
      MOV DPTR,#DISB6
      LCALL LINE
      MOV ADDR,#88H
      MOV DPTR,#DISB7
      LCALL LINE
      MOV ADDR,#98H
      MOV DPTR,#DISB8
      LCALL LINE
      LCALL DEL2S
      
      LJMP START
       
;函数TSWC 指令的同步位元字串写入
TSWC: SETB CS
      SETB SID
      MOV R0,#05H
   D1:SETB CLK
      CLR CLK
      DJNZ R0,D1
      CLR SID
      MOV R0,#03H
   D2:SETB CLK
      CLR CLK
      DJNZ R0,D2
      RET
;函数HDB4 写入数据的高4位
HDB4: SETB CS
      MOV R1,#04H
   D3:RLC A
      MOV SID,C
      SETB CLK
      CLR CLK
      DJNZ R1,D3      
      RET 
;函数ZEN4 写入数据的低4位           
ZEN4: CLR SID
      MOV R1,#04H
   D4:SETB CLK
      CLR CLK
      DJNZ R1,D4
      RET                
;函数WCOM  指令写入程序
WCOM: LCALL TSWC
      MOV A,COM
      LCALL HDB4
      LCALL ZEN4
      LCALL HDB4
      LCALL ZEN4
      CLR CS
      LCALL DEL2M
      RET
      
;函数INIR 初始化LCD12864      
INIR: MOV COM,#00110000B;设置基本指令
      LCALL WCOM
      MOV COM,#00110000B;设置8-BIT
      LCALL WCOM
      MOV COM,#00001100B;显示开,关光标,光反白
      LCALL WCOM
      MOV COM,#00000001B;清屏,AC=0
      LCALL WCOM
      MOV COM,#00000110B;进入点设定
      LCALL WCOM
      RET
;函数TSWD 显示数据的同步位元字串写入
TSWD: SETB CS
      SETB SID
      MOV R3,#05H
   E2:SETB CLK
      CLR CLK
      DJNZ R3,E2
      CLR SID
      SETB CLK
      CLR CLK 
      SETB SID
      SETB CLK
      CLR CLK
      CLR SID
      SETB CLK
      CLR CLK
      RET
           
;函数WDAT 显示数据写入程序
WDAT: LCALL TSWD
      MOV A,DAT
      LCALL HDB4
      LCALL ZEN4
      LCALL HDB4
      LCALL ZEN4
      CLR CS
      LCALL DEL2M
      RET      
;函数LINE 写入一行显示数据程序
LINE:MOV A,ADDR
     MOV COM,A
     LCALL WCOM 
     MOV R2,#10H
  E1:CLR A
     MOVC A,@A+DPTR
     MOV DAT,A
     LCALL WDAT
     INC DPTR
     DJNZ R2,E1                  
     RET
;函数DEL40 40MS延时
DEL40:MOV R0,#40
  DE1:MOV R1,#250
  DE2:NOP
      NOP
      DJNZ R1,DE2
      DJNZ R0,DE1    
      RET
;函数DEL2M 2MS延时
DEL2M:MOV R0,#2
  DE3:MOV R1,#250
      DJNZ R1,$
      DJNZ R0,DE3
      RET
;函数DEL2S 2S延时
DEL2S:MOV R5,#50
  DE4:LCALL DEL40
      DJNZ R5,DE4
      RET            
;显示内容区      
DISA1:DB "青岛佰谦工贸公司"
DISA2:DB "WWW.Baidu.COM.cn"
DISA3:DB "  13210813637   "
DISA4:DB "128*64全点阵显示"
DISA5:DB "图形以及字符显示"
DISA6:DB "2009年 7月 29 日"
DISA7:DB "设计者:赵玉庆  "
DISA8:DB "AT89C52 与ST7920"

DISB1:DB "昨夜星辰昨夜风,"
DISB2:DB "画楼西畔桂堂东。"
DISB3:DB "身无彩凤双飞翼,"
DISB4:DB "心有灵犀一点通。"
DISB5:DB "隔座送钩春酒暖,"
DISB6:DB "分曹射覆蜡灯红。"
DISB7:DB "嗟余听鼓应官去,"
DISB8:DB "走马兰台类转蓬。"      
      
      END      

.......................lcd12864 串口驱动程序(c51:已调试过)2009年8月20日 - 随梦飞翔 - 随梦飞翔 的博客.................................................

#include
#define uchar unsigned char
sbit cs=P2^4;
sbit sid=P2^5;
sbit clk=P2^6;
sbit psb=P2^1;
sbit res=P2^3;
uchar a,i;
uchar code table1[]="实用开关电源手册";
uchar code table2[]="Lcent Technologi";
uchar code table3[]="51单片机开发原理";
uchar code table4[]="STC89C52_LCD1286";

void d1ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}

void d10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}


void synbit()
{
 uchar j;
 sid=1;
 for(j=0;j<5;j++)
 {
  clk=1;
  clk=0;
 }
}

void zorn()
{
 uchar j;
 for(j=0;j<4;j++)
 {
  sid=0;
  clk=1;
  clk=0;
 }
}

void send(uchar date)
{
 uchar j;
 for(j=0;j<4;j++)
 {
  sid=(bit)(date&0x80);
  clk=1;
  clk=0;
  date=date<<1;
 }
 zorn(); 
 for(j=0;j<4;j++)
 {
  sid=(bit)(date&0x80);
  clk=1;
  clk=0;
  date=date<<1;
 }
 zorn(); 
}

void write_com(uchar com)
{  
 uchar j;
 cs=1;
 synbit();
 sid=0;
 for(j=0;j<3;j++)
 {
  clk=1;
  clk=0;
 }
 send(com);
 cs=0;
 d1ms();
}

void init()
{
 write_com(0x30);
 write_com(0x30);
 write_com(0x01);
 write_com(0x02);
 write_com(0x06);
 write_com(0x0c);
 write_com(0x14);
}

void write_date(uchar date)
{
 cs=1;
 synbit();
 sid=0;
 clk=1;
 clk=0;
 sid=1;
 clk=1;
 clk=0;
 sid=0;
 clk=1;
 clk=0;
 send(date);
 cs=0;
 d1ms(); 
}
void displcd()
{
 write_com(0x80);
 for(i=0;i<0x10;i++)
 {
  write_date(table1[i]);     
 }
 write_com(0x88);
 for(i=0;i<0x10;i++)
 {
  write_date(table2[i]);
 }
 write_com(0x90);
 for(i=0;i<0x10;i++)
 {
  write_date(table3[i]);
 }
 write_com(0x98);
 for(i=0;i<0x10;i++)
 {
  write_date(table4[i]);
 }
}

void main()
{
 cs=0;
 sid=0;
 clk=0;
 SP=0x30;
 res=0;
 d10ms();
 res=1;
 psb=0;
 init();
 displcd();
 while(1);
}

关键字:LCD12864  串口驱动 引用地址:LCD12864的串口驱动(asm/c51)

上一篇:LCD1602+ADC0832数字电压表(asm/c51)
下一篇:STC89C52与AT24C02按字节写(C51)

推荐阅读最新更新时间:2024-03-16 15:12

S3C2440A串口驱动-WINCE6.0下通过串口和外设进行数据通信(二)
三,串口中断服务线程 串口中断产生以后,具体的数据处理将在中断服务线程里面完成,以BSP包中camera的中断线程为例 DWORD CameraCaptureThread(void) { unsigned char tmp=0; static unsigned int time,old_time; static unsigned int cam_intr; DWORD dwCause; //dwDisplayTimeout = INFINITE; SetProcPermissions((DWORD)-1); while(TRUE) { RETAILMSG(0,(TEXT( Interrupt
[单片机]
S3C2440A<font color='red'>串口驱动</font>-WINCE6.0下通过串口和外设进行数据通信(二)
lcd12864显示遥控键值读取程序
LCD 12864显示遥控键值读取程序 #include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int /*TS12864A-3 端口定义*/ #define LCD_data P0 //数据口 sbit LCD_RS = P2^0; //寄存器选择输入 sbit LCD_RW = P2^1; //液晶读/写控制 sbit LCD_EN = P2^2; //液晶使能控制 sbit LCD_PSB = P2^3; //串/并方式控制 sbit LCD_R
[单片机]
单片机LCD12864滚动和反白显示图片
本任务是用单片机实现液晶显示演示效果如图所示。通过编程,学会在单片机上实现液晶显示控制方法,以及不同数据显示的程序编写方法。 单片机源程序如下: #include LCD_12864.h #include stdio.h extern void cls(); extern uchar LCD_Initialise(); extern uchar LCD_Write_Command(uchar cmd); extern uchar LCD_Write_Command_P2(uchar cmd,uchar para1,uchar para2); extern uchar LCD_Write_Data(uchar dat);
[单片机]
单片机<font color='red'>LCD12864</font>滚动和反白显示图片
自制单片机之七……LCD12864的驱动之源代码
今天将LCD12864的源代码发上来。 //LCD12864 //********************************************************** //连线表: CPU=89C51 SysClock=12MHz * //RS=P1.0 R/W=P1.1 E=P1.2 CS1=P1.3 CS2=P1.4 * //DB0-DB7=P0.0-P0.7 /Reset=InBoard * //********************************************************** #include #include
[单片机]
自制单片机之七……<font color='red'>LCD12864</font>的驱动之源代码
LCD12864带中文字库图形显示-单片机程序
代码: #include reg52.h #define uchar unsigned char sbit rs=P2^2;//写指令/数据 sbit rw=P2^3;//读状态/写 sbit e=P2^4;//使能端 sbit psb=P2^5;//串/并输入 //校徽 unsigned char code image ={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x
[单片机]
<font color='red'>LCD12864</font>带中文字库图形显示-单片机程序
LCD12864液晶基本程序
#include reg52.h #include intrins.h #define uchar unsingned char #define uint unsigned int sbit rs=P2^4; sbit rw=P2^5; sbit e=P2^6; sbit psb=P2^7; uchar table ="20100419"; write_12864com(uchar com); write_12864dat(uchar dat); void initinal(void); void display1(void); void display2(void); void display3(void); void dela
[单片机]
称重传感器HX711+lcd12864
程序分为main.c+HX711.c+HX711.h+lcd12864.c+lcd12864.h //lcd12864.h #ifndef __lcd12864_H #define __lcd12864_H //---包含头文件---// #include reg52.h //---重定义关键词---// #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif //---如果使用画图模式定义这个---// //#define LCD12864_PICTURE //---定义使用的IO口---//
[单片机]
51单片机MPU6050数字陀螺仪与LCD12864显示
#include REG52.H #include math.h #include stdio.h #include INTRINS.H typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; #define DataPort P0 sbit SCL=P2^6; sbit SDA=P2^5; sbit LCM_RS = P3^7; sbit LCM_RW = P3^6; sbit LCM_EN = P3^5; sbit L
[单片机]
51单片机MPU6050数字陀螺仪与<font color='red'>LCD12864</font>显示
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved