求51单片机驱动液晶12864的程序,要求是串口方式。程序里不要有绘图反白之类的,只要能显示汉字就行。

求51单片机驱动液晶12864的程序,要求是串口方式。程序里不要有绘图反白之类的,只要能显示汉字就行。,第1张

绝对好用的串口程序

sbit SID=P2^1; //12864数据

sbit SCLK=P2^2; //12864时钟

init()

{

write(0,0x30); //8 位介面,基本指令集

write(0,0x0c); //显示打开,光标关,反白关

write(0,0x01); //清屏,将DDRAM的地址计数器归零

delaynms(10);

write(0,0x80); for(i=0;i<16;i++) write(1,datas11[i]);

write(0,0x90); for(i=0;i<16;i++) write(1,datas2[i]);

write(0,0x88); for(i=0;i<16;i++) write(1,datas3[i]);

write(0,0x98); for(i=0;i<16;i++) write(1,datas4[i]);

}

/12864/

void delaynms(unsigned int di) //延时

{

unsigned int da,db;

for(da=0;da<di;da++)

for(db=0;db<10;db++);

}

void sendbyte(unsigned char bbyte) //发送一个字节

{

unsigned char i;

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

{

SID=bbyte&0x80; //取出最高位

SCLK=1;

SCLK=0;

bbyte<<=1; //左移

}

}

void write(bit start, unsigned char ddata) //写指令或数据

{

unsigned char start_data,Hdata,Ldata;

if(start==0) start_data=0xf8; //写指令

else start_data=0xfa; //写数据

Hdata=ddata&0xf0; //取高四位

Ldata=(ddata<<4)&0xf0; //取低四位

sendbyte(start_data); //发送起始信号

delaynms(5); //延时是必须的

sendbyte(Hdata); //发送高四位

delaynms(1); //延时是必须的

sendbyte(Ldata); //发送低四位

delaynms(1); //延时是必须的

}

/void lcdinit(void) //初始化LCD

{

delaynms(10); //启动等待,等LCM讲入工作状态

//PSB=0; ; //串口驱动模式

// RESET=0; delaynms(1); RESET=1; // 复位LCD

// CS=1;

write(0,0x30); //8 位介面,基本指令集

write(0,0x0c); //显示打开,光标关,反白关

write(0,0x01); //清屏,将DDRAM的地址计数器归零

}/

给你个时钟电路的汇编程序吧:

muteM EQU 10h ;静音键 闹铃开/关

timerT EQU 0Ch ;菜单键 进入/退出设置状态

leftL EQU 46h ;左移键

rightR EQU 47h ;右移键

upU EQU 19h ;增加键

downD EQU 1dh ;减少键

d_off EQU 16H ;显示键 LED数码管显示/关闭

recall EQU 44H ;日历键 DS1302初始化 *** 作

K_on BIT P30 ;闹铃输出

LED1 BIT P33

LED2 BIT P34

LED3CLK BIT P35 ;DS1302

LED4IO BIT P37

RST BIT P31

SECOND EQU 60H

;60H 秒

;61h 分

;62h 时

;63h 日

;64h 月 ;65h DAY

;66h 年

;6Ah 闹分 from 00(1302)

;6BH 闹时 from 01(1302)

;

ORG 0000H

AJMP START

ORG 0003H

LJMP S_INT ;IRF

ORG 000BH ;200Us

LJMP P_INT ;

ORG 001BH ;display LED

LJMP DISPLAY

; ;main program

ORG 0030H

START: CLR RST

MOV SP,#2AH

SETB 05H

CLR 06H

SETB 07H;CLR 07H

CLR 08H

CLR 09H

CLR 0AH

CLR 0BH

CLR 0CH

SETB 0DH

CLR 0EH

CLR 0FH

CLR 10H

CLR 11H

MOV R2,#00H ;

MOV R3,#00H ;

MOV TMOD,#12H

MOV TL1,#0e5H ;wait

MOV TH1,#0BeH

MOV TH0,#3FH ;200uS 3f

MOV TL0,#3FH

SETB ET0

SETB ET1

setb pt0

SETB TR0

SETB TR1

SETB IT0 ;

SETB EX0 ;

