19264液晶模块显示51单片机汇编程序
Proteus 自建元件库(TG19264A点阵式液晶显示元件)
Proteus 自建元件库转自: 一、Proteus VSM仿真模型简介在使用Proteus仿真单片机系统的过程中,经常找不到所需的元件,这就需要自己编写。
Proteus VSM的一个主要特色是使用基于DLL组件模型的可扩展性。
这些模型分为两类:电气模型(Electrical Model)和绘图模型(Graphical Model)。
电气模型实现元件的电气特性,按规定的时序接收数据和输出数据;绘图模型实现仿真时与用户的交互,例如LCD的显示。
一个元件可以只实现电气模型,也可以都实现电气和绘图模型。
Proteus为VSM模型提供了一些C++抽象类接口,用户创建元件时需要在DLL中实现相应的抽象类。
VSM模型和Proteus系统通信的原理如下图:绘图模型接口抽象类:ICOMPONENT――ISIS内部一个活动组件对象,为VSM模型提供在原理图上绘图和用户交互的服务。
IACTIVEMODEL――用户实现的VSM绘图模型要继承此类,并实现相应的绘图和键盘鼠标事件处理。
电气模型接口抽象类:IINSTANCE――一个PROSPICE仿真原始模型,为VSM模型提供访问属性、模拟节点和数据引脚的服务,还允许模型通过仿真日志发出警告和错误信息。
ISPICECKT(模拟)――SPICE拥有的模拟元件,提供的服务:访问、创建和删除节点,在稀疏矩阵上分配空间,同时还允许模型在给定时刻强制仿真时刻点的发生和挂起仿真。
ISPICEMODEL(模拟)――用户实现的VSM模拟元件要继承此类,并实现相应的载入数据,在完成的时间点处理数据等。
IDSIMCKT(数字)――DSIM拥有的数字元件,提供的服务:访问数字系统的变量,创建回调函数和挂起仿真。
IDSIMMODEL(数字)――用户实现的VSM数字元件要继承此类,并实现相应的引脚状态变化的判断和回调事件的处理。
IDSIMPIN(数字)――数字组件的引脚,提供检测引脚状态和创建输出事务事件的服务。
19264显示驱动程序
19264控制器KS0108#include <at89x52.h>#include <intrins.h>#include "zimo.h"#define RS P2_6 /*"H" is send or read the data;"L" is the instruction*/ #define RW P3_6#define E P2_5 /*Operation enable*/#define CS1 P2_4#define CS2 P2_3#define CS3 P2_2#define DATA P0#define uchar unsigned char#define uint unsigned int/* -------------------------------------------------Delay some time----------- */void delay10ms(unsigned char x){unsigned char i,j,k;for(i=0;i<x;i++)for(j=0;j<10;j++)for(k=0;k<120;k++);}/* -------------------------------------------------Send the instruction to the First KS0108 window--*/void OutFI(uchar i){unsigned char data_sta;do{E=0;RW=1;RS=0;CS1=0;_nop_();E=1;_nop_();data_sta=DATA;E=0;RW=0;CS1=1;E=1;}while(data_sta&0x80);E=0;RW=0;RS=0;CS1=0;_nop_();E=1;_nop_();DATA=i;_nop_();E=0;RW=1;CS1=1;E=1;}/* ------------------------------------------------- Send the instruction to the Second KS0108 window.--*/void OutSI(uchar i){unsigned char data_sta;do{E=0;RW=1;RS=0;CS2=0;_nop_();E=1;_nop_();data_sta=DATA;E=0;RW=0;CS2=1;E=1;}while(data_sta&0x80);E=0;RW=0;RS=0;CS2=0;_nop_();E=1;_nop_();DATA=i;_nop_();E=0;RW=1;CS2=1;E=1;}/* ------------------------------------------------- Send the instruction to the Third KS0108 window--*/void OutTI(uchar i){unsigned char data_sta;do{E=0;RW=1;RS=0;CS3=0;_nop_();E=1;_nop_();data_sta=DATA;E=0;RW=0;CS3=1;E=1;}while(data_sta&0x80);E=0;RW=0;RS=0;CS3=0;_nop_();E=1;_nop_();DATA=i;_nop_();E=0;RW=1;CS3=1;E=1;}/* -------------------------------------------------Send the data to the First ks0108 Window--*/void OutFD(uchar i){unsigned char data_sta;do{E=0;RW=1;RS=0;CS1=0;_nop_();E=1;_nop_();data_sta=DATA;E=0;RW=0;CS1=1;E=1;}while(data_sta&0x80);E=0;RW=0;RS=1;CS1=0;_nop_();E=1;_nop_();DATA=i;_nop_();E=0;RW=1;CS1=1;E=1;}/* ------------------------------------------------- Send the data to the Second ks0108 Window--*/void OutSD(uchar i){unsigned char data_sta;do{E=0;RW=1;RS=0;CS2=0;_nop_();E=1;_nop_();data_sta=DATA;E=0;RW=0;CS2=1;E=1;}while(data_sta&0x80);E=0;RW=0;RS=1;CS2=0;_nop_();E=1;_nop_();DATA=i;_nop_();E=0;RW=1;CS2=1;E=1;}/* ------------------------------------------------- Send the data to the Third ks0108 Window--*/void OutTD(uchar i){unsigned char data_sta;do{E=0;RW=1;RS=0;CS3=0;_nop_();data_sta=DATA;E=0;RW=0;CS3=1;E=1;}while(data_sta&0x80);E=0;RW=0;RS=1;CS3=0;_nop_();E=1;_nop_();DATA=i;_nop_();E=0;RW=1;CS3=1;E=1;}/* ------------------------------------------------- Read the data to the First ks0108 Window--*//*unsigned char RD_data_F(){unsigned char data_sta;do{E=0;RW=1;RS=0;CS1=0;_nop_();E=1;_nop_();data_sta=DATA;E=0;RW=0;CS1=1;E=1;}while(data_sta&0x80);E=0;RW=1;RS=1;CS1=0;_nop_();E=1;_nop_();_nop_();_nop_();data_sta=DATA;_nop_();E=0;RW=0;CS1=1;E=1;return (data_sta);}/* ------------------------------------------------- Read the data to the Second ks0108 Window--*//*unsigned char RD_data_S(){unsigned char data_sta;do{E=0;RW=1;RS=0;CS2=0;_nop_();E=1;_nop_();_nop_();_nop_();data_sta=DATA;E=0;RW=0;CS2=1;E=1;}while(data_sta&0x80);E=0;RW=1;RS=1;CS2=0;_nop_();data_sta=DATA;_nop_();E=0;CS2=1;E=1;return (data_sta);}/* ------------------------------------------------- Read the data to the Third ks0108 Window--*//*unsigned char RD_data_T(){unsigned char data_sta;do{E=0;RW=1;RS=0;CS3=0;_nop_();E=1;_nop_();_nop_();_nop_();data_sta=DATA;E=0;RW=0;CS3=1;E=1;}while(data_sta&0x80);E=0;RW=1;RS=1;CS3=0;_nop_();E=1;_nop_();data_sta=DATA;_nop_();E=0;CS3=1;E=1;return(data_sta);}/* ------------------------------------------------- Initialize the LCD,The system reset,invoke First time-*/void InitLCD(){OutFI(0x40); /*Set the Y address 0 */OutSI(0x40);OutTI(0x40);OutFI(0xb8); /*Set the Page 0 */OutSI(0xb8);OutTI(0xb8);OutFI(0xc0); /*Set the display start line 0 */OutSI(0xc0);OutTI(0xc0);OutFI(0x3f); /*Display ON */OutSI(0x3f);OutTI(0x3f);}/* -------------------------------------------------Clear the three ks0108's display ram.Clrscr screen-*/void Clrscreen(){unsigned char i,j;for(i=0;i<8;i++){OutFI(0xb8|i);for(j=0;j<64;j++){OutFI(j|0x40);OutFD(0);}}for(i=0;i<8;i++)(OutSI(0xb8|i);for(j=0;j<64;j++)(OutSI(j|0x40);OutSD(0);}}for(i=0;i<8;i++)(OutTI(0xb8|i);for(j=0;j<64;j++)(OutTI(j|0x40);OutTD(0);}}}/* -------------------------------------------------Display Chinese ideograph;x_add is the x address;It has 4 layers,0,1,2,3; Width is the Chinese ideograph width;bmp is the table's name-*/void DrawBmp(uchar x_add,uchar layer,uchar width,uchar *bmp)(unsigned char x;unsigned int i=0;for(x=x_add;x<x_add+width;x++)(if (x>127) /*The Third KS0108*/(OutTI((x-128)|0x40); /*Set the x address*/OutTI(layer|0xb8); /*Set the y address*/OutTD(bmp[i]); /*Send thd data to LCD ram*/OutTI((x-128)|0x40); /*Display the down screen*/ OutTI((layer|0xb8)+1); i++; /*Display zimo table address add 1*/ OutTD(bmp[i]);}else if (x>63) /*The Second ks0108*/{OutSI((x-64)|0x40);OutSI(layer|0xb8);OutSD(bmp[i]);OutSI((x-64)|0x40);OutSI((layer|0xb8)+1);i++;OutSD(bmp[i]);}else /*The First ks0108*/{OutFI(x|0x40);OutFI(layer|0xb8);OutFD(bmp[i]);OutFI(x|0x40);OutFI((layer|0xb8)+1);i++;OutFD(bmp[i]);}i++;}}/* -------------------------------------------------Display Chinese ideograph;x_add is the x address;It has 4 layers,0,1,2,3; Width is the Chinese ideograph width;bmp is the table's name.-*/void DrawBmp_f(uchar x_add,uchar layer,uchar width,uchar *bmp) {unsigned char x;unsigned int i=0;for(x=x_add;x<x_add+width;x++) (if (x>127)(OutTI((x-128)|0x40);OutTI(layer|0xb8);OutTD(~bmp[i]);OutTI((x-128)|0x40);OutTI((layer|0xb8)+1);i++;OutTD(~bmp[i]);}else if (x>63)(OutSI((x-64)|0x40);OutSI(layer|0xb8);OutSD(~bmp[i]);OutSI((x-64)|0x40);OutSI((layer|0xb8)+1);i++;OutSD(~bmp[i]);}else(OutFI(x|0x40);OutFI(layer|0xb8);OutFD(~bmp[i]);OutFI(x|0x40);OutFI((layer|0xb8)+1);i++;OutFD(~bmp[i]);}i++;}}/*Display indention; x_add is the x address;It has 4 layers,0,1,2,3; Width is the Chinese ideograph width-*/void _DrawBmp_(uchar x_add,uchar layer,uchar width){unsigned char x;for(x=x_add;x<x_add+width;x++){if (x>127){OutTI((x-128)|0x40);OutTI(layer|0xb8);OutTD(0);OutTI((x-128)|0x40);OutTI((layer|0xb8)+1);OutTD(0);}else if (x>63){OutSI((x-64)|0x40);OutSI(layer|0xb8);OutSD(0);OutSI((x-64)|0x40);OutSI((layer|0xb8)+1);OutSD(0);}else{OutFI(x|0x40);OutFI(layer|0xb8);OutFD(0);OutFI(x|0x40);OutFI((layer|0xb8)+1);OutFD(0);/* --------------------------------------------------Display indention; x_add is the x address;It has 4 layers,0,1,2,3; Width is the Chinese ideograph width-*/void _DrawBmp_black(uchar x_add,uchar layer,uchar width){unsigned char x;for(x=x_add;x<x_add+width;x++){if (x>127){OutTI((x-128)|0x40);OutTI(layer|0xb8);OutTD(0xff);OutTI((x-128)|0x40);OutTI((layer|0xb8)+1);OutTD(0xff);}else if (x>63){OutSI((x-64)|0x40);OutSI(layer|0xb8);OutSD(0xff);OutSI((x-64)|0x40);OutSI((layer|0xb8)+1);OutSD(0xff);}else{OutFI(x|0x40);OutFI(layer|0xb8);OutFD(0xff);}}OutFI(x|0x40);OutFI((layer|0xb8)+1);OutFD(0xff);}}}/* --------------------------------------------------Display the line display_data_graph is the display graph data-*/void _DrawBmp_line(uchar x_add,uchar layer,uchar width,uchar display_data_graph) {unsigned char x;unsigned int i=0;for(x=x_add;x<x_add+width;x++){if (x>127){OutTI((x-128)|0x40);OutTI(layer|0xb8);OutTD(display_data_graph);}else if (x>63){OutSI((x-64)|0x40);OutSI(layer|0xb8);OutSD(display_data_graph);}else{OutFI(x|0x40);OutFI(layer|0xb8);OutFD(display_data_graph);}i++;/*Display the column display_data_graph is the display graph data-*/void _DrawBmp_column(uchar x,uchar width) {unsigned int i=0;if (x>127){for(i=0;i<width;i++){OutTI((x-128)|0x40);OutTI(i|0xb8);OutTD(0xff);}}else if (x>63){for(i=0;i<width;i++){OutSI((x-64)|0x40);OutSI(i|0xb8);OutSD(0xff);}}else{for(i=0;i<width;i++){OutFI(x|0x40);OutFI(i|0xb8);OutFD(0xff);}}}}}。
液晶显示模块VPG19264在单片机系统中的应用
Special Repo特r别t报 道
显示技术
VPG19264 的硬件电路连接方法。
LJMP S_UP;向上移动子程序
SJMP ¥
显示系统的软件设计
;====中文演示显示程序段 ====
采用MCS-51系列汇编指令编制而
DISCHA: MOV R1,#00H
成。该系统的硬件连接采用间接方式
MOV ZI, #03
TAB2:DB 00H, 01H, 0 2H, 03H,
最后由程序再逐字节向图形区的相应 04H, 05H, 06H, 07H, 08H, 09H, 0AH,
单元写入汉字模值,从而得到所需的 0BH, 0CH
显示效果。
; 初始化子程序INT
下面给出用 VPG19264 进行显示
INT: MOV COM,#0C0H; 设置显
VPG19264 的 20 个管脚定义如表 2 所 示。
¥ 模块使用的注 意事项
表1 片选信号组合
模块中的控制驱动电路是低压微 功耗的 CMOS 电路,极易被静电击穿, 是一种不可修复的损坏,而人体有时 会产生高达几十伏或上百伏的高压静 电,所以在操作装配以及使用中都应 极其小心严防静电。
液晶模块可选用带背光的型号。 大部分为 LED 背光方式供电的电源为 3.8~4.3V直流电源,严格限制5V 电源 直接供电,否则不仅会增加功耗,更会 增加损坏背光灯的可能性,缩短液晶模 块的使用寿命,推荐电压小于等于4.1V。
点,系统集成商可以更快将产品推出
另外采用该协议还可为系统添加
市场。相对于需要为 8 位及 10 位平面 全新功能,如美国国家半导体的线路
显示器构思不同系统结构的厂商来说, 延迟补偿功能可以分别为每一列驱动
stm32的19264程序
#ifndef __LCD_19264_H#define __LCD_19264_H#include "stm32f10x_lib.h"#define PORTCONTROL GPIOB#define PORTDA TA GPIOC#define GPIO_Pin_BUSY GPIO_Pin_0#define GPIO_Pin_REQ GPIO_Pin_1#define GPIO_Pin_RESET GPIO_Pin_5#define WRITE_CHN 0xf0 //写国标汉字#define WRITE_CHA0xf1 //写8X8 ASCII字符#define WRITE_CHAR 0xf9 //写8X16 ASCII字符#define WRITE_WEI 0xf2 //写位点阵#define WRITE_ZIJIE 0xf3 //写字节点阵#define UP 0xf5 //上移#define DOWN 0xf6 //下移#define LEFT 0xf7 //左移#define RIGHT 0xf8 //右移#define FANBAI 0xfa //反白功能#define CLR_SCREEN 0xf4 //清屏/* Private function prototypes -----------------------------------------------*/void LCD_Init(void);void LCD_Write_Data(u8 dat);void LCD_Write_Cmd(u8 comm,u8 addr_x,u8 addr_y);void Disp_China(u8 *chn,u8 addr_x,u8 addr_y,u8 row,u8 line);void Disp_Chr(u8 *chr,u8 addr_x,u8 addr_y,u8 row,u8 line);void Disp_wei(u8 addr_x,u8 addr_y,u8 row,u8 line);void Coordinate_axis(void);void Disp_differevalue(u8 *amp,u8 *freq);void Delay(vu32 nCount);#endif---------------------------------------------------------------------------------------------------------------------- #include "LCD_19264.h"#include "stm32f10x_lib.h"u8 Freq[] = "频率:";u8 Amp[] = "幅度:";u8 Power[] = "总功率:";u8 Power_value[] = "w";u8 Freq_value[] = "k";u8 Amp_value[] = "v";u8 zero[] = "0";u8 X_axis[] = "Hz";u8 Y_axis[] = "v";u8 addr_x = 14;u8 addr_y;u8 j;u8 number = 0;u8 number1[] = "0123456789";u8 unit,decade;extern u8 i;void LCD_Init(void){GPIO_WriteBit(PORTCONTROL,GPIO_Pin_REQ,Bit_RESET);GPIO_WriteBit(PORTCONTROL,GPIO_Pin_RESET,Bit_SET);}void LCD_Write_Data(u8 dat){/*---------查忙信号-----------*/while(GPIO_ReadInputDataBit(PORTCONTROL,GPIO_Pin_BUSY) == 1); GPIO_Write(PORTDA TA, dat);Delay(10);GPIO_WriteBit(PORTCONTROL,GPIO_Pin_REQ,Bit_SET);while(GPIO_ReadInputDataBit(PORTCONTROL,GPIO_Pin_BUSY) == 0) Delay(40);GPIO_WriteBit(PORTCONTROL,GPIO_Pin_REQ,Bit_RESET);}/*------------写命令或数据到LCD--------------*/void LCD_Write_Cmd(u8 comm,u8 addr_x,u8 addr_y){LCD_Write_Data(comm); //写命令LCD_Write_Data(addr_x); //写入X起始坐标LCD_Write_Data(addr_y); //写入Y起始坐标}/*--------------显示中文------------------*/void Disp_China(u8 *chn,u8 addr_x,u8 addr_y,u8 row,u8 line){u8 i=0,j=0;for(j=addr_y;j<line+addr_y;j++){for(i=addr_x;i<row+addr_x;i++){LCD_Write_Cmd(WRITE_CHN,i,j);LCD_Write_Data(chn[(j-addr_y)*row*2+(i-addr_x)*2]-0xa0);LCD_Write_Data(chn[(j-addr_y)*row*2+(i-addr_x)*2+1]-0xa0);}}}/*--------------显示8*8 ASCII字符------------------*/void Disp_Chr(u8 *chr,u8 addr_x,u8 addr_y,u8 row,u8 line) //*chr:指向数组的首地址,xy:起始坐标,row:行坐标,line:列坐标{u8 i,j,k;k=0x00;for(i=addr_x;i<row+addr_x;i++){for(j=addr_y;j<line+addr_y;j++){LCD_Write_Cmd(WRITE_CHA, i,k+j/2);LCD_Write_Data(chr[(i-addr_x)+(j-addr_y)]);k=k+0x08;if (k==0x08*line)k=0x00;}}}/*--------------------------显示位点--------------------*/void Disp_wei(u8 addr_x,u8 addr_y,u8 row,u8 line)//xy:起始坐标,row:行坐标,line:列坐标{u8 i,j;for(i=addr_x;i<row+addr_x;i++){for(j=addr_y;j<line+addr_y;j++){LCD_Write_Cmd(WRITE_WEI, i,j);}}}/*--------------------------建立坐标轴--------------------------*/void Coordinate_axis(void){/*建立y轴------------------*/Disp_wei(50,5,1,48);/*建立y轴箭头-------------*/Disp_wei(49,6,3,1);Disp_wei(48,7,5,1);/*建立x轴------------------*/Disp_wei(50,53,136,1);/*建立x轴箭头----------------*/Disp_wei(184,52,1,3);Disp_wei(183,51,1,5);/*确定零点坐标----------------*/Disp_Chr(zero,6,110,1,1);/*x轴单位---------------------*/Disp_Chr(X_axis,22,112,2,1);/*y轴单位---------------------*/Disp_Chr(Y_axis,7,0,1,1);/*建立频率值输入框-------------------------*/Disp_China(Freq,0,2,3,1);/*建立幅度值输入框-------------------------*/Disp_China(Amp,0,0,3,1);/*建立总功率值输入框-----------------------*/Disp_China(Power,20,0,4,1);/*显示幅度值和频率值----------------------*/Disp_Chr(Amp_value,5,42,1,1);Disp_Chr(Freq_value,5,100,1,1);Disp_Chr(Power_value,20,10,1,1);}/*----------------------对不同幅度值和频率进行显示------------------*/void Disp_differevalue(u8 *amp,u8 *freq){Disp_Chr(amp,0,42,3,1);Disp_Chr(freq,0,100,2,1);}/****************************************************************************** ** Function Name : Delay* Description : Inserts a delay time.* Input : nCount: specifies the delay time length.* Output : None* Return : None******************************************************************************* /void Delay(vu32 nCount){for(;nCount>0;nCount--); }。
19264 程序
/****************************************************************************** *************--------------------------------------------------------------------------------------**** 文件名:**** Copyright (c) 2010-2010 **xxx(中国)电子有限公司研发部**** 创建人: 酥蒸饼**** 日期: 2010.10.07**** 修改人: 酥蒸饼**** 日期: 2010.10.207**** 描述: LCD19264-1 ES-9116控板驱动头文件****** 版本: NO.1****--------------------------------------------------------------------------------------********************************************************************************* ***********/#ifndef _DIY_LCD19264_#define _DIY_LCD19264_#define uchar unsigned char#define uint unsigned int#define DATA_BUFFER P0sbit E=P2^3; //使能端sbit RS=P2^1; //指令数据选择端sbit RW=P2^2; //读写选择信号sbit RST=P2^6; //复位端sbit CS1=P2^7; //左屏片选sbit CS2=P2^5; //中屏片选sbit CS3=P2^4; //右屏片选/*unsigned char bdata Temp_Buffer; //接收字节sbit D_Buf0=Temp_Buffer^0; //Temp_Buffer第0位sbit D_Buf1=Temp_Buffer^1; //Temp_Buffer第1位sbit D_Buf2=Temp_Buffer^2;sbit D_Buf3=Temp_Buffer^3;sbit D_Buf4=Temp_Buffer^4;sbit D_Buf5=Temp_Buffer^5;sbit D_Buf6=Temp_Buffer^6;sbit D_Buf7=Temp_Buffer^7; //Temp_Buffer第7位0////////////////unsigned char bdata Temp_Buffer_1; //接收字节sbit Buf0=Temp_Buffer_1^0; //Temp_Buffer第0位sbit Buf1=Temp_Buffer_1^1; //Temp_Buffer第1位sbit Buf2=Temp_Buffer_1^2;sbit Buf3=Temp_Buffer_1^3;sbit Buf4=Temp_Buffer_1^4;sbit Buf5=Temp_Buffer_1^5;sbit Buf6=Temp_Buffer_1^6;sbit Buf7=Temp_Buffer_1^7; //Temp_Buffer第7位0 *//****************************************************************************** ****************-------------------------------------------------------------------------------------------** 函数名:lcd_busy()** 输入:** 输出:** 功能描述:忙检测** 全局变量:** 调用模块:** 日期:**-------------------------------------------------------------------------------------------******************************************************************************* **************/void lcd_busy(void) //Read State Data function{P0=0Xff;RS=0;RW=1; //读状态条件E=1;// _nop_();while(DATA_BUFFER&0x80); //busy位// _nop_();E=0;}/****************************************************************************** ****************-------------------------------------------------------------------------------------------** 函数名: uchar rd_lcd_data()** 输入:** 输出: RAM数据** 功能描述: 读操作,读液晶屏RAM数据** 全局变量:** 调用模块:** 日期:**-------------------------------------------------------------------------------------------******************************************************************************* **************/uchar rd_lcd_data() //Read Display Data function{uchar temp_data;lcd_busy();RS=1;RW=1; //读用户数据条件P0=0xff; //51端口想输入时先拉高E=1;//_nop_();//_nop_(); //指该操作有效,即当E=1时,液晶模块数据的数据读到总线上。
19264液晶完整驱动程序 带字库st7920芯片驱动
void SendStringTo19264(u8 bit,u8 select,u8 data);
void Init_19264();
void screen_chear();
void display_chinese(u8 hang,u8 lie,u8 *array);
_delay_ms(3);
}
//------------------清屏JM12864---------------------
void screen_chear()
{
SendStringTo19264(upscreen,0,0x01);
SendStringTo19264(downscreen,0,0x01);
SendStringTo19264(upscreen,0,0x30); //使能基本指令 8位数据格式(在XY12864中)
//001DL X RE XX
/* DL=1,8位MPU接口;DL=0,4位MPU接口
RE=1,扩充指令集;RE=0,基本指令集
同一指令的动作不能同时改变DL和RE,需先改变DL再改变RE才能确保设置正确*/
SendStringTo19264(downscreen,0,0x30);
#define pin_19264data PINB&(1<<hf19264_data)
//--------------------------------------------------------
#define upscreen 1
#define downscreen 0
51单片机+19264程序
#include <reg52.h>#include"zifuku.h"#define uint unsigned int#define uchar unsigned char#define disp_off 0x3e#define disp_on 0x3f#define disp_x 0xb8#define disp_z 0xc0#define disp_y 0x40#define comm 0#define dat 1#define data_ora P1 //MCU 2<------> LCM#define data P1 /////////////数据传输口////sbit di=P2^0; ///////////////////////////sbit rw=P2^1; ////////////////////读写///sbit e=P2^2; //////使能,高电平有效/////sbit cs1=P2^3; /////////////////////////sbit cs2=P2^4; ///片选端///////////////sbit cs3=P2^5; ///////////////////////sbit rst=P2^6; ////////////复位///////*---------------延时子程序----------------*/void delay (uint us){while(us--);}void delay1 (uint ms){uint i,j;for(i=0;i<ms;i++)for(j=0;j<1000;j++);}/*------------写数据或命令到LCD--------------*/void wr_lcd (uchar dat_comm,uchar content){di=dat_comm;rw=0;data_ora=content;e=1;;e=0;}/*--------------写点阵------------------*/void lat_disp (uchar data1,uchar data2){uchar i,j;cs1=1;cs2=1;cs3=1;wr_lcd (comm,disp_on);for(j=0;j<8;j++){wr_lcd (comm,disp_x+j);wr_lcd (comm,disp_z);wr_lcd (comm,disp_y);for(i=0;i<64;i++){wr_lcd (dat,data1);wr_lcd (dat,data2);}}}void vshowcustomrow(uchar ucpage,uchar ucline,uchar width,uchar *uca) {uchar count;if(ucline<64){cs1=1;cs2=0;cs3=0;wr_lcd(comm,0xb8+ucpage);wr_lcd(comm,0x40+ucline);for(count=0;count<width;count++) wr_lcd(dat,*(uca+count));}else{cs1=0;cs2=1;cs3=0;wr_lcd(comm,0xb8+ucpage);wr_lcd(comm,0x40+ucline-64);for(count=0;count<width;count++) wr_lcd(dat,*(uca+count)); }if(ucline>127){cs1=0;cs2=0;cs3=1;wr_lcd(comm,0xb8+ucpage);wr_lcd(comm,0x40+ucline-128);for(count=0;count<width;count++) wr_lcd(dat,*(uca+count)); }}void vshowonechin(uchar ucpage,uchar ucline,uchar *uca){vshowcustomrow(ucpage,ucline ,16,uca);vshowcustomrow(ucpage+1,ucline,16,uca+16);}void vshowonechar(uchar ucpage,uchar ucline,uchar *uca){vshowcustomrow(ucpage,ucline,8,uca);vshowcustomrow(ucpage+1,ucline,8,uca+8);}/*------------------初始化-----------------*/void init_lcd (void){rst=0;delay(50);rst=1;cs1=1;cs2=1;cs3=1;wr_lcd (comm,disp_off);wr_lcd (comm,disp_on);}/*---------------显示1-----------------*/void disp1 (void){lat_disp(0x00,0x00);vshowonechin(0,0,uca_fan);vshowonechin(0,16,uca_bei);vshowonechin(0,32,uca_ke);vshowonechin(0,48,uca_ji);vshowonechin(0,64,uca_you); vshowonechin(0,80,uca_xian); vshowonechin(0,96,uca_gong); vshowonechin(0,112,uca_si); vshowonechin(0,128,uca_chen); vshowonechin(0,144,uca_li); vshowonechin(0,160,uca_li); vshowonechin(0,176,uca_zuo);vshowonechin(2,0,uca_da); vshowonechin(2,16,uca_bei); vshowonechin(2,32,uca_pai); vshowonechin(2,48,uca_ye); vshowonechin(2,64,uca_jing); vshowonechin(2,80,uca_xian1); vshowonechin(2,96,uca_shi); vshowonechin(2,112,uca_ping);vshowonechin(4,16,uca_huan); vshowonechin(4,32,uca_ying); vshowonechin(4,48,uca_ni); vshowonechin(4,64,uca_de); vshowonechin(4,80,uca_jia); vshowonechin(4,96,uca_meng);vshowonechar(6,0,uca_T); vshowonechar(6,8,uca_E); vshowonechar(6,16,uca_L); vshowonechar(6,24,uca_maohao);vshowonechar(6,32,uca_yi); vshowonechar(6,40,uca_san); vshowonechar(6,48,uca_ba); vshowonechar(6,56,uca_er); vshowonechar(6,64,uca_zero); vshowonechar(6,72,uca_er); vshowonechar(6,80,uca_ba); vshowonechar(6,88,uca_s); vshowonechar(6,96,uca_qi); vshowonechar(6,104,uca_san); vshowonechar(6,112,uca_liu);}/*------------------主程序--------------------*/void main (){init_lcd ();while (1){disp1();delay1(4000);}}#include<reg52.h>unsigned char code uca_fan[]={/*-- 文字: 樊--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x48,0x28,0xFF,0x28,0x02,0xAC,0x44,0xAA,0x00,0x48,0x28,0xFF,0x28,0x48,0x00, 0x02,0x42,0x42,0x23,0x22,0x12,0x0A,0x07,0x0A,0x12,0x22,0x62,0xC3,0x42,0x02,0x00, };unsigned char code uca_bei[]={/*-- 文字: 贝--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0xF2,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00, 0x00,0x40,0x40,0x27,0x20,0x10,0x08,0x07,0x08,0x10,0x10,0x27,0x60,0x00,0x00,0x00, };unsigned char code uca_ke[]={/*-- 文字: 科--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x12,0x92,0x72,0xFE,0x51,0x91,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00, 0x04,0x02,0x01,0x00,0xFF,0x00,0x04,0x04,0x04,0x02,0x02,0x02,0xFF,0x01,0x01,0x00, };unsigned char code uca_ji[]={/*-- 文字: 技--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x08,0x88,0xFF,0x48,0x28,0x00,0xC8,0x48,0x48,0x7F,0x48,0xC8,0x48,0x08,0x00,0x01,0x41,0x80,0x7F,0x00,0x40,0x40,0x20,0x13,0x0C,0x0C,0x12,0x21,0x60,0x20,0x00, };unsigned char code uca_you[]={/*-- 文字: 有--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0x84,0x44,0xE4,0x34,0x2C,0x27,0x24,0x24,0x24,0xE4,0x04,0x04,0x04,0x00,0x02,0x01,0x00,0x00,0xFF,0x09,0x09,0x09,0x29,0x49,0xC9,0x7F,0x00,0x00,0x00,0x00, };unsigned char code uca_xian[]={/*-- 文字: 限--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0xFE,0x02,0x32,0x4E,0x82,0x00,0xFE,0x4A,0xCA,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00, 0xFF,0x00,0x02,0x04,0x03,0x00,0xFF,0x40,0x20,0x03,0x0C,0x12,0x21,0x60,0x20,0x00, };unsigned char code uca_gong[]={/*-- 文字: 公--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x30,0x0E,0x84,0x00,0x00,0x0E,0x10,0x60,0xC0,0x80,0x80,0x00,0x00,0x01,0x20,0x70,0x28,0x24,0x23,0x31,0x10,0x10,0x14,0x78,0x30,0x01,0x00,0x00, };unsigned char code uca_si[]={/*-- 文字: 司--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x10,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x12,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x0F,0x00,0x20,0x40,0x3F,0x00,0x00, };unsigned char code uca_da[]={/*-- 文字: 大--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00, };unsigned char code uca_pai[]={/*-- 文字: 牌--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x90,0x90,0x9F,0x10,0x00,0xFE,0x92,0xD3,0xBE,0x92,0x92,0xFE,0x00,0x00, 0x40,0x3F,0x00,0x00,0x7F,0x04,0x04,0x06,0x05,0x04,0xFF,0x04,0x04,0x05,0x04,0x00, };unsigned char code uca_ye[]={/*-- 文字: 液--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x61,0x06,0xE0,0x18,0x84,0xE4,0x1C,0x84,0x65,0xBE,0x24,0xA4,0x64,0x04,0x00, 0x04,0x04,0xFF,0x00,0x01,0x00,0xFF,0x41,0x21,0x12,0x0C,0x1B,0x61,0xC0,0x40,0x00, };unsigned char code uca_jing[]={/*-- 文字: 晶--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00,0x00, 0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00, };unsigned char code uca_xian1[]={/*-- 文字: 显--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00, 0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00, };unsigned char code uca_shi[]={/*-- 文字: 示--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00,0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00, };unsigned char code uca_ping[]={/*-- 文字: 屏--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFF,0x09,0x49,0x59,0xE9,0x49,0x49,0x49,0xE9,0x59,0x49,0x4F,0x00,0x00, 0x40,0x30,0x0F,0x82,0x42,0x32,0x0F,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x00, };unsigned char code uca_huan[]={/*-- 文字: 欢--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00, 0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00, };unsigned char code uca_ying[]={/*-- 文字: 迎--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00, 0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00, };unsigned char code uca_ni[]={/*-- 文字: 你--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0xF0,0x2C,0x43,0x20,0x98,0x0F,0x0A,0xE8,0x08,0x88,0x28,0x1C,0x08,0x00, 0x00,0x00,0x7F,0x00,0x10,0x0C,0x03,0x21,0x40,0x3F,0x00,0x00,0x03,0x1C,0x08,0x00, };unsigned char code uca_de[]={/*-- 文字: 的--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00, 0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00, };unsigned char code uca_jia[]={/*-- 文字: 加--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x08,0x08,0x08,0xFF,0x08,0x08,0xF8,0x00,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00, 0x40,0x20,0x18,0x07,0x00,0x20,0x40,0x3F,0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00, };unsigned char code uca_meng[]={/*-- 文字: 盟--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x92,0x92,0x92,0xFE,0x00,0x80,0x7E,0x2A,0x2A,0x2A,0x2A,0xFE,0x00,0x00, 0x40,0x40,0x7C,0x44,0x44,0x7C,0x46,0x45,0x44,0x7C,0x44,0x45,0x7E,0x41,0x40,0x00, };unsigned char code uca_chen[]={/*-- 文字: 陈--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x22,0x52,0x8E,0x00,0xC4,0xB4,0x8C,0xE7,0x84,0x84,0x84,0x84,0x04,0x00, 0x00,0xFF,0x02,0x04,0x23,0x10,0x0C,0x40,0x80,0x7F,0x00,0x02,0x04,0x18,0x30,0x00, };unsigned char code uca_li[]={/*-- 文字: 莉--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x82,0x92,0x92,0x92,0xFF,0x92,0x92,0x82,0x02,0xEF,0x02,0x02,0xFA,0x02,0x00,0x20,0x10,0x08,0x04,0x03,0xFF,0x02,0x1C,0x08,0x00,0x1F,0x40,0x80,0x7F,0x00,0x00, };unsigned char code uca_zuo[]={/*-- 文字: 做--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x20,0xF8,0x07,0x8A,0x88,0xFF,0x88,0xC8,0x30,0xFF,0x12,0xF0,0x10,0x10,0x00, 0x00,0x00,0x7F,0x00,0x3F,0x08,0x08,0x48,0x5F,0x20,0x13,0x0C,0x13,0x70,0x20,0x00, };unsigned char code uca_T[]={/*-- 文字: T --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00, };unsigned char code uca_E[]={/*-- 文字: E --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00, };unsigned char code uca_L[]={/*-- 文字: L --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00, };unsigned char code uca_maohao[]={/*-- 文字: : --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, };unsigned char code uca_zero[]={/*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00, };unsigned char code uca_yi[]={/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, };unsigned char code uca_er[]={/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, };unsigned char code uca_san[]={/*-- 文字: 3 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, };unsigned char code uca_s[]={/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, };unsigned char code uca_wu[]={/*-- 文字: 5 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, };unsigned char code uca_liu[]={/*-- 文字: 6 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, };unsigned char code uca_qi[]={/*-- 文字: 7 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, };unsigned char code uca_ba[]={/*-- 文字: 8 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, };unsigned char code uca_qiu[]={/*-- 文字: 9 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00, };。
CH19264B液晶模块中文使用说明书
ST7920
子 LCD 偏压比
1/64duty, 1/9bias
航电 时序接口类型
■6800
■8080 □ I2C ■Serial
□SPI
川 背光类型
■ LED
□ CCFL
□ EL
□no Backlight
圳市 背光颜色
■Yellow-Green ■ White ■ Amber ■ Blue □ Red
制作 审核 批准
陈工
DATE DATE DATE
2010-10-23
=============================================================================
深圳市川航电子科技有限公司
公司地址:广东省深圳市宝安区西乡街道办宝安大道 3222 号贸发大厦 3 楼
最小值
典型值 最大值
单位
4.7
5.0
5.3
V
--
4.8
--
V
--
80
120
mA
0.7VDD
--
VDD
V
0
--
0.6
V
0.8VDD
--
VDD
V
0
--
0.4
V
65
80
85
Hz
司 项目 公 逻辑电压 有限 LCD 驱动电压 技 模块电流 子科 输入电压电大值 电 输入电压电小值 川航 输出电压电大值 市 输出电压电小值 深圳 频率
2.CH19264B 液晶模块的独特优势
司 2.1 可以选择在逻辑电压为 3.3V 环境下使用,但需要单独声明,特殊配置。 限公 2.2 支持固定对比度,但需要单独声明,特殊配置。 技有 2.3 可以选择使用 LCM 产品中温度补偿电路,但需要单独声明,特殊配置。 子科 2.4 可以使用逻辑电源点亮背光,但需要单独声明,特殊配置。 深圳市川航电 2.5 可由 PSB 脚选择并/串通迅方式,或者由液晶模块跳点选择。
STM32的LCD19264-12864经典程序
现在STM32越来越流行,在学校搞的很火,本人最近也在学习,做了一个LCD19264的程序,先与大家分享,多谢关注!本程序是有LCD12864该进的,液晶驱动为ST7920。
可以稍微改动即可用于12864一、以下是LCD19264头文件/////////////////////////////////////////////////////////////////////////////////******************************************************************** ************ 函数功能:STM32F103VET6 19264-1液晶显示,串---并口19264* 编写时间:2012.07.22* 作者:ZhouGanJin* 版本:V1.1* 液晶19264-1简介:并口不多说;串口引脚4根RW(SID),E1(CLK1),E2(CLK2),PSB=0, RS(CS)=1,* 通过预编译选择串并口方式********************************************************************* **********/#ifndef _LCD19264_H#define _LCD19264_H/* 端口定义---------------------------本程序只用了GPIOA-----------------------------------*//* 函数申明---------------------STM32配置和19264函数声明-------------------------------*/#define LCD_RS_H GPIO_SetBits(GPIOA, GPIO_Pin_0) //GPIOA->BSRR=GIOP_pin_0 #define LCD_RS_L GPIO_ResetBits(GPIOA, GPIO_Pin_0) //GPIOA->BRR=GIOP_pin_0#define LCD_RW_H GPIO_SetBits(GPIOA, GPIO_Pin_1)#define LCD_RW_L GPIO_ResetBits(GPIOA, GPIO_Pin_1)#define LCD_E1_H GPIO_SetBits(GPIOA, GPIO_Pin_2)#define LCD_E1_L GPIO_ResetBits(GPIOA, GPIO_Pin_2)#define LCD_E2_H GPIO_SetBits(GPIOA, GPIO_Pin_3)#define LCD_E2_L GPIO_ResetBits(GPIOA, GPIO_Pin_3)#define LCD_PSB_H GPIO_SetBits(GPIOA, GPIO_Pin_4)#define LCD_PSB_L GPIO_ResetBits(GPIOA, GPIO_Pin_4)#define LCD_DATA_PORT GPIOD#define LCD_DATA GPIOD->BSRR //BSRR高十六位是复位,低十六位是置位void Lcm_Wr_Dat(u8 wrdata,u8 enable); //写数据void Lcm_Wr_Com(u8 wrcommand,u8 enable); //写指令void Lcm_Rd_Status(u8 enable);//读忙状态void Lcm_Init(u8 enable); //液晶初始化void Lcm_GotoXY(u8 pos_X,u8 pos_y); //设定坐标void Lcm_SETXY(u8 pos_X,u8 pos_y,u8 enable);void Lcm_Disp_Char(u8 onechar,u8 enable);//显示单个字符void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable); //定坐标显示单个字符void Lcm_Disp_Str(u8 *string,u8 enable);//显示字符串void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable);//定坐标显示字符串void Delay_ms(u32 m);//1ms延时void Lcm_Delay(void);/*function all ------函数定义-------------以下函数包含19264液晶的串并行方式----------------------------------------*/#define PSB_SERIAL 0#ifdef PSB_SERIAL// -------以下为串口函数-------- serial transmission------/////-----------传送8bits 数据----void Send_byte(u8 bbyte,u8 enable){u8 i;for(i=0;i<8;i++){LCD_E1_L; LCD_E2_L;if(0x80&bbyte) LCD_RW_H; //SID=1;else LCD_RW_L;if(!enable) //CLK = 01 ; 串行用下降沿{LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}bbyte<<=1;Lcm_Delay(); //?}}//-----------写指令函数----void Lcm_Wr_Com(u8 wcomd,u8 enable){Lcm_Delay();Send_byte(0xf8,enable); //1111_1,RW(0),RS(0),0 -----------指令Send_byte(0xf0&wcomd,enable); //high 4bitsSend_byte(0xf8&(wcomd<<4),enable); //low 4bits}//-----------写数据函数----void Lcm_Wr_Dat(u8 wdata,u8 enable){Lcm_Delay();Send_byte(0xfa,enable); //1111_1,RW(0),RS(1),0 ---------数据Send_byte(0xf0&wdata,enable); //high 4bitsSend_byte(0xf8&(wdata<<4),enable); //low 4bits}#else// -------以下为并口函数-------- parallel Transmission-------/// //---------读忙函数----------------void Lcm_Rd_Status(u8 enable){u16 getd;while(1){Lcm_Delay();LCD_RS_L; //命令LCD_RW_H; //读取Lcm_Delay();//LCD_DATA=0xFFFF0000; //LCD_DATA=0xFF; 高16位为复位,即写入0使其不忙GPIO_Write(LCD_DATA_PORT, 0XFFFF) ; //准备读取数据, 写0x0000则与上相同Lcm_Delay();if(!enable){LCD_E1_L;Lcm_Delay();LCD_E1_H;getd=GPIO_ReadInputData(LCD_DATA_PORT);if((getd&0x0080)==0)break;}else{LCD_E2_L;Lcm_Delay();LCD_E2_H;if((getd&0x0080)==0)break;}}}//-----写指令----------------void Lcm_Wr_Com(u8 wcomd,u8 enable){Lcm_Rd_Status(enable);Lcm_Delay();LCD_RS_L;Lcm_Delay();LCD_RW_L;Lcm_Delay();LCD_DATA=wcomd|(~wcomd<<16); //Lcm_Delay();if(!enable){LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}// Lcm_Delay();}//------写数据----------------void Lcm_Wr_Dat(u8 wdata,u8 enable) {Lcm_Rd_Status(enable);Lcm_Delay();LCD_RS_H;Lcm_Delay();LCD_RW_L;Lcm_Delay();LCD_DATA=wdata|(~wdata<<16);Lcm_Delay();if(!enable){LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}}#endif//----选定坐标,全屏选择---------- void Lcm_GotoXY(u8 pos_x,u8 pos_y) {u8 addr;if((pos_x>11)||(pos_y>1))return;if(pos_y==0)addr=0x80+pos_x;else if(pos_y==1)addr=0x90+pos_x;Lcm_Wr_Com(addr,0);//设定DDRAM地址Lcm_Wr_Com(addr,1);//设定DDRAM地址}//---选定坐标,分屏选择------------void Lcm_SETXY(u8 pos_x,u8 pos_y,u8 enable){u8 addr;if((pos_x>11)||(pos_y>1))return;if(pos_y==0)addr=0x80+pos_x;else if(pos_y==1)addr=0x90+pos_x;if(enable==0)Lcm_Wr_Com(addr,0);//设定DDRAM地址elseLcm_Wr_Com(addr,1);//设定DDRAM地址}//----------初始化----------------void Lcm_Init(u8 enable){#ifdef PSB_SERIALLCD_PSB_L; //选择串口#elseLCD_PSB_H; //选择并口#endifLcm_Wr_Com(0x30,enable);Delay_ms(2);Lcm_Wr_Com(0x30,enable);Delay_ms(2);Lcm_Wr_Com(0x0c,enable); //开显示及光标设置Delay_ms(2);Lcm_Wr_Com(0x01,enable); //显示清屏Delay_ms(3);Lcm_Wr_Com(0x06,enable); //显示光标移动设置Delay_ms(3);}/*--------- display function----------以下为各种显示函数---------------------------------------*/void Lcm_Disp_Char(u8 onechar,u8 enable)//显示单个字符{Lcm_Wr_Dat(onechar,enable);}void Lcm_Disp_Str(u8 *strings,u8 enable)//显示字符串{while(*strings != '\0')Lcm_Wr_Dat(*strings++,enable);Lcm_Wr_Dat('\0',enable);}void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable) //指定坐标显示字符{Lcm_GotoXY(x, y);Lcm_Wr_Dat(ch,enable);}void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable)//指定坐标显示字符串{Lcm_GotoXY(x, y);while(*strings != '\0')Lcm_Wr_Dat(*strings++,enable);Lcm_Wr_Dat('\0',enable);}二、以下是STM32配置函数/* 函数申明---------------------STM32配置和19264函数声明-------------------------------*/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void WWDG_Configuration(void);/********************************************************************** ************* 函数名称:RCC_Configuration(void)** 函数功能:时钟初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/GPIO_InitTypeDef GPIO_InitStructure;ErrorStatus HSEStartUpStatus;void RCC_Configuration(void){/* RCC system reset(for debug purpose) */RCC_DeInit();/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){/* HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* PCLK1 = HCLK/2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* Flash 2 wait state */FLASH_SetLatency(FLASH_Latency_2);/* Enable Prefetch Buffer */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* PLLCLK = 8MHz * 9 = 72 MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* Enable PLL */RCC_PLLCmd(ENABLE);/* Wait till PLL is ready */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* Select PLL as system clock source */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* Wait till PLL is used as system clock source */while(RCC_GetSYSCLKSource() != 0x08){}}}/********************************************************************** ************* 函数名称:GPIO_Configuration(void)** 函数功能:端口初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/void GPIO_Configuration(void){//定义端口结构体GPIO_InitTypeDef GPIO_InitStructure;//将GPIOA端口使能有效RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | //GPIOAGPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_11 |GPIO_Pin_12 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); // 选择A端口}/********************************************************************** ************* 函数名称:NVIC_Configuration(void)** 函数功能:中断初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_Init(&NVIC_InitStructure);}/******************************************************************************** *函数功能:延时函数/*--- Delay function-----------------延时函数定义********************************************************************* ************///------1ms延时------------void Delay_ms(u32 m){u32 i;for(; m != 0; m--)for (i=0; i<25000; i++); //clk=50MHz ,25_000000 分频得1s,25000分频得1ms}//---------液晶延时----------void Lcm_Delay(void){u8 j,i=100;while(i--){for(j=0;j<100;j++){;}}}#endif/*************结束***************/。
LCD12864液晶显示器C51单片机子程序
#include <reg52.h>#ifndef __LCD12864_H__#define __LCD12864_H__#include <intrins.h>#define uchar unsigned char#define uint unsigned int/*端口定义*/#define LCD_data P0 //数据口sbit LCD_RS = P2^7; //寄存器选择输入sbit LCD_RW = P2^6; //液晶读/写控制sbit LCD_EN = P2^5; //液晶使能控制sbit LCD_PSB = P1^4; //串/并方式控制#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};/* 延时函数*/void delay1(int ms){while(ms--){uchar i;for(i=0;i<250;i++){_nop_();_nop_();_nop_();_nop_();}}}/*检查LCD忙状态*/ /*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/ bit lcd_busy(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN = 0;return(result);/*写指令到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/ void lcd_wcmd(uchar cmd){//while(lcd_busy());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}/*写数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。
19264A使用说明书
4. 页面地址设置《Set page(X address)》
格式 1 0 1 1 1 P2 P1 P0 该指令设置了页面地址----X 地址寄存器的内容。KS0108 将显示存储器分成了 8 页, 指令代码中 P2~P0 就是要确定当前所要选择的页面地址,取值范围为 0~7H,代表第 1~8 页。该指令规定了以后的读/写操作将在哪一个页面上进行。
31 30 29 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0
40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21
51系列单片机
RS R/W E CS1 CS2 CS3 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7
项目
符号
最小值
最大值
单位
E 周期时间
Tcyc
1000
-
nS
E 高电平宽度
Pweh
450
-
nS
E 低电平宽度
Pwel
450
-
nS
E 上升时间
Tr
-
25
nS
E 下降时间
Tf
-
25
nS
地建立时间
Tas
140
-
nS
地址保持时间
Tah
10
-
nS
4
数据建立时间 数据延时时间 数据保持时间(写) 数据保持时间(读)
/CS1 /RST /CS2 /CS3 VOUT LEDA
功能说明
电源地 电源输入(+5V) LCD 驱动电压输入端(对比度调节) 寄存器选择端 H:数据寄存器;L:命令寄存器 读/写信号 使能信号 数据总线 片选信号 1,低有效,选择左屏 复位信号,低有效 片选信号 2,低有效,选择中屏 片选信号 3,低有效,选择右屏 负压输入输出端 背光正极
51单片机汇编程序范例
51单片机汇编程序范例(总14页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。
程序可见:中的HEX2BCD子程序。
.说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。
做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。
但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。
上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。
.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。
为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的1/4!.近来,在网上发现了一个链接:,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。
这篇文章提到的程序,一直也没有找到,也难辩真假。
这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。
比如说文中提到的:“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。
51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。
.下面说说做而论道的编程思路。
;-----------------------------------------------------------------------;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。
点阵LCD19264程序
{
while(us--);
}
void delay1 (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<1000;j++)
;
}
void delaynop(){
;
}
/*-----------检查忙标志---------------*/
delaynop();
delaynop();
PTBD_PTBD7=0;
}while(busy);
}
/*------------写数据或命令到LCD--------------*/
void wr_lcd (uchar content)
{
//CheckBusy();
PTBD_PTBD6=0; //rw写选择
PTBD_PTBD4=0;//rs数据1 指令0 选择
delaynop();
delaynop();
PTCD =content; //并行数据
PTBD_PTBD5= (content>>6);
PTBD_PTBD7=1; // E使能
{
PTAD_PTAD3=1;
PTAD_PTAD1=1;
PTAD_PTAD0=0;
wr_lcd(disp_x+ucpage);
wr_lcd(disp_z);
wr_lcd(disp_y+ucline-128);
for(count=0;count<width;count++) wr_date(*(uca+count));
TG19264A使用手册
利用 STATUS READ 指令,可以将 BF 读到 DB7 总线,从检验模块之工作状态。
4.显示控制触发器 DFF
此触发器是用于模块屏幕显示开和关的控制。DFF=1 为开显示(DISPLAY OFF),DDRAM
的内容就显示在屏幕上,DFF=0 为关显示(DISPLAY OFF)。
DDF 的状态是指令 DISPLAY ON/OFF 和 RST 信号控制的。
Z 地址计数器是一个 6 位计数器,此计数器具备循环记数功能,它是用于显示行扫描同
步。当一行扫描完成,此地址计数器自动加 1,指向下一行扫描数据,RST 复位后 Z 地址计
数器为 0。
Z 地址计数器可以用指令 DISPLAY START LINE 预置。因此,显示屏幕的起始行就由此指
令控制,即 DDRAM 的数据从哪一行开始显示在屏幕的第一行。此模块的 DDRAM 共 64 行,屏
幕可以循环滚动显示 64 行。
四.模块的外部接口
外部接口信号如下表 2 所示:
表2
管脚号
管脚名称
LEVER
管脚功能描述
1
VSS
0
电源地
2
VDD
5.0V
电源电压
3
VEE
5.0V∽-13V 液晶显示器驱动电压
4
D/I
H/L
D/I=“H”,表示 DB7∽DB0 为显示数据
D/I=“L”,表示 DB7∽DB0 为显示指令数据
5
R/W
6
E
H/L
R/W=“H”,E=“H”数据被读到 DB7∽DB0
R/W=“L”,E=“H→L”数据被写到 IR 或 DR
H/L
R/W=“L”,E 信号下降沿锁存 DB7∽DB0
液晶(LCD)显示程序
************************************************************* 功能:液晶(LCD)显示程序;LCD: TRULY M19264-5A1 192*64点阵驱动器: S6B0108/S6B0107或HD61202及相兼容驱动器MPU: AT89S51开发环境: KEIL C51作者:纪长城日期: 2005年10月************************************************************/ #include <AT89X51.H>#include <ZKDot.h>#define DISP_OFF 0X3E //关闭显示#define DISP_ON 0X3F //打开显示#define START_ROW 0xC0 //设置起始行#define FIRST_PAGE 0xB8 //设置页#define START_YADD 0x40 //设置列/*----------------------------------------MPU端口定义----------------------------------------*/#define LCD_PORT P0#define LCD_RESET P2_2#define LCD_CSA P2_3#define LCD_CSB P2_4#define LCD_RS P2_5#define LCD_RW P2_6#define LCD_E P2_7/*------------------------------------------LCD的区选择程序:F为要选通的区,取值为0,1,2,对应选中三个区,取其它值选中第三个区--------------------------------------------*/void LCD_CSAB_SET(unsigned char block){if(0==block) //0 选择第一区{LCD_CSA=0;LCD_CSB=0;}else if(1==block) //1 选择第二区{LCD_CSA=0;LCD_CSB=1;}else //2 选择第三区{LCD_CSA=1;LCD_CSB=0;}}/*---------------------------------------//延时子程序----------------------------------------*/void Delay_xMs(unsigned int xMs){unsigned int i,j;for(i=0;i<xMs;i++)for(j=0;j<500;j++);}/*---------------------------------------向LCD中写入指令或指令,F=0 是指令,F=1是数据,bkock是选择写入哪个区 ---------------------------------------*/void LCD_Write( unsigned char Com,bit F){LCD_PORT = Com; //把数据输出LCD_RS = F; //确定是数据还是指令LCD_RW = 0;LCD_E = 1;LCD_E = 0; //电平下降沿数据写入控制器}/*----------------------------------------------坐标定位程序参数XPage 定位页取值0--7 共8页Y 横向定位取值0-191 共192列-----------------------------------------------*/ void LCD_XY_SET(unsigned char X,unsigned char YPage) {if(X<64) //在第一个区中{LCD_CSAB_SET(0);LCD_Write(FIRST_PAGE|YPage,0);LCD_Write(START_YADD|X,0);}else if(X<128) //在第二个区中{LCD_CSAB_SET(1);LCD_Write(FIRST_PAGE|YPage,0);LCD_Write(START_YADD|X-64,0);}else if(X<192) //在第三个区中{LCD_CSAB_SET(2);LCD_Write(FIRST_PAGE|YPage,0);LCD_Write(START_YADD|X-128,0);}}/*--------------------------------------------清除一行的子程序 H是要清的页,取值0-3--------------------------------------------*/void LCD_Clear_H(unsigned char H){unsigned char i,j,k;for (k=0;k<2;k++)for (i=0;i<3;i++){LCD_XY_SET(i*64,H*2+k);for(j=0;j<64;j++) LCD_Write(0x00,1);}}/*----------------------------------------LCD初始化程序----------------------------------------*/void LCD_Init(void){unsigned char i;LCD_E = 0;LCD_RW = 1;LCD_RS = 0;LCD_RESET= 0; //液晶模块复位Delay_xMs(10); //等待10mSLCD_RESET= 1; //液晶结束复位电平LCD_CSAB_SET(0);LCD_Write(DISP_ON,0); //模块1显示开LCD_CSAB_SET(1);LCD_Write(DISP_ON,0); //模块2显示开LCD_CSAB_SET(2);LCD_Write(DISP_ON,0); //模块3显示开for (i=0;i<4;i++) LCD_Clear_H(i); //清屏}/*----------------------------------------读display RAM---------------------------------------*/unsigned char LCD_READ_RAM(unsigned char x,unsigned char y) {unsigned char temp;LCD_XY_SET(x,y);LCD_RW = 1; //设置为读数据LCD_RS = 1;LCD_PORT =0XFF; //设置总线为高电平(空)LCD_E = 0;LCD_E = 1;temp =LCD_PORT;LCD_E =0;return temp;}/*------------------------------------------设制起始行,参数line为要起始的行,取值范围0--63,block 为要设置的块-----------------------------------------*/void LCD_LINE_SET(unsigned char line){unsigned char i;for (i=0;i<3;i++){LCD_CSAB_SET(i);LCD_Write(START_ROW|line,0);}}/*----------------------------------------------显示一个16*8的ASCII的程序 ,参数是ascii码值,x取值0-191,y取值0-3 只能显示四行------------------------------------------------*/bit LCD_PRINT_ASCII_1608(unsigned char ascii,unsigned char x,unsigned char y) {unsigned char i,j;if((x+8)>191)return 1;for(j=0;j<2;j++)for(i=j;i<16;i+=2){LCD_XY_SET(x+(i>>1),y*2+j);LCD_Write(AsciiDotBig[(ascii-0x20)*16+i],1);}return 0;}/*-------------------------------------------------查找汉字程序参数是内码的高8位与低8位---------------------------------------------------*/unsigned char LCD_SEARCH_HZ16(unsigned char h,unsigned char l){unsigned char i;for(i=0;i<17;i++)if(HZ[i].Index[0]==h&&HZ[i].Index[1]==l) return i;}/*----------------------------------------------------16点阵的汉字显示程序----------------------------------------------------*/bit LCD_PRINT_HZ16(unsigned char wz,unsigned char x,unsigned char y) {unsigned char i,j;if((x+16)>192) return 1;for(j=0;j<2;j++)for(i=0;i<16;i++){LCD_XY_SET(x+i,y*2+j);LCD_Write(HZ[wz].Msk[i+(16*j)],1);}return 0;}/*--------------------------------------------点操作函数,参数,X/Y,取值为192/64 F 0-1,0是画点,1是取消点---------------------------------------*/void LCD_POINT(unsigned char X,unsigned char Y,bit F){unsigned char i,j,k;i=Y&&0xF8;//i是X/8的余数Y>>=3; //x是X/8的商j=LCD_READ_RAM(X,Y);//空读操作j=LCD_READ_RAM(X,Y);//读出8位数据LCD_XY_SET(X,Y);k=1<<i;if(F){k=~k;LCD_Write(j&k,1);}elseLCD_Write(j|k,1);}/*----------------------------------------------- 显示图像的一个例子---------------------------------------------*/ void LCD_TU(void){unsigned char i,j;for(i=0;i<6;i++)for(j=0;j<100;j++){LCD_XY_SET(j,i);LCD_Write(TP[i*100+j],1);}}/*---------------------------------------------测试主函数-------------------------------------------------*/ main(){unsigned char i,j,k,m;unsigned char code c[]="我老婆最可爱最漂亮的";LCD_Init();LCD_TU();for(i=0;i<18;i+=2){m=LCD_SEARCH_HZ16(c[i],c[i+1]); LCD_PRINT_HZ16(m,i*8,3);}while(1){for(i=0;i<64;i++){LCD_LINE_SET(i);if(i==0)Delay_xMs(500); //等待elseDelay_xMs(20); //等待}}}。
OCM19264液晶屏显示程序
ASCII_dispL(6,48,maohao);
hz_dispR(2,0,ci);
hz_dispR(2,16,shu);
ASCII_dispR(2,32,maohao);
hz_dispR(4,0,ci);
hz_dispR(4,16,shu);
ASCII_dispR(4,32,maohao);
hz_dispR(6,0,ci);
hz_dispR(6,16,shu);
ASCII_dispR(6,32,maohao);
}
uchar code yu[]={
/*--汉字:语--*/
0x40,0x42,0xCC,0x80,0x82,0x92,0xF2,0x9E,0x92,0x92,0x92,0xFA,0x93,0xC2,0x80,0x00,
{
unsigned char j,i;
for(j=0;j<2;j++)
{
WriteCommandM(Page_Add+page+j); //设定页
for(i=0;i<8;i++)
{
WriteCommandM(Col_Add+col+i);//设定列
WriteData(hzk[8*j+i]);
}
}
}
void ASCII_dispR(unsigned char page,unsigned char col, unsigned char code *hzk)//
/***************************/
/*检查Busy */
/***************************/
可以直接显示汉字的19264液晶驱动C语言程序
注:本程序是经过KEIL编译通过,并通过实验板测试通过的,直接按硬件电路连接好显示屏然后将程序代码烧写入单片机即可点亮,将显示武汉2 字,并且随意设置坐标,就可以在不同的位置显示,使用很方便。
如果不能显示请将软件中的接口定义按照本电路图中的定义修改一下即可。
19264液晶显示屏的硬件连接图本人修改过的19264液晶驱动程序C51 示例.//***********硬件的连接*******************//RS=P3.0 R/W=P3.1 E=P3.2 CS1=P3.3 CS2=P3.4 CS3=P3.5 HZ=12M DB0-D7=P1.0-P1.7 Reset=InBosrd//***********************************************#include <REGX51.H>#include <stdlib.H>#include <intrins.H>#include <stdio.H>//****************引脚定义***********************sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;sbit CSL=P2^3;sbit CSM=P2^4;sbit CSR=P2^5;sbit LED=P2^6;#define Col_Add 0x40 ///Y地址#define Page_Add 0xb8char code wu[]={/*-- 文字: 武--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x14,0x14,0x14,0xD4,0x14,0x14,0x10,0x7F,0x90,0x12,0x14,0x10,0x10,0x00, 0x40,0x40,0x7F,0x20,0x20,0x1F,0x11,0x11,0x01,0x00,0x07,0x18,0x20,0x40,0xF0,0x00 };char code han[]={/*-- 文字: 汉--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x60,0x01,0x86,0x60,0x04,0x1C,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00, 0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00 };//********声明函数**********************************void Delay(unsigned int MS);void wtcom(void);//********检查Busy 测忙****************************void BusyL(void){CSL=1;CSM=0;CSR=0;wtcom();}void BusyM(void){CSL=0;CSM=1;CSR=0;wtcom();}void BusyR(void){CSL=0;CSM=0;CSR=1;wtcom();}void wtcom(void){RS=0;RW=1;P1=0xFF;E=1;_nop_();while(P1&0x80);E=0;_nop_();}//***********写指令************************************** void WriteCommangL(unsigned char CommandByte) //写左屏程序{void wtcom(); ///侧忙程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
call wordw
mov r3,#0b8h ;页地址暂存
mov r4,#70h ;列地址暂存
mov dptr,#table4
call wordw
call select2
mபைடு நூலகம்v r3,#0b8h ;页地址暂存
mov r4,#40h ;列地址暂存
mov com,r4 ;设置起始列为第0列,总共64列
call rswrite
clear1:
mov dat,#00h ;清除显示(清屏)
call datawrite
djnz r2,clear1 ;列循环64列
mov r2,#64
inc r3
setb cs3
ret
select3:
setb cs1
setb cs2
clr cs3
ret
;********************
DELAY10ms: MOV R4,#20
D1: MOV R5,#248
w1:
movc a,@a+dptr
mov dat ,a
call datawrite
inc dptr
djnz county,w1
djnz r5,w2
sjmp w3
w2:
inc r3 ; 页地址增加1
mov com,r3
call rswrite
mov com,r4 ;列地址为原来的
db 82h, 80h,0FFh, 80h, 80h,0C0h, 80h, 00h
db 00h, 00h, 40h, 20h, 18h, 07h, 00h, 00h
db 00h, 00h,0FFh, 00h, 00h, 00h, 00h, 00h
table4: db 00h,0FCh, 44h, 44h, 44h,0FEh, 04h, 00h ;明
org 0000h
;********************主程序
main:
call init
call display
sjmp $
;********************显示程序
display:
call select1
mov r3,#0b8h ;页地址暂存
mov r4,#40h ;列地址暂存
mov com,r3 ;设置页地址
call rswrite
cjne r3,#0c0h,clear1 ;页循环8页
ret
;********************写入命令
rswrite:
acall busy
clr rs
clr rw
mov p1,com
DJNZ R5,$
DJNZ R4,D1
RET
table1: db 10h, 22h, 64h, 0Ch, 90h, 08h,0F7h, 14h ;海
db 34h, 54h, 14h, 14h,0F6h, 04h, 00h, 00h
db 22h, 22h, 22h,0FFh, 02h, 00h, 00h, 00h
db 00h, 80h, 40h, 30h, 0Fh, 02h, 02h, 02h
db 02h, 42h, 82h, 7Fh, 00h, 00h, 00h, 00h
end
mov dptr,#table5
call wordw
ret
;********************1个汉字写入
wordw:
mov com,r3
call rswrite
mov com,r4
call rswrite
mov r5,#2
mov county,#16
clr a
ret
;********************忙判断
busy:
clr rs
setb rw
busy01:
mov p1,#0ffh ;p1口置1
setb e ;在e高电平的作用下状态输出到数据线
mov a,p1
clr e ;为使液晶能工作e必须保持低电平
db 20h, 20h, 20h, 30h, 20h, 00h, 00h, 00h
db 40h, 40h, 40h, 40h, 40h, 40h, 40h, 7Fh
db 40h, 40h, 40h, 40h, 40h, 60h, 40h, 00h
table3:db 80h, 84h, 84h, 84h, 84h,0FEh, 82h, 83h ; "升",
setb e
nop
clr e
ret
;********************写入数据
datawrite:
acall busy
setb rs
clr rw
mov p1,dat
setb e
nop
clr e
call clear
call select3 ;选择模块3初始化
call clear
setb cs1 ;关闭所有的模块
setb cs2
setb cs3
ret
;********************清屏
clear:
mov r2,#64 ;用于清屏循环
jb acc.7,busy01 ;判忙,标志为0 ?否再读
ret
;********************模块选择
select1:
clr cs1
setb cs2
setb cs3
ret
select2:
setb cs1
clr cs2
db 0FEh, 22h, 22h, 22h, 22h,0FFh, 02h, 00h
db 00h, 0Fh, 04h, 04h, 04h, 8Fh, 40h, 30h
db 0Fh, 02h, 02h, 42h, 82h, 7Fh, 00h, 00h
table5: db 00h, 00h, 00h, 00h,0FEh, 22h, 22h, 22h ;月
call rswrite
mov county,#16
clr a
sjmp w1
w3:
ret
;********************初始化
init:
call delay10ms
call select1 ;选择模块1初始化
call clear
call select2 ;选择模块2初始化
db 04h, 04h,0FEh, 01h, 01h, 1Fh, 11h, 11h
db 13h, 15h, 51h, 91h, 7Fh, 11h, 01h, 00h
table2: db 00h, 00h, 00h, 00h, 00h, 00h, 00h,0FFh ; "上",
mov dptr,#table1
call wordw
mov r3,#0b8h ;页地址暂存
mov r4,#50h ;列地址暂存
mov dptr,#table2
call wordw
mov r3,#0b8h ;页地址暂存
mov r4,#60h ;列地址暂存
com equ 30h
dat equ 31h
cs1 bit p3.3
cs2 bit p3.4
cs3 bit p3.5
res bit p3.6
rs bit p3.0
rw bit p3.1
e bit p3.2
bf bit p1.7
county equ 32h
countx equ 33h
mov r3,#0b8h ;用于设置清屏起始页
mov r4,#40h ;用于设置清屏起始列
mov com,#3fh ;开显示
call rswrite
mov com,r3 ;设置起始页为第0页,总共8页
call rswrite