LCD12864(串口)显示程序
- 格式:doc
- 大小:49.00 KB
- 文档页数:6
12864串口程序#ifndef lcd12864_H#define lcd12864_H#includesbit SCLK=P2^4; //E :使能信号;串行时钟输入sbit SID=P2^5; //RW :读/写选择端:H 读; L 写; 串行数据线sbit CS=P2^6; //RS :寄存器选择端:H 数据; L 指令; 片选,低有效extern void LCDsendb(uint8 tdata) //一个发送8bit{uint8 i;for(i=0;i<8;i++){SID=tdata&0x80;tdata<<=1;_delay_us(1);SCLK=0;_delay_us(1);SCLK=1;_delay_us(1);}}extern void LCDsendcm(uint8 command) //写命令{CS=1;LCDsendb(0xf8);LCDsendb(command&0xf0);LCDsendb((command<<4)&0xf0);CS=0;}extern void LCDsendda(uint8 w_data) //写数据{CS=1;LCDsendb(0xfa);LCDsendb(w_data&0xf0);LCDsendb((w_data<<4)&0xf0);CS=0;}extern void outstr(uint8 *p) //输出字符串{while(*p>0)LCDsendda(*p++);}/*extern void LCDinch(uint32 num) //int转化为char {uint8 a[11]={'0'};int i=0;if(num==0) LCDsendda('0');while(num){a[i++]=num%10+48; num/=10;}while(i) LCDsendda(a[--i]);}*/extern void LCDflch(float number) //float转化为char { floatnum=number;uint8 a[11]={'0'};int i=0; uint32 num1;num1=(uint32)num;if(num1==0) LCDsendda('0');while(num1){a[i++]=num1%10+48; num1/=10;}while(i) LCDsendda(a[--i]);LCDsendda('.');LCDsendda((uint16)((uint32)(10*num)%10)+48);LCDsendda((uint16)((uint32)(100*num)%10)+48);LCDsendda((uint16)((uint32)(1000*num)%10)+48);LCDsendda((uint16)((uint32)(10000*num)%10)+48);}extern void LCDinit() //LCD12864初始化{_delay_ms(200);LCDsendcm(0x30); //选择基本指令集,选择8bit数据流_delay_us(1);LCDsendcm(0x0d); //开显示(有游标、反白)_delay_us(1);LCDsendcm(0x01); //清除显示,并且设定地址指针为00H _delay_ms(5);LCDsendcm(0x06); //设定游标的移动方向及指定显示的移位_delay_us(1);LCDsendcm(0x80);_delay_us(1);}#endif。
LCD12864串行显示文件1、LCD12864.c文件//===================================== ==========================#include "LCD12864.h"#include/**** 串行控制 *****************/sbit RS = P1^0;sbit RW = P1^1;sbit EN = P1^2;/*-----LCD12864相关声明---------*/#define com_byte 0#define dat_byte 1uchar lcdPosX, lcdPosY; //X,Y坐标uchar halfScr, halfLineCnt, basicBlock; //半屏,半屏行数,N*8块/************************************************************** 函数名称:void LCD12864_Delay_Ms (uchar ms)函数功能: LCD12864延时函数**************************************************************/ void LCD12864_Delay_Ms (uchar ms){uchar i;while (--ms){for (i = 0; i < 125; i++);}/************************************************************** 函数名称:void LCD12864_Write_Byte(uchar byte)函数功能: 写字节**************************************************************/ void LCD12864_Write_Byte(uchar byte){uchar i;for(i = 0; i < 8; i++){EN = 0;byte <<= 1;RW = CY;EN = 1;}}/************************************************************** 函数名称:uchar LCD12864_Read_Byte(void)函数功能: 读字节*************************************************************** /uchar LCD12864_Read_Byte(void){uchar i,temp1,temp2;temp1 = 0;temp2 = 0;for(i = 0; i < 8; i++)temp1 = temp1 << 1;EN = 0;EN = 1;EN = 0;if(RW) temp1++;}for(i=0;i<8;i++){temp2=temp2<<1;EN = 0;EN = 1;EN = 0;if(RW) temp2++;}return ((0xf0 & temp1) + (0x0f & temp2));}/************************************************************** 函数名称:void LCD12864_Is_Busy( void )函数功能: 检测忙函数**************************************************************/ void LCD12864_Is_Busy( void ){doLCD12864_Write_Byte(0xfc); //11111,RW(1),RS(0),0while(0x80 & LCD12864_Read_Byte());}/**************************************************************函数名称:void LCD12864_Write(bit dat_byte_com_byte,uchar byt)函数功能: 写入函数*************************************************************** /void LCD12864_Write(bit dat_byte_com_byte, uchar byt){uchar temp;if(dat_byte_com_byte == 0) //为零,写入指令temp = 0xf8; //11111,RS(0),RW(0),0else //否则,写入数据temp = 0xfa; //11111,RS(1),RW(0),0RS = 1;LCD12864_Is_Busy();LCD12864_Write_Byte(temp);LCD12864_Write_Byte(byt & 0xf0); //写入高四位LCD12864_Write_Byte(byt << 4); //写入低四位RS = 0;}/************************************************************** 函数名称:void LCD12864_Clear_Display (void)函数功能: LCD12864 显示清屏*************************************************************** /void LCD12864_Clear_Display (void){LCD12864_Write(com_byte,0x01);}/**************************************************************函数名称:void LCD12864_Write_Position (void)函数功能: LCD12864 显示位置*************************************************************** /void LCD12864_Write_Position (void){LCD12864_Write(com_byte,0x34);LCD12864_Write(com_byte,lcdPosY);LCD12864_Write(com_byte,lcdPosX);LCD12864_Write(com_byte,0x30);}/************************************************************** 函数名称:void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls)函数功能: LCD12864 显示一张图片*************************************************************** /void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls) {lcdPosX = 0x80;halfScr = 2;for (; halfScr != 0; halfScr--){lcdPosY = 0x80;halfLineCnt = 32;for (; halfLineCnt != 0; halfLineCnt--){basicBlock = 16;LCD12864_Write_Position();for (; basicBlock != 0; basicBlock--){if (bmpCls == 0){LCD12864_Write(dat_byte, *bmp++);}else if (bmpCls == 1){LCD12864_Write(dat_byte, 0x00);}}lcdPosY++;}lcdPosX = 0x88;}LCD12864_Write(com_byte, 0x36);LCD12864_Write(com_byte, 0x30);}/************************************************************** 函数名称:void convertChar (uchar CX, CY, width)* 字符反白显示* 输入参数:CX=要反白字符的行(0-3)* CY=要反白字符的列(0-7)* width=要反白字符的长度(1-16)函数功能: 转换成字符*************************************************************** /void convertChar (uchar CX, CY, width){LCD12864_DisplayPhoto(0,1);lcdPosY = 0x80;if (CX == 0){CX = 0x80;halfLineCnt = 16;}else if (CX == 1){CX = 0x80;halfLineCnt = 32;}else if (CX == 2){CX = 0x88;halfLineCnt = 16;}else if (CX == 3){CX = 0x88;halfLineCnt = 32;}lcdPosX = CX + CY;for (; halfLineCnt != 0; halfLineCnt--){basicBlock = width;LCD12864_Write_Position();for (; basicBlock != 0; basicBlock--){if (halfLineCnt > 16){LCD12864_Write(dat_byte, 0x00);}else{LCD12864_Write(dat_byte, 0xff);}}lcdPosY++;}LCD12864_Write(com_byte, 0x36);LCD12864_Write(com_byte, 0x30);}/************************************************************** 函数名称:void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg)函数功能: LCD12864 显示字符串/void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg){if (X == 0){X = 0x80;}else if (X == 1){X = 0x90;}else if (X == 2){X = 0x88;}else if (X == 3){X = 0x98;}Y = X + Y;LCD12864_Write(com_byte, Y);while (*msg){LCD12864_Write(dat_byte, *msg++);LCD12864_Delay_Ms(speed);}}函数名称:void init_12864(void)函数功能:初始化12864*************************************************************** /void init_12864(void){LCD12864_Write(com_byte, 0x30); //基本指令功能.LCD12864_Write(com_byte, 0x0c); //显示打开,关光标,反白关.LCD12864_Write(com_byte, 0x01); //清屏指令.LCD12864_Write(com_byte, 0x06); //AC自动加一LCD12864_Write(com_byte, 0x80);}2、LCD12864.h文件//===================================== ==========================#ifndef __LCD12864_H__#define __LCD12864_H__#define uchar unsigned char#define uint unsigned int/************************************************************** 函数名称:void LCD12864_Write(bit dat_byte_com_byte,uchar byt)函数功能: 写入函数*************************************************************** /void LCD12864_Write(bit dat_byte_com_byte, uchar byt);/************************************************************** 函数名称:void LCD12864_Clear_Display (void)函数功能: LCD12864 显示清屏*************************************************************** /void LCD12864_Clear_Display (void);/************************************************************** 函数名称:void LCD12864_Write_Position (void)函数功能: LCD12864 显示位置*************************************************************** /void LCD12864_Write_Position (void);/************************************************************** 函数名称:void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls)函数功能: LCD12864 显示一张图片*************************************************************** /void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls);/************************************************************** 函数名称:void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg)函数功能: LCD12864 显示字符串*************************************************************** /void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg);/************************************************************** 函数名称:void init_12864(void)函数功能:初始化12864*************************************************************** /void init_12864(void);#endif。
本例程为【2 】经由过程用AT89C52芯片操作LCD12864显示的程序,应用的晶振为12M./**********************************************************程序解释:LCD12864显示主程序程序调试员:莫剑辉调试时光:2010-6-7**********************************************************/#include<reg52.h>#include"12864.c"void main(){Ini_Lcd(); //液晶初始化子程序Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序while(1);}这里我们经由过程挪用下面的头文件就可以了,如许的做法便利我们今后要用到LCD12864的程序的挪用./**********************************************************程序解释:LCD12864显示头文件程序调试员:莫剑辉调试时光:2010-6-7**********************************************************///#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define DATA P2 //数据输出端0~7sbit RS=P0^0; //LCD12864 RS端sbit RW=P0^1; //LCD12864 RW端sbit E =P0^2; //LCD12864 E 端sbit PSB =P0^3;/********************************************* 延时子程序*********************************************/ void Delay_1ms(uint x){uint j,i;for(j=0;j<x;j++){for(i=0;i<120;i++); //延时X乘以120}}/********************************************* LCD12864液晶测忙子程序(读状况)*********************************************/ void Busy(){uchar busy;do{E = 0; //0为封闭使能端,1为打开使能端RS = 0; //1为指令,0为数据RW = 1; //1为读,0为写Delay_1ms(20); //延时20乘以120时光E = 1; //0为封闭使能端,1为打开使能端busy=P1; //读取P2状况Delay_1ms(20); //延时20乘以120时光E = 0; //0为封闭使能端,1为打开使能端}while(busy&0x80); //断定BUSY位是否工作:1为内部在工作,0为正常状况}/*********************************************LCD12864液晶数据写入子程序*********************************************/void Write_Data(uchar k){Busy(); //测忙E =1;//0为封闭使能端,1为打开使能端RS=1;//1为指令,0为数据RW=0;//1为读,0为写DATA=k;//输入数据K到DATADelay_1ms(20);//延时20乘以120时光E =0; //0为封闭使能端,1为打开使能端Delay_1ms(20); //延时20乘以120时光}/*********************************************LCD12864液晶敕令写入子程序*********************************************/void Write_Cmd(uchar cmd){Busy(); //测忙E=1;//0为封闭使能端,1为打开使能端RS=0; //1为指令,0为数据RW=0;//1为读,0为写DATA=cmd; //输入敕令cmd到DATADelay_1ms(20);//延时20乘以120时光E=0;//0为封闭使能端,1为打开使能端Delay_1ms(20);//延时20乘以120时光}/*********************************************LCD12864液晶数据显示子程序*********************************************/void Disp(uchar y,uchar x,uchar i,uchar *z){uchar Address;if(y==1){Address=0x80+x;} //Y断定第几行,X断定第几列,0x80为液晶行初始地址if(y==2){Address=0x90+x;}if(y==3){Address=0x88+x;}if(y==4){Address=0x98+x;}Write_Cmd(Address); //写入地址敕令到LCD12864while(i) //写入显示数据的大小{Write_Data(*(z++)); //写入显示数据到LCD12864i--;}}/********************************************* LCD12864液晶初始化子程序*********************************************/ void Ini_Lcd(void){PSB=1;Delay_1ms(20);Write_Cmd(0x30); //根本指令集Delay_1ms(20);Write_Cmd(0x02); // 地址归位Delay_1ms(20);Write_Cmd(0x0c); //整体显示打开,游标封闭Delay_1ms(20);Write_Cmd(0x06); //游标右移Delay_1ms(20);Write_Cmd(0x80); //设定显示的肇端地址Delay_1ms(20);Write_Cmd(0x01); //消除显示}。
LCD12864串口显示使用详解LCD12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。
每个显示点对应一位二进制数,1表示亮,0表示灭。
存储这些点阵信息的RAM称为显示数据存储器,要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。
LCD12864控制芯片:ST7920A 带中文字库MCU:STM32F103源程序下载地址:/detail/wylloong/8538839根据串行连接时序图所示,串行数据传送共分三个字节完成:第一字节:串口控制指令——格式 11111ABC 其中,A为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCD;B为数据类型选择:H表示数据是显示数据,L表示数据是控制指令;C固定为0第二字节:(并行)8位数据的高4位——格式 DDDD0000第三字节:(并行)8位数据的低4位——格式 0000DDDD,发送时将低四位移至发送数据的高四位,即DDDD0000方能正确。
绘图RAM(GDRAM):绘图显示RAM提供128*8个字节的记忆空间,在更改绘图RAM时,先连续写入水平与垂直的坐标值,再写入两个字节的数据到绘图RAM,而地址计数器(AC)会自动加1;在写入绘图RAM的期间,绘图显示必须关闭。
整个写入绘图RAM的步骤如下:1、关闭绘图显示功能。
2、先将水平的位元组坐标(X)写入绘图RAM地址,再将垂直的坐标(Y)写入绘图RAM地址;将D15——D8写入到RAM中;将D7——D0写入到RAM 中;3、打开绘图显示功能。
带中文字库的128X64显示模块时应注意以下几点:①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
②显示ASCII字符过程与显示中文字符过程相同。
不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。
/*************************************************名称:LCD12864_ST7920并行测试程序试验功能:测试基于ST7920控制芯片的LCD12864的显示并行方式连接;晶振11.0592M编写:*************************************************/#include <reg52.h>#include <ziku.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int //宏定义/*****LCD接口定义*****/sbit LCD_RS = P2^0; //1:输入数据;0:输入命令sbit LCD_RW = P2^1; //1:读数据0:写数据sbit LCD_EN = P2^2; //LCM使能端sbit LCD_PSB = P2^3; //串并口选择1:并口模式; 0:串口模式;#define LCD_DATA P0 //LCD总线端口/*****LCD功能初始化指令*****/#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H#define AC_INIT 0x02 //将AC设置为00H。
且游标移到原点位置#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)#define FUN_MODE 0x30 //工作模式:8位基本指令集#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白#define DISPLAY_OFF 0x08 //显示关#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH#define SET_DD_AC 0x80/*****汉字地址表*****/uchar code addr_tab[]={ //便于根据汉字坐标求出地址0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置};/*****n(ms)延时子程序*****/void delayms(uint t) //约延时n(ms){uint i;while(t--){for(i=0;i<125;i++);}}/*****等待LCD忙*****/void WaitBusy(void) //延时一小段时间,等待LCD空闲{uchar i=5;while(i--);}/*****写指令代码*****/void Lcd_WriteCmd(uchar cmdcode){LCD_RS = 0;LCD_RW = 0;LCD_EN = 1;WaitBusy();LCD_DATA = cmdcode;LCD_EN = 0;}/*****写数据*****/void Lcd_WriteData(uchar dispdata){LCD_RS = 1;LCD_RW = 0;LCD_EN = 1;WaitBusy();LCD_DATA = dispdata;LCD_EN = 0;}/*****初始化LCD*****/void Lcd_Init(){LCD_PSB = 1;delayms(50);Lcd_WriteCmd(0x30); //选择基本指令集delayms(1);Lcd_WriteCmd(0x30); //选择8bit数据流delayms(1);Lcd_WriteCmd(0x0c); //开显示(无游标、不反白)delayms(1);Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00Hdelayms(20);}/*****显示汉字*****/void hanzi_Disp(uchar x,uchar y,uchar code *s){ //x、y为汉字坐标Lcd_WriteCmd(addr_tab[8*x+y]); //写地址while(*s>0){Lcd_WriteData(*s); //写数据s++;}}/*****显示图片(显示Gdram内容)*****//*绘图显示的步骤1 关闭绘图显示功能2 先将垂直的坐标(Y)写入绘图RAM地址3 再将水平的位元组坐标(X)写入绘图RAM地址4 将D15-D8写入RAM中5 将D7-D0写入到RAM中6 打开绘图显示功能*///图片取模方式:横向取模,字节正序void pic_Disp(uchar *pic) //显示Gdram内容(显示图片){uchar x,y,i;for(i=0;i<9;i=i+8)for(y=0;y<32;y++){for(x=0;x<8;x++){Lcd_WriteCmd(0x36); //扩充指令,开绘图显示Lcd_WriteCmd(0x80+y); //行地址Lcd_WriteCmd(0x80+x+i); //列地址Lcd_WriteData(*pic++); //写数据D15-D8Lcd_WriteData(*pic++); //写数据D7-D0Lcd_WriteCmd(0x30);}}}/*****整屏显示竖条*****///当i=0时显示上面128×32,当i=8时显示下面128×32//当i=0时显示上面128×32,当i=8时显示下面128×32void LcdFill_Vertical(){uchar x,y,i;for(i=0;i<9;i=i+8)for(y=0;y<0x20;y++){for(x=0;x<8;x++){Lcd_WriteCmd(0x36); //扩充指令绘图显示Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+0x80+i); //列地址Lcd_WriteData(0x55); //写数据D15-D8Lcd_WriteData(0x55); //写数据D7-D0Lcd_WriteCmd(0x30);}}}/*****整屏显示横条*****/void LcdFill_Level(){uchar x,y,i;uchar k;for(i=0;i<9;i+=8)for(y=0;y<0x20;y++){if((y%2)==1) k=0xff;else k=0;for(x=0;x<8;x++){Lcd_WriteCmd(0x36); //扩充指令绘图显示Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+0x80+i); //列地址Lcd_WriteData(k);Lcd_WriteData(k);Lcd_WriteCmd(0x30);}}}/*****整屏充满亮点或暗点*****///当i=0时显示上面128×32,当i=8时显示下面128×32 //当i=0时显示上面128×32,当i=8时显示下面128×32 void Lcd_Fill(uchar test){for(i=0;i<9;i=i+8)for(y=0;y<0x20;y++){for(x=0;x<8;x++){Lcd_WriteCmd(0x36); //扩充指令绘图显示Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+0x80+i); //列地址Lcd_WriteData(test); //写数据D15-D8Lcd_WriteData(test); //写数据D7-D0 Lcd_WriteCmd(0x30);}}}/*****主函数*****/void main(void){Lcd_Init();while(1){Lcd_Init();hanzi_Disp(0,0,"ST7920型液晶模块");hanzi_Disp(1,1,"并行测试程序");hanzi_Disp(2,0,"");hanzi_Disp(3,3,"");delayms(2000);Lcd_Init();// Lcd_Fill(0xff);hanzi_Disp(1,2,"坏点检测");delayms(500);Lcd_Init();Lcd_Fill(0xff);delayms(1500);Lcd_Init();LcdFill_Vertical();delayms(750);Lcd_Init();LcdFill_Level();delayms(750);hanzi_Disp(1,2,"显示汉字");delayms(500);Lcd_Init();hanzi_Disp(0,0,tangshi);delayms(1500);Lcd_Init();hanzi_Disp(1,2,"显示图片");delayms(500);Lcd_Init();pic_Disp(LCDsheji);delayms(1000);Lcd_Init();pic_Disp(rmb);delayms(1000);Lcd_Init();pic_Disp(qiche);delayms(1000);Lcd_Init();pic_Disp(gongji);delayms(1000);Lcd_Fill(0x00); //清显示RAMdelayms(500);}}以下是字库头文件:ziku.hunsigned char code tangshi[]={"黄河远上白云间,羌笛何须怨杨柳,一片孤城万仞山。
module lcd12864(LCD_RST,PSB,clk, rs, rw, en,dat); output reg LCD_RST;output reg PSB;input clk;output [7:0] dat;output reg rs,rw,en;//tri en;reg e;reg [7:0] dat;reg [31:0] counter=0;reg [6:0] current=0,next=0;reg clkr;reg [31:0] cnt=0;parameter set0=6'h0;parameter set1=6'h1;parameter set2=6'h2;parameter set3=6'h3;parameter set4=6'h4;parameter set5=6'h5;parameter set6=6'h6;parameter dat0=6'h7;parameter dat1=6'h8;parameter dat2=6'h9;parameter dat3=6'hA;parameter dat4=6'hB;parameter dat5=6'hC;parameter dat6=6'hD;parameter dat7=6'hE;parameter dat8=6'hF;parameter dat9=6'h10;parameter dat10=6'h12;parameter dat11=6'h13;parameter dat12=6'h14;parameter dat13=6'h15;parameter dat14=6'h16;parameter dat15=6'h17;parameter nul=6'h18;parameter bai=8'h31;parameter shi=8'h30;parameter ge=8'h30;always @(posedge clk) //da de shi zhong pinlv begincounter<=counter+1;if(counter==32'h1FFFE) begincounter<=0;endelse if((counter==32'h20)) begin//(counter==32'h57FE)clkr<=~clkr;enden<=clkr|e;rw<=0;LCD_RST<=1'b1;PSB<=1'b1;endalways @(posedge clk)beginif(counter==32'h20)begin //counter==32'haff0current<=next;case(current)set0: begin rs<=0; dat<=8'h30; next<=set1; endset1: begin rs<=0; dat<=8'h0c; next<=set2; endset2: begin rs<=0; dat<=8'h6; next<=set3; end//set3: begin rs<=0; dat<=8'h1; next<=dat0; enddat0: begin rs<=1; dat<="F"; next<=dat1; end //?????dat1: begin rs<=1; dat<="r"; next<=dat2; enddat2: begin rs<=1; dat<="q"; next<=dat3; enddat3: begin rs<=1; dat<="u";next<=dat4; enddat4: begin rs<=1; dat<="e"; next<=dat5; enddat5: begin rs<=1; dat<="n"; next<=dat6; enddat6: begin rs<=1; dat<="c"; next<=dat7; enddat7: begin rs<=1; dat<="y";next<=dat8; enddat8: begin rs<=1; dat<=":"; next<=set6; endset6: begin rs<=0; dat<=8'h90; next<=dat9;enddat9: begin rs<=1; dat<=bai; next<=dat10; end //?????dat10: begin rs<=1; dat<=shi; next<=dat11; enddat11: begin rs<=1; dat<=ge; next<=dat12; enddat12: begin rs<=1; dat<=" ";next<=dat13; enddat13: begin rs<=1; dat<="k"; next<=dat14; enddat14: begin rs<=1; dat<="H"; next<=dat15; enddat15: begin rs<=1; dat<="z"; next<=nul; endnul: begin rs<=0; dat<=8'h00; // ????E ? ??if(cnt!=2'h2)begine<=0;current<=set0;cnt<=cnt+1;endelsebegin current<=set0; e<=1;cnt<=0;endenddefault: next<=set0;endcaseendendendmodule。
/*注:不同开发板,LCD数据显示口不同,Y51最小系统板数据口为P2口*//*注:不同开发板,LCD数据显示口不同,Y51最小系统板数据口为P2口*//*注:不同开发板,LCD数据显示口不同,Y51最小系统板数据口为P2口*//*注:不同开发板,LCD数据显示口不同,Y51最小系统板数据口为P2口(即dat口)否则LCD12864不能正常显示!*/#include<reg52.h>/*端口定义*/#define LCD_data P0 //数据口#define uchar unsigned char#define uint unsigned intsbit LCD_RS = P0^7; //寄存器选择输入sbit LCD_RW = P0^6; //寄存器读写控制sbit LCD_EN = P0^5; //液晶使能控制sbit LCD_PSB = P0^4; //串并方式控制void delay_1ms(uint x); //延时子程序void write_cmd(uchar cmd); //写指令子程序void write_dat(uchar dat); //写数据子程序void lcd_pos(uchar X, uchar Y); //设定位置子程序void lcd_init(); //LCD初始化uchar dis1[] = {"成功显示咯!"};uchar dis2[] = {"迈出第一步!"};uchar dis3[] = {"加油!加油!"};uchar dis4[] = {"最大功率跟踪!"};/*主程序*/void main(){uchar i;lcd_init();while(1){lcd_pos(0,0); //第一行i = 0;while(dis1[i] != '\0'){write_dat(dis1[i]);i++;}lcd_pos(1,0); //第二行i = 0;while(dis2[i] != '\0'){write_dat(dis2[i]);i++;}lcd_pos(2,0); //第三行i = 0;while(dis3[i] != '\0'){write_dat(dis3[i]);i++;}lcd_pos(3,0); //第四行i = 0;while(dis4[i] != '\0'){write_dat(dis4[i]);i++;}}}/*延时子程序*/void delay_1ms(uint x){uint i,j;for(j = 0; j < x; j++){for(i = 0; i < 110; i ++);}}/*写指令子程序*/void write_cmd(uchar cmd){LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;P2 = cmd;delay_1ms(5);LCD_EN = 1; //高脉冲delay_1ms(5);LCD_EN = 0;}/*写数据子程序*/void write_dat(uchar dat) {LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P2 = dat;delay_1ms(5);LCD_EN = 1; //高脉冲delay_1ms(5);LCD_EN = 0;}/*设定位置子程序*/void lcd_pos(uchar X, uchar Y) {uchar pos;if(X == 0){X = 0x80;}else if(X == 1){X = 0x90;}else if(X == 2){X = 0x88;}else if(X == 3){X = 0x98;}pos = X + Y;write_cmd(pos);}/*LCD初始化*/void lcd_init(){LCD_PSB = 1; //设置并行方式write_cmd(0x30);delay_1ms(5);write_cmd(0x0C); //显示开,光标关delay_1ms(5);write_cmd(0x01); //清除LCD显示内容delay_1ms(5);}。
#ifndef jh_f330#define jh_f330#include<c8051f330.h>#endiftypedef unsigned char uint8;typedef unsigned int uint16;/*************端口配置**************/sbit LCD_CS = P0^4; //片选信号,低电平有效sbit LCD_RST = P0^3; //复位信号,低电平有效sbit LCD_A0 = P0^2; //数据、指令选择,H:数据、L:指令sbit LCD_DAT = P1^0; //串行输入数据引脚sbit LCD_CLK = P1^1; //串行时钟输入引脚uint8 code word1[]={0x04,0x44,0x84,0x04,0xE4,0x1F,0x84,0x44,0xA4,0x3F,0xA4,0xA4,0x64,0x06,0x04,0x00, 0x20,0x10,0x09,0x04,0xFF,0x04,0x04,0x14,0x26,0x05,0x84,0xFF,0x04,0x06,0x04,0x00 };/**********预定义数据*********/#define LCD_X 128-1 //屏幕的X轴的物理宽度#define LCD_Y 64-1 //屏幕的Y轴的物理宽度/***********LCD指令集***************///LCD开关命令#define LCD_ON() Wr_Com(0xaf)#define LCD_OFF() Wr_Com(0xae)//设置显示起始行#define LCD_START_LINE 0x40 //起始行地址为,0x40+(0-63)//页地址设置#define LCD_Page 0xb0 //页地址为:0xb0+(0-8)//列地址设置#define LCD_Ad_H 0x10 //列高四位地址:0x10+()#define LCD_Ad_L 0x00 //列低四位地址:0x00+()//行列地址方向设置#define ADC_Norm() Wr_Com(0xa0);#define ADC_Reve() Wr_Com(0xa1);#define Com_Norm() Wr_Com(0xc0);#define Com_Reve() Wr_Com(0xc8);void Init_f330(){/*****内部振荡器配置******/OSCICL=OSCICL+4; //设置系统时钟为24MHZ,ΔT=(0.005*ΔOSCICL)/fbase // OSCICL=OSCICL+22; //设置系统时钟为22.1184MHZ// OSCICL=OSCICL+45; //设置系统时钟为20MHZ //15MHZ--24.5MHZ/********设置分频*********/// OSCICN|=0x00; //设置时钟为八分频,OSCIN复位值为1100000//00:8分频,01:4分频,10:2分频,11:不分频// OSCICN|=0x01; //设置系统时钟4分频// OSCICN|=0x02; //设置系统时钟2分频OSCICN|=0x03; //设置系统时钟不分频// RSTSRC=0x04;// OSCLCN = 0x82; // 设置内部L-F振荡器为40kHZ// CLKSEL = 0x02; // 内部低频振荡器while(OSCLCN&0x40 == 0); // 等待振荡器频率稳定/*****设置看门狗*****/PCA0MD &=~0x40; // 禁止看门狗定时器EA=1;/*****端口初始化******/P0MDIN = 0xff; //复位值为11111111P1MDIN = 0xff; //1为数字输入,0为模拟输入P0MDOUT = 0xff; //复位值为11111111P1MDOUT = 0xff; //1为推挽输出,0为漏极输出XBR0 = 0x00; // 交叉开关使能XBR1 = 0x40; //交叉开关允许,T0接到引脚//XBR1 = 0x48; // ECI连到端口引脚//XBR1 |= 0x08; // PCA0 外部计数输入使能}/***************************************功能:LCD串行写入数据程序**输入:8位数据**输出:无************************************/ void Wr_Dat(uint8 dat){uint8 Num;LCD_CS = 0; //选通芯片LCD_A0 = 1; //写数据for(Num=0;Num<8;Num++){if((dat&0x80) == 0) LCD_DAT = 0;else LCD_DAT = 1;dat = dat << 1;LCD_CLK = 0;LCD_CLK = 1;}LCD_CS = 1;}/***************************************函数名称:Wr_Com()**功能:LCD串行写入命令程序**输入:8位数据**输出:无************************************/ void Wr_Com(uint8 com){uint8 Num;LCD_CS = 0; //选通芯片LCD_A0 = 0; //写入命令for(Num=0;Num<8;Num++){if((com&0x80) == 0) LCD_DAT = 0;else LCD_DAT = 1;com = com << 1;LCD_CLK = 0;LCD_CLK = 1;}LCD_CS = 1;}/***************************************功能:LCD全屏显示数据程序**输入:8位数据**输出:无************************************/void LCD_Fill(uint8 dat){uint8 page;uint8 colume;for(page=0;page<8;page++){Wr_Com(LCD_Page+page);Wr_Com(LCD_Ad_H);Wr_Com(LCD_Ad_L);for(colume=0;colume<LCD_X;colume++)Wr_Dat(dat);}}/***************************************函数名称:LCD_Clear()**功能:LCD清屏程序(全屏填充0x00)**输入:8位数据**输出:无************************************/void LCD_Clear(){LCD_Fill(0x00);}/******************************************************* ** 函数名称: LCD12864_Init** 功能: LCD1286初始化程序** 输入: 无TimeDelay ** 输出: 无********************************************************/ void TimeDelay(int Time){int i;while(Time > 0){for(i = 0;i < 8000;i++){}Time --;}}void LCD_Init(void){LCD_RST=0;TimeDelay(200);LCD_RST=1;TimeDelay(200);ADC_Norm();Com_Reve();Wr_Com(0xa2);Wr_Com(0x2c); //vc onTimeDelay(200);Wr_Com(0x2e); //vr onTimeDelay(200);Wr_Com(0x2f); //internal booster,follower,divided onWr_Com(0x24); //set rb/ra=5.29Wr_Com(0x81); //set reference voltage selectWr_Com(0x1d);LCD_ON();Wr_Com(LCD_START_LINE);}/***********************************************************************函数名称:LCD_Word()**功能:输入单个汉字(16x16符号)**输入:页地址,列地址、字符数组**输出:无***********************************************************************/ void LCD_Word(unsigned char row,unsigned char colume,unsigned char *pword){unsigned char page= row;unsigned char col_high=colume>>4;unsigned char col_low =colume&0x0f;unsigned char i;Wr_Com(LCD_Page+page);Wr_Com(LCD_Ad_H+col_high);Wr_Com(LCD_Ad_L+col_low);for(i=0;i<16;i++){Wr_Dat(*(pword+i));}Wr_Com(LCD_Page+page+1);Wr_Com(LCD_Ad_H+col_high);Wr_Com(LCD_Ad_L+col_low);for(i=0;i<16;i++){Wr_Dat(*(pword+16+i));}main(){Init_f330();LCD_Init();LCD_Clear();LCD_Word(1,1,word1);while(1);}。