CLR PX0 ;LCALL SET1302 ;初始化

MOV R1,#0C1H ;取定时参数从1302中

acall T_6061

MOV 6AH,A ;M

MOV R1,#0C3H

ACALL T_6061

MOV 6BH,A ;H

MOV 61H,#0

MOV 62H,#0

SETB EA

sjmp $

;

DISPLAY: PUSH ACC

PUSH PSW

MOV TL1,#0e0H ;wait how long to display (20ms)

MOV TH1,#0b0H

MOV dptr,#tab1

JB 0EH,DIS2

JB 0FH,DIS3

JB 10H,DIS4

JB 11H,DIS5

JNB 0DH,D_OUT

JNB 08H,D_GO ;定时到时,显示闪烁

JNB 07H,D_OUT

D_G MOV DPTR,#TAB1

MOV A,62H

ANL A,#0FH

MOV B,A

MOV A,62H

SWAP A

ANL A,#07H

MOVC A,@A+DPTR

MOV P1,A

CLR LED1

LCALL DL2M

SETB LED1

MOV A,B

MOVC A,@A+DPTR

MOV C,07H

MOV acc7,C ;秒灯闪烁

MOV P1,A

CLR LED2

LCALL DL2M

SETB LED2

MOV dptr,#tab2 ;倒装LED字段表

MOV A,61H

ANL A,#0FH

MOV B,A

MOV A,61H

SWAP A

ANL A,#0FH

MOVC A,@A+DPTR

MOV C,07H

MOV acc6,C ;秒灯闪烁

MOV P1,A

CLR LED3CLK

LCALL DL2M

SETB LED3CLK

MOV dptr,#tab1

MOV A,B

MOVC A,@A+DPTR

MOV C,06H

cpl c

MOV acc7,C ;闹铃指示灯

MOV P1,A

CLR LED4IO

LCALL DL2M

SETB LED4IO

D_OUT: SETB TR1

POP PSW

POP ACC

RETI

;

DIS2: AJMP DIS_2

DIS3: AJMP DIS_3

DIS4: AJMP DIS_4

DIS5: AJMP DIS_5

;

DIS_2: MOV dptr,#tab1 ;显示设置小时

MOV 6FH,62H

ACALL BCD_HEX

MOV B,#10

DIV AB

MOVC A,@A+DPTR

MOV P1,A

CLR LED1

LCALL DL2M

SETB LED1

MOV A,B

MOVC A,@A+DPTR

MOV P1,A

CLR LED2

LCALL DL2M

SETB LED2

SETB TR1

POP PSW

POP ACC

RETI

;

DIS_3: MOV DPTR,#TAB2 ;显示设置分

MOV 6FH,61H

ACALL BCD_HEX

MOV B,#10

DIV AB

MOVC A,@A+DPTR

MOV P1,A

CLR LED3CLK

LCALL DL2M

SETB LED3CLK

MOV A,B

MOV DPTR,#TAB1

MOVC A,@A+DPTR

MOV P1,A

CLR LED4IO

LCALL DL2M

SETB LED4IO

SETB TR1

POP PSW

POP ACC

RETI

;

DIS_4: MOV dptr,#tab1 ;显示设置闹时

JNB 07H,D4_OUT ;显示时闪烁

MOV A,6BH

MOV B,#0AH

DIV AB

MOVC A,@A+DPTR

MOV P1,A

CLR LED1

LCALL DL2M

SETB LED1

MOV A,B

MOVC A,@A+DPTR

MOV P1,A

CLR LED2

LCALL DL2M

SETB LED2

D4_OUT: SETB TR1

POP PSW

POP ACC

RETI

;

DIS_5: MOV DPTR,#TAB2

JNB 07H,D5_OUT ;显示时闪烁

MOV A,6AH ;显示设置闹分

MOV B,#0AH

DIV AB

MOVC A,@A+DPTR

MOV P1,A

CLR LED3CLK

LCALL DL2M

SETB LED3CLK

MOV DPTR,#TAB1

MOV A,B

MOVC A,@A+DPTR

MOV P1,A

CLR LED4IO

LCALL DL2M

SETB LED4IO

D5_OUT: SETB TR1

POP PSW

POP ACC

RETI

;

DL2M: MOV 43H,#14H ; every LED(2ms)

DL2: MOV 44H,#14H

DL1: NOP

NOP

DJNZ 44H,DL1

DJNZ 43H,DL2

RET

;定时读取1302时间及判断闹铃时间是否到

P_INT: PUSH ACC

PUSH PSW

INC R2

CJNE R2,#250D,P_OUT

MOV R2,#00H

INC R3

CJNE R3,#10D,P_OUT

MOV R3,#00H

CPL 07H

MOV P1,#0FFH

ACALL R_1302

OUT: JNB 06H,P_OUT

MOV A,6BH

MOV B,#10

DIV AB

SWAP A

ADD A,B

CJNE A,62H,PP_OUT

MOV A,6AH

MOV B,#10

DIV AB

SWAP A

ADD A,B

CJNE A,61H,PP_OUT

SETB 08H ;定时到标志

MOV C,07H

cpl c

MOV K_ON,C

P_OUT: POP PSW

POP ACC

RETI

PP_OUT: SETB K_ON

CLR 08H

POP PSW

POP ACC

RETI

;有接收到遥控器信号

S_INT:CLR EA

PUSH ACC

PUSH PSW

PUSH DPH

PUSH DPL

PUSH 02H

PUSH 03H

MOV R6,#10D ;

SB: ACALL YS1

JB P32,EXIT

DJNZ R6, SB

JNB P32, $ ;

ACALL YS2 ;

JB P32,EXIT

MOV R1,#1AH ;

MOV R2,#4D

PP: MOV R3,#8D

JJJJ: JNB P32,$

ACALL YS1

MOV C,P32

JNC UUU

JB P32,$

UUU: MOV A,@R1

RRC A

MOV @R1,A

DJNZ R3,JJJJ

INC R1

DJNZ R2,PP

;-------------------------------------

MOV A,1AH ;

XRL A,#40h ;判断1AH的值是否等于遥控器低8位地址(40h)

JNZ EXIT ;

MOV A,1bH

XRL A,#0bfh ;再判断高8位地址是否正确(0bfh)

JNZ EXIT

MOV A,1CH

CPL A

XRL A,1DH ;将1CH的值取反后和1DH比较 不同则无效丢弃(核对数据是否准确)

JNZ EXIT

ACALL DO ;相应按键的处理

EXIT: SETB EA

POP 03H

POP 02H

POP DPL

POP DPH

POP PSW

POP ACC

RETI

;--------------------delay-----------------------

YS1: MOV 70H,#16D ;延时1

D1: MOV 71H,#21D

DJNZ 71H,$

DJNZ 70H,D1

RET

YS2: MOV 70H,#09D ;延时2

D2: MOV 71H,#220D

DJNZ 71H,$

DJNZ 70H,D2

RET

;---------------------------------------------------------

TAB: DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H ;TAB1 LED数码管显示表 TAB遥控器键值表(未用)

;TAB1: DB 3FH,11H,5EH,5BH,71H,6BH,6FH,19H,7FH,7bH,77H,7CH,39H,5EH,79H,71H

tab1: DB 0C0H,0F9H,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0a7h,0a1h,86h,8EH

TAB2: DB 0c0H,0f9H,64H,70H,59H,52H,42H ;倒装LED段码表

;0CH 为设置标志,0DH为全显示标志,0EH为显示设置小时标志,0FH为显示设置分标志

;10H 为显示设置闹时标志,11H为显示设置闹分标志

;增加闹时静音功能

;mute-10h,timer-0eh,left-46h,right-47h,up-19h,down-1dh

D MOV A,1CH

CJNE A,#TIMERT,REDO ;代码不是设置/退出键

JNB 0CH,SET1 ;是,则进入

CLR 0CH ;是,已经进入,则退出

SETB 0DH ;恢复正常显示

CLR 0EH

CLR 0FH

CLR 10H

CLR 11H

RET

SET1: SETB 0CH

SETB 0EH

CLR 0DH

CLR 0FH

CLR 10H

CLR 11H

RET

RED CJNE A,#MUTEM,REDO1 ;不是设置键的处理REDO1,2,3,4

LJMP MUTE ;MUTE

REDO1: CJNE A,#D_OFF,DO_SET2

LJMP DIS_OFF ;关闭显示

DO_SET2:JB 0CH,SET2 ;时间设置的处理

RET

SET2: CJNE A,#UPU,SET2A

LJMP INC1 ;+加(^)

SET2A: CJNE A,#DOWND,SET2B

LJMP DEC2 ;- 减

SET2B: CJNE A,#RIGHTR,SET2C

LJMP RIGHT ;RIGHT右移(>)

SET2C: CJNE A,#LEFTL,SET2D LJMP LEFT ;LEFT左移(<)

SET2D: CJNE A,#RECALL,SET2EXT ;DS1302初始化

LJMP SET1302

SET2EXT:RET

;--------------------------------INC------------------------

INC1: JB 0EH,INCH

JB 0FH,INCM

JB 10H,INC_H

JB 11H,INC_M

RET

INC_H: INC 6BH ;闹钟小时增加

MOV A,6BH

CJNE A,#24D,INCH3

MOV 6BH,#0

INCH3: MOV R1,#0C2H

MOV R0,6BH

ACALL SETONE ;写入DS1302

RET

INC_M: INC 6AH ;闹钟分增加

MOV A,6AH

CJNE A,#60D,INCH4

MOV 6AH,#0

INCH4: MOV R1,#0C0H

MOV R0,6AH

ACALL SETONE ;

RET

INCH: ;INC 62H ;

MOV 6FH,62H

ACALL BCD_HEX

INC A

CJNE A,#24D,INCH1

MOV A,#0

INCH1: MOV 6FH,A

ACALL HEX_BCD

MOV 62H,A

MOV R1,#84H

MOV R0,62H

ACALL SETONE ;

RET

INCM: ;INC 61H ;

MOV 6FH,61H

ACALL BCD_HEX

INC A

CJNE A,#60D,INCH2

MOV A,#0

INCH2: MOV 6FH,A

ACALL HEX_BCD

MOV 61H,A

MOV R1,#82H

MOV R0,61H

ACALL SETONE ;

RET

;----------------------------------DEC----------------------

DEC2: JB 0EH,DECH

JB 0FH,DECM

JB 10H,DEC_H

JB 11H,DEC_M

RET

DECH: MOV 6FH,62H

ACALL BCD_HEX

DEC A

CJNE A,#0FFH,DECH1

MOV A,#23

DECH1: MOV 6FH,A

ACALL HEX_BCD

MOV 62H,A

MOV R1,#84H

MOV R0,62H

ACALL SETONE

RET

DECM: MOV 6FH,61H

ACALL BCD_HEX

DEC A

CJNE A,#0FFH,DECM1

MOV A,#59

DECM1: MOV 6FH,A

ACALL HEX_BCD

MOV 61H,A

MOV R1,#82H

MOV R0,61H

ACALL SETONE

RET

DEC_H: DEC 6BH

MOV A,6BH

CJNE A,#0FFH,DECH3

MOV 6BH,#23D

DECH3: MOV R1,#0C2H

MOV R0,6BH

ACALL SETONE

RET

DEC_M: DEC 6AH

MOV A,6AH

CJNE A,#0FFH,DECH4

MOV 6AH,#59D

DECH4: MOV R1,#0C0H

MOV R0,6AH

ACALL SETONE

RET

;--------------------------------RIGHT----------------------

RIGHT: JB 0EH,RIGHT1

JB 0FH,RIGHT2

JB 10H,RIGHT3

JB 11H,RIGHT4

RET ;右移

RIGHT1: CLR 0EH

SETB 0FH

RET

RIGHT2: CLR 0FH

SETB 10H

RET

RIGHT3: CLR 10H

SETB 11H

RET

RIGHT4: CLR 11H

SETB 0EH

RET

;--------------------------------LEFT-----------------------

LEFT: JB 0EH,LEFT1

JB 0FH,LEFT2

JB 10H,LEFT3

JB 11H,LEFT4

RET ;左移

LEFT1: SETB 11H

CLR 0EH

RET

LEFT2: SETB 0EH

CLR 0FH

RET

LEFT3: SETB 0FH

CLR 10H

RET

LEFT4: SETB 10H

CLR 11H

RET

;------------------------------MUTE--------------

MUTE: setb k_ON

CPL 06H ;静音

CLR 08H

RET

;-----------------------------DISPLAY OFF--------

DIS_OFF:CLR ET1

CPL 05H

JNB 05H,REDORE

SETB ET1

REDORE: RET

;------------------------------------初始化1302

SET1302: CLR RST ;2002年1月1日12:00:00

CLR LED3CLK

MOV SECOND,#0

MOV 61H,#0

MOV 62H,#18 ;

MOV 63H,#1

MOV 64H,#1

MOV 65H,#1

MOV 66H,#2

SETB RST

MOV A,#8EH

LCALL R_BIT

MOV A,#00H

LCALL R_BIT

SETB LED3CLK

CLR RST

MOV R0,#SECOND

MOV R7,#7

MOV R1,#80H

SET1302A:CLR RST

CLR LED3CLK

SETB RST

MOV A,R1

LCALL R_BIT

MOV A,@R0

LCALL R_BIT

INC R0

INC R1

INC R1

SETB LED3CLK

CLR RST

DJNZ R7,SET1302A

CLR RST

CLR LED3CLK

sETB LED3CLK

nop

CLR RST

nop

clr led3clk

SETB RST

MOV A,#90H

LCALL R_BIT

MOV A,#10100101B ;充电器设置

LCALL R_BIT

SETB LED3CLK

CLR RST

CLR LED3CLK

SETB RST

MOV A,#8EH

LCALL R_BIT

MOV A,#80H

LCALL R_BIT

SETB LED3CLK

CLR RST

RET

;----------------------读取一RAM ------

T_6061: CLR RST

CLR LED3CLK

SETB RST

MOV A,R1

LCALL R_BIT

LCALL W_BIT

SETB LED3CLK

CLR RST

RET

;-----------------------------

R_1302: MOV R0,#SECOND

MOV R7,#7

MOV R1,#81H

R_1302A: CLR RST

CLR LED3CLK

SETB RST

MOV A,R1

LCALL R_BIT

LCALL W_BIT

MOV @R0,A

INC R0

INC R1

INC R1

SETB LED3CLK

CLR RST

DJNZ R7,R_1302A

RET

;------------------R_BIT------------------

R_BIT: MOV R4,#8

R_BIT1: RRC A

MOV LED4IO,C

SETB LED3CLK

CLR LED3CLK

DJNZ R4,R_BIT1

RET

;-------------------W_BIT-----------------------

W_BIT: MOV R4,#8

W_BIT1: MOV C,LED4IO

RRC A

SETB LED3CLK

CLR LED3CLK

DJNZ R4,W_BIT1

RET

;--------------------------------------------------

BCD_HEX:

MOV A,6FH

ANL A,#0FH

MOV B,A

MOV A,6FH

MOV 6FH,B

SWAP A

ANL A,#0FH

MOV B,#0AH

MUL AB

ADD A,6FH

;MOV 6FH,A

RET

HEX_BCD:

MOV A,6FH

MOV B,#10

DIV AB

SWAP A

ADD A,B

;MOV 6FH,A

RET

;-----写一地址---R1 为地址,R0 为数据----------

SETONE: CLR LED3CLK

CLR RST

CLR LED3CLK

NOP

SETB RST

MOV A,#8EH

LCALL R_BIT

MOV A,#00H

LCALL R_BIT

SETB LED3CLK

CLR RST

CLR LED3CLK

NOP

CLR RST

CLR LED3CLK

SETB RST

MOV A,R1

LCALL R_BIT

MOV A,R0

LCALL R_BIT

NOP

SETB LED3CLK

CLR RST

NOP

NOP

CLR RST

CLR LED3CLK

SETB RST

MOV A,#8EH

LCALL R_BIT

MOV A,#80H

LCALL R_BIT

SETB LED3CLK

CLR RST

RET

这是12864的程序,这是调子程序的语句,看子程序的名是Disp_HZ(0x80,line1,1),应该是显示汉字的语句,调用时带有3个参数,第一个0x80,应该是显示行在第一行,第二个line1,应该是先定义的一个汉字的字符串,就是要显示的汉字,第三个数应该是表示左屏。有些12864屏是分左右屏显示的。具体的这3个参数是不是这些意义,要看具体的子程序就知道了。

#include "reg52h"

#include "intrinsh"

sbit io_LCD12864_RS = P1^0 ;

sbit io_LCD12864_RW = P1^1 ;

sbit io_LCD12864_EN = P1^2 ;

#define io_LCD12864_DATAPORT P0

#define SET_DATA io_LCD12864_RS = 1 ;

#define SET_INC io_LCD12864_RS = 0 ;

#define SET_READ io_LCD12864_RW = 1 ;

#define SET_WRITE io_LCD12864_RW = 0 ;

#define SET_EN io_LCD12864_EN = 1 ;

#define CLR_EN io_LCD12864_EN = 0 ;

void v_Lcd12864CheckBusy_f( void ) //忙检测函数

{

unsigned int nTimeOut = 0 ;

SET_INC

SET_READ

CLR_EN

SET_EN

while( ( io_LCD12864_DATAPORT & 0x80 ) && ( ++nTimeOut != 0 ) ) ;

CLR_EN

SET_INC

SET_READ

}

void v_Lcd12864SendCmd_f( unsigned char byCmd ) //发送命令

{

v_Lcd12864CheckBusy_f() ;

SET_INC

SET_WRITE

CLR_EN

io_LCD12864_DATAPORT = byCmd ;

_nop_();

_nop_();

SET_EN

_nop_();

_nop_();

CLR_EN

SET_READ

SET_INC

}

void v_Lcd12864SendData_f( unsigned char byData ) //发送数据

{

v_Lcd12864CheckBusy_f() ;

SET_DATA

SET_WRITE

CLR_EN

io_LCD12864_DATAPORT = byData ;

_nop_();

_nop_();

SET_EN

_nop_();

_nop_();

CLR_EN

SET_READ

SET_INC

}

void v_DelayMs_f( unsigned int nDelay ) //延时

{

unsigned int i ;

for( ; nDelay > 0 ; nDelay-- )

{

for( i = 125 ; i > 0 ; i-- ) ;

}

}

void v_Lcd12864Init_f( void ) //初始化

{

v_Lcd12864SendCmd_f( 0x30 ) ; //基本指令集

v_DelayMs_f( 50 ) ;

v_Lcd12864SendCmd_f( 0x01 ) ; //清屏

v_DelayMs_f( 50 ) ;

v_Lcd12864SendCmd_f( 0x06 ) ; //光标右移

v_DelayMs_f( 50 ) ;

v_Lcd12864SendCmd_f( 0x0c ) ; //开显示

}

void v_Lcd12864SetAddress_f( unsigned char x, y ) //地址转换

{

unsigned char byAddress ;

switch( y )

{

case 0 : byAddress = 0x80 + x ;

break;

case 1 : byAddress = 0x90 + x ;

break ;

case 2 : byAddress = 0x88 + x ;

break ;

case 3 : byAddress = 0x98 + x ;

break ;

default :

break ;

}

v_Lcd12864SendCmd_f( byAddress ) ;

}

void v_Lcd12864PutString_f( unsigned char x, unsigned char y, unsigned char pData )

{

v_Lcd12864SetAddress_f( x, y ) ;

while( pData != '\0' )

{

v_Lcd12864SendData_f( pData++ ) ;

}

}

void main( void )

{

v_Lcd12864Init_f() ;

v_Lcd12864PutString_f( 0,0, "快乐随行") ;

v_Lcd12864PutString_f( 2,1, "分都不给") ;

v_Lcd12864PutString_f( 0,2, "LCD12864ST7920") ;

v_Lcd12864PutString_f( 0,3, "辛苦回答了半天") ;

while( 1 ) ;

}

#include <reg52h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit CS=P2^5; //片选信号

sbit SID=P2^6; //数据信号

sbit SCLK=P2^7; //时钟信号

sbit RST=P2^2; //复位信号

sbit CH = P2^4; //并行、串行选择信号

/

名称 : delay()

功能 : 延时,延时时间为 100us t。这是通过软件延时,有一定误差。

输入 : t

输出 : 无

/

void delay(unsigned int t)

{

unsigned int i,j;

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

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

}

/

名称 : sendbyte()

功能 : 按照液晶的串口通信协议,发送数据

输入 : zdata

输出 : 无

/

void sendbyte(unsigned char zdata)

{

unsigned int i;

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

{

if((zdata << i) & 0x80)

{

SID = 1;

}

else

{

SID = 0;

}

SCLK = 0;

SCLK = 1;

}

}

/

名称 : write_com()

功能 : 写串口指令

输入 : cmdcode

输出 : 无

/

void write_com(unsigned char cmdcode)

{

CS = 1;

sendbyte(0xf8);

sendbyte(cmdcode & 0xf0);

sendbyte((cmdcode << 4) & 0xf0);

delay(2);

}

/

名称 : write_data()

功能 : 写串口指令

输入 : cmdcode

输出 : 无

/

void write_data(unsigned char Dispdata)

{

CS = 1;

sendbyte(0xfa);

sendbyte(Dispdata & 0xf0);

sendbyte((Dispdata << 4) & 0xf0);

delay(2);

}

/

名称 : lcdinit()

功能 : 初始化函数

输入 : cmdcode

输出 : 无

/

void lcdinit()

{

RST = 0;

delay(100);

RST = 1;

delay(20000);

write_com(0x30);

delay(50);

write_com(0x0c);

delay(50);

}

/

名称 : hzkdis()

功能 : 显示字符串

输入 : s

输出 : 无

/

void hzkdis(unsigned char code s)

{

while(s > 0)

{

write_data(s);

s++;

delay(50);

}

}

/

名称 : Test()

功能 : 显示子函数

输入 : 无

输出 : 无

/

void Test()

{

write_com(0x03);

delay(50);

write_com(0x81);

hzkdis(" HOT-51");

write_com(0x91);

hzkdis("单片机开发板");

write_com(0x89);

hzkdis(" ");

write_com(0x98);

hzkdis(" 东流电子");

}

/

名称 : Main()

功能 : 主函数

输入 : 无

输出 : 无

/

void Main()

{

CH = 0;

delay(1);

lcdinit();

delay(10);

while(1)

{

Test();

delay(5000);

}

}

7920只能驱动32路,12864为两个7920控制,你想一个一个的卷动必须设置CS1,CS2,加入CS1上屏,CS2,下屏,你先控制CS1=0,CS2=1;然后COM地址加一,32以后,CS2=0,CS1=1; 然后COM地址加一就搞定

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

//基于arduino 平台的KS0180芯片12864并口显示LCD测试程序by 王瑾 2014/9/27

//程序较大使用小RAM芯片可能无法运行,如无法运行可将调用logo部分删除,会大幅减小RAM使用

//因为uno 坏了只在mega 2560测试成功

//和ST7920芯片主要是RAM地址的分布不同注意分析RAM地址写程序

//程序没有采用库文件,显示程序也没有另写子程序,主要是为了个人修改方便

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

//

int CS1=A0;//左半屏,高电平有效

int CS2=A1;//右半屏,高电平有效

int RS = 12;

int RW = 11;

int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用数组来定义总线需要的管脚DB 0-7

int Enable = 2;

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

// Bitmap点阵数据表 //

// 内容为:南京舟芯电子,TEL025-66085988 //

// 尺寸: 128 64 //

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

unsigned char logo1[] =

{

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

};

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

//写命令子程序

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

void LcdCommandWrite(int value) {

digitalWrite(RS, 0);

digitalWrite(RW, 0);

int i = 0;

for (i=3; i <= 10; i++) //总线赋值

{

digitalWrite(i,value & 01);//value与0001相与赋予i

value >>= 1;//value右移一位

}

digitalWrite(Enable,1);

delayMicroseconds(1);

digitalWrite(Enable,LOW);

delayMicroseconds(1);

}

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

//写数据子程序

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

void LcdDataWrite(int value) {

// 定义所有引脚

int i = 0;

digitalWrite(RS, 1);

digitalWrite(RW, 0);

//digitalWrite(DI, HIGH);

//digitalWrite(RW, LOW);

for (i=DB[0]; i <= DB[7]; i++) {

digitalWrite(i,value & 01);

value >>= 1;

}

digitalWrite(Enable,HIGH);

delayMicroseconds(1);

digitalWrite(Enable,LOW);

delayMicroseconds(1); // 延时百万分之一秒

}

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

//输出引脚声明

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

void setup (void) {

int i = 0;

for (i=Enable; i <= 12; i++) {

pinMode(i,OUTPUT);

}

pinMode(A0,OUTPUT);

pinMode(A1,OUTPUT);

}

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

//循环主程序

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

void loop (void) {

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

//初始化,因为KS0108芯片无初始化命令需要对整个屏幕赋值0x00, 不然的话会有杂点

//没有查到KS0108芯片的始化命令,位图调用一直有杂点,采用REST复位也不能解决,所以采用此方法

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

digitalWrite(CS1,1);

digitalWrite(CS2,1);

LcdCommandWrite(0x3e); // 显示关

int i = 0;

int yg,x,y;

int temp;

int tmp;

for(yg=0;yg<8;yg++)

{

x=yg+0xb8; //0xb8为首页地址

y=0x40; //0x40为首列地址注意分析规格书RAM地址分布图

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

tmp=yg64;

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

{

LcdDataWrite(0x00);

tmp++;

}

}

LcdCommandWrite(0x3f); //显示图象

delay(1);

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

//显示ZXET logo

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

digitalWrite(CS1,1); //先显示左半屏

digitalWrite(CS2,0);

for(yg=0;yg<8;yg++)

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

tmp=2yg64;

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

{

LcdDataWrite(logo[tmp]);

tmp++;

}

}

LcdCommandWrite(0x3f); //此处无需延迟直接接右半屏显示程序

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

digitalWrite(CS1,0); //显示右半屏

digitalWrite(CS2,1);

for(yg=0;yg<8;yg++)

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

tmp=(2yg+1)64;

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

{

LcdDataWrite(logo[tmp]);

tmp++;

}

}

LcdCommandWrite(0x3f);

delay(3000);

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

//显示 文字,依然采用位图数据调用,KS0108无字库只能采用这种办法

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

digitalWrite(CS1,1);

digitalWrite(CS2,0);

for(yg=0;yg<8;yg++)

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

tmp=2yg64;

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

{

LcdDataWrite(logo1[tmp]);

tmp++;

}

}

LcdCommandWrite(0x3f);

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

digitalWrite(CS1,0);

digitalWrite(CS2,1);

for(yg=0;yg<8;yg++)

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

tmp=(2yg+1)64;

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

{

LcdDataWrite(logo1[tmp]);

tmp++;

}

}

LcdCommandWrite(0x3f);

delay(3000);

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

//测试画面 :全黑

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

digitalWrite(CS1,1);

digitalWrite(CS2,1);

for(yg=0;yg<8;yg++)

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

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

{

LcdDataWrite(0xFF);

}

}

LcdCommandWrite(0x3f);

delay(3000);

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

//测试画面 :全白

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

digitalWrite(CS1,1);

digitalWrite(CS2,1);

for(yg=0;yg<8;yg++)

{

x=yg+0xb8;

y=0x40;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

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

{

LcdDataWrite(0x00);

}

}

LcdCommandWrite(0x3f);

delay(3000);

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

//测试画面 :数条纹

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

digitalWrite(CS1,1);

digitalWrite(CS2,1);

for(yg=0;yg<8;yg++)

{

x=yg+0xb8;

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

{

y=0x40+2i;

LcdCommandWrite(x); //写入y轴坐标

LcdCommandWrite(y); //写入x轴坐标

LcdDataWrite(0xFF);

}

}

LcdCommandWrite(0x3f);

delay(3000);

}

以上就是关于求51单片机驱动液晶12864的程序,要求是串口方式。程序里不要有绘图反白之类的,只要能显示汉字就行。全部的内容,包括:求51单片机驱动液晶12864的程序,要求是串口方式。程序里不要有绘图反白之类的,只要能显示汉字就行。、单片机汇编时钟程序、这个是12864的程序这句看不懂意思Disp_HZ(0x80,line1,1)请教各位大神了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存