12864并口函数文件
12864液晶串行驱动函数

#include <reg52.h> #include <intrins.h> #include <stdio.h> #include <math.h> #define uchar unsigned char #define uint unsigned int sbit CS = P2^4; sbit SCK = P2^6; sbit SID = P2^5; sbit RST =P2^3; sbit PSB= P2^1; sbit key=P3^0; uchar code AC_TABLE[]={ 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, };
********************** * 函数名称 :WriteCommand ********************************************************************* *********************/ void WriteCommand(uchar Cbyte ) { CS = 1; CheckBusy(); SendByte(0xf8); //11111,RW(0),RS(0),0 SendByte(0xf0&Cbyte); //高四位 SendByte(0xf0&Cbyte<<4);//低四位(先执行<<) CS = 0; } /******************************************************************** ********************** * 函数名称 :WriteData ********************************************************************* *********************/ void WriteData(uchar Dbyte ) { CS = 1; CheckBusy(); SendByte(0xfa); //11111,RW(0),RS(1),0 SendByte(0xf0&Dbyte); //高四位 SendByte(0xf0&Dbyte<<4);//低四位(先执行<<) CS = 0; } /******************************************************************** ********************** * 函数名称 :ReadData ********************************************************************* *********************/ uchar ReadData( void ) { CheckBusy(); SendByte(0xfe); //11111,RW(1),RS(1),0 return ReceiveByte(); } /***************************************** Fucntion: delay10US(char x) Description: delay for 10 us Parameter: x Author: kassey@ Date: July,7th,2005
stm32-12864并行驱动程序

//////////////////////////////////////////////////////////////////////////////////stm32-12864并行驱动程序////////////////////////////////////////////////////#include "delay.h" //必须配合delay.c 和delay.h 文件使用,所以要包含delay.h。
#include "display12864.h"f/********** 以下是相关引脚定义。
**************/// A 口的#define DisIO GPIOE //定义12864 要使用的I/O 端口。
#define DisClk RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。
#define DataGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7//定义12864 使用的数据引脚。
#define EN GPIO_Pin_10 //定义使能端使用的引脚/*********************************************/#define DisIOIO GPIOE //定义12864 要使用的I/O 端口。
#define DisClkIO RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。
#define RS #define RW GPIO_Pin_9GPIO_Pin_8/*光标定位函数定义结束。
*/#define x1 0x80#define x2 0x88#define y 0x80GPIO_InitTypeDef GPIOStru; //定义用于定义所以引脚为输出的变量。
12864串口程序

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。
12864程序

硬件连接方式是:并口直接访问。
这是汉字显示程序:#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define datawr 0x1200 //写数据通道#define comwr 0x1000 //写控制命令通道#define datare 0x1300 //读数据通道#define comre 0x1100 //读忙通道uchar code disp_data[]={" 浙江大学" //第一行,第一页"04级通信工程一班" //第三行" 宁波理工学院" //第二行" 竞赛小组" //第四行"128X64液晶显示器" //第一行,第二页" 测试程序" //第三行" 07年07月25日" //第二行" Tornado "}; //第四行void set12864();void write_command(uchar command);void write_page(uchar data_add);void read_page(uchar data_add);void delays(uchar cont);void main(){while(1){set12864(); //初始化12864write_page(0); //写入一页数据read_page(0x30); //读出一页数据到内部RAMdelays(2); //延时2swrite_page(64); //写入下一页数据delays(2); //延时2s}}//初始化12864子程序void set12864(){write_command(0x30); //功能设定控制字write_command(0x0c); //显示开关控制字write_command(0x01); //清除屏幕控制字write_command(0x06); //进入设定点控制字}//写控制命令子程序void write_command(uchar command){bit flag=1; //12864空闲标志位while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[comwr]=command; //空闲传送控制字}//写一页子程序void write_page(uchar data_add){bit flag=1; //12864空闲标志位uchar num=64; //64个循环,连续写入32个汉字或是64个西文字符write_command(0x80);for(;num>0;num--){while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据}}//读一页子程序void read_page(uchar data_add){bit flag=1; //12864空闲标志位uchar num=64; //64个循环,连续写入32个汉字或是64个西文字符write_command(0x80);for(;num>0;num--){while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;DBYTE[data_add++]=XBYTE[datare]; //空闲传送数据}}//延时cont秒子程序void delays(uchar count){unsigned char h,i,j,k;do{for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}while(--count);}这是图象显示程序:#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int#define datawr 0x1200 //写数据通道#define comwr 0x1000 //写控制命令通道#define datare 0x1300 //读数据通道#define comre 0x1100 //读忙通道uchar code disp_data[] = // 数据表{0x00,0x01,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x00,0x01,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00 ,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00 ,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00 ,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00 ,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00 ,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x0 0,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x8 0,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0 3,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0 0,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8 0,0x00,0x0B,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8 0,0x00,0x00,0x1F,0x01,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC 0,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xF3,0x79,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC 0,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xE6,0x62,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE 1,0x60,0x00,0x68,0x01,0xFF,0xFF,0xFE,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1 ,0x00,0x00,0x0E,0x01,0xFF,0xFF,0xF8,0x00,0x4B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0 ,0x8E,0x08,0x79,0x07,0xFF,0xFF,0xF0,0x00,0x41,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE6 ,0xC0,0x07,0x61,0xC3,0xFF,0xFE,0xC0,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xED,0xEF,0x3F,0x83,0xFF,0xFE,0x60,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xC0,0xFF,0xFD,0xFC,0x6C,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xFF,0xF0,0x7F,0xF3,0xFF,0xFE,0x60,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0x50,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xC9,0xFB,0xFF,0xF1,0xF8,0x8C,0xD8,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFB,0x6F,0xD9,0xC2,0x3F,0xF8,0x40,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6 ,0xDF,0x1E,0xFF,0xFF,0x7F,0xFC,0x38,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x64 ,0x2F,0x6F,0xFF,0xFD,0x7B,0xFC,0x1F,0xE0,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x5 F,0x7C,0xEE,0xFF,0xC7,0xFF,0xBC,0x0F,0xFF,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xD F,0xFE,0xEF,0xFF,0xFF,0xE7,0xDC,0x07,0xE7,0xF8,0x12,0x7F,0xFF,0xFF,0xFF,0xFF,0x4 7,0xFF,0xFF,0xFF,0xFF,0xE7,0x80,0x03,0xF4,0x00,0x00,0x5F,0xFF,0xFF,0xFE,0xFE,0xE3 ,0xFF,0xFF,0xFF,0xFF,0xFE,0xC0,0x01,0xC0,0x00,0x00,0x1B,0xFF,0xFF,0xFB,0xFF,0xF F,0xFF,0xFF,0xFF,0x7F,0xEE,0xC0,0x00,0xC0,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFE,0x98,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xEF,0xFF,0xFF, 0xFF,0xFF,0xFF,0x20,0x0E,0x60,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x8F,0xFF,0xFF, 0xFF,0xFF,0xFF,0x05,0x80,0xE0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFD,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0x09,0x80,0xA0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x7F,0xFF,0xFF, 0xFF,0xFF,0xFF,0x85,0x2A,0xC0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFB,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFE,0xBF,0xF3,0xC0,0x00,0x00,0x00,0x00,0x00,0xFF,0xF7,0xFF,0xFF,0xFF, 0xFF,0xFF,0xF8,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x01,0xFF,0xE0,0xFF,0xFF,0xFF, 0xFF,0xFF,0x00,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0xFF,0xFF,0xFF, 0xFF,0xC0,0x1F,0xFF,0xFF,0x80,0x00,0x40,0x00,0x00,0x00,0xFF,0x80,0xFF,0xFF,0xFF, 0x80,0x07,0xFF,0xFF,0xFF,0xC0,0x00,0xC0,0x00,0x00,0x01,0xFF,0x01,0xFF,0xFF,0xF8 ,0x00,0xFF,0xFF,0xFF,0xFF,0xE0,0x63,0x80,0x00,0x00,0x01,0xFE,0x01,0xFF,0x18,0x00, 0x3F,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x01,0xCC,0x01,0xFE,0x00,0x07, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x07,0xA0,0x03,0xFC,0x00,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x05,0xC0,0x03,0xC8,0x00,0x7F, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x19,0x00,0x00,0x88,0x0C,0x07, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x0C,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC0, 0x7F,0xFF,0xFF,0xFF,0xFF,0xF8,0x07,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0 x0F,0xFF,0xFE,0xFF,0xFF,0xD0,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F, 0x03,0xFF,0xF8,0xFF,0xFC,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x3F,0xFF,0xC0,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0 x00,0xFF,0xF8,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0 x00,0x1F,0xFE,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0 x00,0x0F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x78,0x00,0x00,0x00,0x00,0 x00,0x02,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x00,0x00, 0x00,0x00,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00, 0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0x80,0x00,0x00,0x00,0x00,0 x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x27,0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x04,0x80,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x01};void set12864();void setxy(uchar x,uchar y);void write_command(uchar command);void write_16byte(uint data_add);void delays(uchar count);void main(){uchar x,y,i;while(1){y="0x80"; //设置液晶上半部分坐标x="0x80";delays(2); //延时2sset12864(); //初始化12864delays(2);for(i=0;i<32;i++) //写入液晶上半图象部分{ //写入坐标setxy(x,y);write_16byte(i*16); //连续写入16字节数据y++; //y轴地址加1}y="0x80"; //设置液晶下半部分坐标x="0x88";for(i=0;i<32;i++) //写入液晶下半图象部分{setxy(x,y); //写入坐标write_16byte((32+i)*16);//连续写入16字节数据y++; //y轴地址加1}write_command(0x34); //写入扩充指令命令write_command(0x36); //显示图象}}//初始化12864子程序void set12864(){write_command(0x30); //功能设定控制字write_command(0x0c); //显示开关控制字write_command(0x01); //清除屏幕控制字write_command(0x06); //进入设定点控制字}//设置绘图坐标void setxy(uchar x,uchar y){write_command(0x34); //写入扩充指令命令write_command(y); //写入y轴坐标write_command(x); //写入x轴坐标write_command(0x30); //写入基本指令命令}//写控制命令子程序void write_command(uchar command){bit flag="1"; //12864空闲标志位while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[comwr]=command; //空闲传送控制字}void write_16byte(uint data_add){bit flag="1"; //12864空闲标志位uchar num="16"; //16个循环,连续写入16个字节for(;num>0;num--){while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据}}//延时count秒子程序void delays(uchar count){unsigned char h,i,j,k;do{for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}while(--count);}程序代码如下:#include <reg52.h>#include"INTRINS.H"#define uint unsigned int#define uchar unsigned char#define x1 0x80#define x2 0x88#define y 0x80#define comm 0#define dat 1sbit cs = P0^0;sbit std = P0^1;sbit sclk = P0^2;//sbit rst = P0^3; //Reset Signal 低电平有效void wr_lcd (uchar dat_comm,uchar content);void delay (uint us);void lcd_char(uchar x0,uchar y0,uchar k,uchar *chn); void init_lcd (void);void lcd_string(uchar x0,uchar y0,uchar k,uchar *chn);/*------------------初始化-----------------*/void init_lcd (void){// rst=1;wr_lcd (comm,0x30); /*30---基本指令动作*/wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/delay (100);wr_lcd (comm,0x06); /*光标的移动方向*/wr_lcd (comm,0x0c); /*开显示,关游标*/}/*--------------清DDRAM------------------*/void clrram (void){wr_lcd (comm,0x30);wr_lcd (comm,0x01);delay (180);}/*---------------------------------------*/void wr_lcd (uchar dat_comm,uchar content){uchar a,i,j;delay (500);a=content;cs=1;_nop_();sclk=0;_nop_();std=1;_nop_();for(i=0;i<5;i++){sclk=1;_nop_();_nop_();_nop_();sclk=0;}std=0;_nop_();sclk=1;_nop_();_nop_();_nop_();sclk=0;_nop_();if(dat_comm)std=1; //data elsestd=0; //command sclk=1;_nop_();_nop_();_nop_();sclk=0;std=0;_nop_();sclk=1;_nop_();_nop_();_nop_();sclk=0;for(j=0;j<2;j++){for(i=0;i<4;i++) {a=a<<1;std=CY;sclk=1;_nop_();_nop_();_nop_();sclk=0;}std=0;for(i=0;i<4;i++) {sclk=1;_nop_();_nop_();_nop_();sclk=0;}}}/*-----------------------------------*/void delay (uint us) //delay time{while(us--);}void delay1 (uint ms){uint i,j;for(i=0;i<ms;i++)for(j=0;j<15;j++)delay(1);}/*-------在任意位置显示一串汉字------X0为行,Y0为列,chn为所要显示的汉字串 ,k为汉字个数*/void lcd_char(uchar x0,uchar y0,uchar k,uchar *chn) {uchar adr,i;switch(x0){case 0: adr = 0x80 + y0;break; //在第1行y列显示case 1: adr = 0x90 + y0;break; //在第2行y列显示case 2: adr = 0x88 + y0;break; //在第3行y列显示case 3: adr = 0x98 + y0;break; //在第4行y列显示default: ;}wr_lcd (comm,0x30);wr_lcd (comm,adr);for(i=0;i<2*k;i++)wr_lcd (dat,chn[i]);}//在任意位置显示字符串,k为字符个数void lcd_string(uchar x0,uchar y0,uchar k,uchar *chn){uchar adr,i;switch(x0){case 0: adr = 0x80 + y0;break; //在第1行y列显示case 1: adr = 0x90 + y0;break; //在第2行y列显示case 2: adr = 0x88 + y0;break; //在第3行y列显示case 3: adr = 0x98 + y0;break; //在第4行y列显示default: ;}wr_lcd (comm,0x30);wr_lcd (comm,adr);for(i=0;i<k;i++)wr_lcd (dat,chn[i]);}/*------------------主程序--------------------*/ void main (){ uchar chn[4]={0x31,0x32,0x35,0x36};uchar b[]={"欢迎使用本程序"};init_lcd ();while (1){clrram();lcd_char(0,0,7,b);lcd_string(1,0,4,chn);delay1 (8000);}}/*********************************************************************//*文件名称:12864-01-8x8.asm SIDE: 128 X 64 DOTS */ /*模块名:12864-1 模块CONTROLLER: KS0108 */ /*创建人:zmlceo 日期:2008-12-01 *//*QQ:527717539 日期:2008-12-01 *//*功能描述:*//*其他说明:*//*版本:V1.0 *//*********************************************************************///显示/*****************//* *//* 12864lcd *//* *//* *//*****************/#include <reg52.h>#include <ctype.h>#include <string.h>#include <stdlib.h>#include <stdio.h>#include <math.h>/* Define the register command code */#define Disp_On 0x3f#define Disp_Off 0x3e#define Col_Add 0x40#define Page_Add 0xb8#define Start_Line 0xc0#define Lcd_Bus P0 //MCU P1 LCM/*sbit Mcs="P2"^3; //Master chip enablesbit Scs="P2"^4; //Slave chip enablesbit Enable="P2"^0; //6800 mode Enable singlesbit Di="P2"^5; //Data or Instrument Selectsbit RW="P2"^6; //Write or Readsbit Lcd_Rst=P2^2; //Lcm resetsbit Test_Key=P2^1;*/sbit Mcs="P2"^3; //Master chip enablesbit Scs="P2"^4; //Slave chip enablesbit Enable="P2"^2; //6800 mode Enable singlesbit Di="P2"^0; //Data or Instrument Selectsbit RW="P2"^1; //Write or Readsbit Lcd_Rst=P2^5; //Lcm resetsbit Test_Key=P1^0;//;****************************************************************/*;RS REG P2.0 DEFINE LCM DATA/INSTRUCTION PIN ;R/W REG P2.1 DEFINE LCM READ/WRITE PIN;E REG P2.2 DEFINE LCM CHIP ENABLE PIN;CS1 REG P2.3 DEFINE LCM CHIP 1 SELECT PIN;CS2 REG P2.4 DEFINE LCM CHIP 2 SELECT PIN;RSTB REG P2.5 DEFINE LCM /RESET PIN*/char code SHU1[]={/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20, 0x00,0x00};char code SHU2[]={/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21, 0x30,0x00};char code SHU8[]={/*-- 文字: 8 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22, 0x1C,0x00};char code SHU6[]={/*-- 文字: 6 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11, 0x0E,0x00};char code SHU4[]={/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F, 0x24,0x00};char code L[]={/*-- 文字: L --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20, 0x30,0x00};char code C[]={/*-- 文字: C --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00};char code D[]={/*-- 文字: D --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10, 0x0F,0x00};/*****************//* *//* 12864LCD *//* *//* *//*****************//*------------------延时子程序-----------------------------*/void delay(unsigned int t){unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/*------------------写命令到LCD------------------------------*/void write_com(unsigned char cmdcode){Di=0;RW=0;Lcd_Bus=cmdcode;delay(0);Enable=1;delay(0);Enable=0;}/*-------------------写数据到LCD----------------------------*/ void write_data(unsigned char Dispdata){Di=1;RW=0;Lcd_Bus=Dispdata;delay(0);Enable=1;delay(0);Enable=0;}/*-------------------读LCD数据----------------------------*/ unsigned char read_data(){unsigned char tmpin;Di=1;RW=1;delay(0);Enable=1;delay(0);Enable=0;tmpin=Lcd_Bus;return tmpin;}/*------------------清除内存---------------*/void Clr_Scr(){unsigned char j,k;Mcs=1;Scs=1;write_com(Page_Add+0);write_com(Col_Add+0);for(k=0;k<8;k++){write_com(Page_Add+k);for(j=0;j<64;j++)write_data(0x00);}}/*---------------------指定位置显示字符8*16-----------------------*/void hz_disp816(unsigned char pag,unsigned char col, unsigned char cod e *hzk){unsigned char j="0",i=0;for(j=0;j<2;j++){write_com(Page_Add+pag+j);write_com(Col_Add+col);for(i=0;i<8;i++) write_data(hzk[8*j+i]);}}。
12864程序,字库与自定义字符的显示

uchar code user1[]={
/*--文字:你--*/
/*--楷体_GB231212;此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x08,0x80,0x08,0x80,0x08,0x80,0x11,0x38,0x11,0xC8,0x32,0x10,0x50,0x40,
delay(1);
RES=1;
delay(10);
w_cmd(0x30);//功能设置,选着8位元模式
delay(1);
w_cmd(0x30);//选择基本指令集,因为DL与RE不能同时改变需要两个指令
delay(1);
w_cmd(0x0c);//开显示(无游标、不反白)
delay(1);
w_cmd(0x01);//clear print
12864并口输入在输入输出数据是注意时序之前由于忙检测时序写错而无法显示字库文字自定义字符注意地址与编码方式对应不然会显示乱码includesbitrsp24
/*------------------------------------
12864并口输入,在输入输出数据是注意时序
之前由于忙检测时序写错,而无法显示字库文字
{
RW=1;
RS=0;
E=1;
data_port=0xff;
while((data_port&&0x80)==0x80);//data_port&&0x80必须加上括号
E=0;
}
void w_cmd(uint dat)
{check_busy();
RS=0;
RW=0;
E=1;
data_port=dat;
stm32-12864并行驱动程序

//////////////////////////////////////////////////////////////////////////////////stm32-12864并行驱动程序////////////////////////////////////////////////////#include "delay.h" //必须配合delay.c 和delay.h 文件使用,所以要包含delay.h。
#include "display12864.h"f/********** 以下是相关引脚定义。
**************/// A 口的#define DisIO GPIOE //定义12864 要使用的I/O 端口。
#define DisClk RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。
#define DataGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7//定义12864 使用的数据引脚。
#define EN GPIO_Pin_10 //定义使能端使用的引脚/*********************************************/#define DisIOIO GPIOE //定义12864 要使用的I/O 端口。
#define DisClkIO RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。
#define RS #define RW GPIO_Pin_9GPIO_Pin_8/*光标定位函数定义结束。
*/#define x1 0x80#define x2 0x88#define y 0x80GPIO_InitTypeDef GPIOStru; //定义用于定义所以引脚为输出的变量。
lcd12864的驱动
/*****************************************************************12864的驱动显示源文件=====LCD12864.c*****************************************************************/#include <reg52.h>#include <intrins.h>/*-------- 12864的接口设置 --------*/#define LCD_DATA_PORT P2sbit LCD_RS =P1^1;sbit LCD_RW = P1^2;sbit LCD_EN = P1^3;sbit LCD_PSB =P1^4;//===================================================================== ============////============================控制基础函数=========================================////===================================================================== ============///***********************************************函数名:LCD_wait入口参数:无功能:LCD12864读忙等待的操作***********************************************/void LCD_Wait(void){LCD_DATA_PORT=0xff;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();while( LCD_DA TA_PORT&0x80 );LCD_EN=0;}/***********************************************函数名:LCD_write_comm入口参数:content:内容功能:向LCD12864写命令***********************************************/void LCD_WriteCommand(unsigned char content){LCD_RS=0;LCD_RW=0;LCD_DATA_PORT=content;_nop_();LCD_EN=1;_nop_();LCD_EN=0;}/*********************************************** 函数名:LCD_WriteByte入口参数:content:内容功能:向LCD12864写数据***********************************************/ void LCD_WriteData(unsigned char content){LCD_Wait();LCD_RS=1;LCD_RW=0;LCD_DATA_PORT=content;_nop_();LCD_EN=1;_nop_();LCD_EN=0;}/*********************************************** 函数名:LCD_ReadData入口参数:无功能:从LCD12864读数据***********************************************/ unsigned char LCD_ReadData(void){unsigned char dat=0;LCD_Wait();LCD_DATA_PORT=0xff;LCD_RS=1;LCD_RW=1;LCD_EN=0;LCD_EN=1;_nop_();dat=LCD_DA TA_PORT;return dat;}//===================================================================== ============////=======================液晶的初始化设置==========================================////===================================================================== ============///***********************************************函数名:LCD_Init入口参数:无功能:LCD12864的初始化设置***********************************************/void LCD_Init(void){unsigned char i=0xff;LCD_PSB=1; //控制方式选择并口while(i--); //启动需要一定的延时LCD_WriteCommand ( 0x30 ); //中文模式LCD_WriteCommand ( 0x30 );LCD_WriteCommand ( 0x0c ); //显示设置LCD_WriteCommand ( 0x06 );LCD_WriteCommand ( 0x01 ); //清屏}//===================================================================== ============////==================文本模式下有关的驱动控制=======================================////===================================================================== ============///***********************************************函数名:LCD_Clear入口参数:无功能:LCD12864的清屏函数***********************************************/void LCD_Clear(void){LCD_WriteCommand(0x01);}/***********************************************函数名:LCD_Locate入口参数:y:行;x:列功能:定位光标***********************************************/void LCD_Locate(unsigned char y,unsigned char x){switch( y ){case 0 :LCD_WriteCommand ( 0x80+x );break;case 1 :LCD_WriteCommand ( 0x90+x );break;case 2 :LCD_WriteCommand ( 0x88+x );break;case 3 :LCD_WriteCommand ( 0x98+x );break;default :break;}}/***********************************************函数名:LCD_PutString入口参数:*ptr:数据指针;功能:显示字符串***********************************************/void LCD_PutString(unsigned char *ptr){while(*ptr != '\0'){LCD_WriteData(*ptr++);}}/***********************************************函数名:LCD_PutString_Add入口参数:*ptr:数据指针;功能:指定位置显示字符串***********************************************/void LCD_PutString_Add(unsigned char y,unsigned char x,unsigned char *ptr) {LCD_Locate(y,x);LCD_PutString(ptr);}/***********************************************函数名:LCD_ClearScreen入口参数:无功能:图形模式下的清屏函数***********************************************/void LCD_ClearScreen(void){unsigned char i;unsigned char j;LCD_WriteCommand( 0x34 );LCD_WriteCommand( 0x36 );for(j=0;j<64;j++){LCD_WriteCommand( 0x80+j ) ; //yLCD_WriteCommand( 0x80 ) ; //xfor(i=0;i<16;i++){LCD_WriteData( 0x00 ) ;LCD_WriteData( 0x00 ) ;}}LCD_WriteCommand( 0x30 ); //返回文本模式}/***********************************************函数名:LCD_DrawPixel入口参数:无功能:图形模式下的画点函数***********************************************/void LCD_DrawPixel(unsigned char x, unsigned char y, unsigned char Color) {unsigned char Row , Tier , Tier_bit ;unsigned char temp_h, temp_l ;if((x>127)||(y>63)) //超范围{return ;}LCD_WriteCommand( 0x34 ) ; //图形模式LCD_WriteCommand( 0x36 ) ; //开图形显示Tier = x>>4;Tier_bit = x&0x0f;if(y < 32){Row = y;}else{Row = y - 32 ;Tier += 8 ;}LCD_WriteCommand( Row + 0x80 ) ;LCD_WriteCommand( Tier + 0x80 ) ;LCD_ReadData() ; //假读temp_h = LCD_ReadData() ;temp_l = LCD_ReadData() ;LCD_WriteCommand( Row + 0x80 ) ;LCD_WriteCommand( Tier + 0x80 ) ;if( Tier_bit < 8 ){switch( Color){case 0 : temp_h &=( ~( 0x01 << ( 7 - Tier_bit ))) ; break ;case 1 : temp_h |= ( 0x01 << ( 7 - Tier_bit )) ; break ;case 2 : temp_h ^= ( 0x01 << ( 7 - Tier_bit )) ; break ;default : break ;}}else{switch(Color){case 0 : temp_l &= (~( 0x01 << ( 15 - Tier_bit ))) ; break ;case 1 : temp_l |= ( 0x01 << ( 15 - Tier_bit )) ; break ;case 2 : temp_l ^= ( 0x01 << ( 15 - Tier_bit )) ; break ;default : break ;}}LCD_WriteData( temp_h ) ;LCD_WriteData( temp_l ) ;LCD_WriteCommand( 0x30 ) ; //返回文本模式}/***********************************************函数名:LCD_DrawLine_X入口参数:无功能:图形模式下的画点函数***********************************************/void LCD_DrawLine_X(unsigned char y0, unsigned char x0, unsigned char x1, unsigned char fColor){unsigned char n;if(x0 > x1){n = x1;x1 = x0;x0 = n;}if(fColor==2){for(n=x0; n <= x1; n++){if(n%2==0){LCD_DrawPixel(n, y0, 0);}else{LCD_DrawPixel(n, y0, 1);}}}else{for(n=x0; n <= x1; n++){LCD_DrawPixel(n, y0, fColor);}}}/***********************************************函数名:LCD_DrawLine_Y入口参数:无功能:图形模式下的画点函数***********************************************/void LCD_DrawLine_Y(unsigned char x0, unsigned char y0, unsigned char y1, unsigned char fColor){unsigned char n;if(y0 > y1){n = y1;y1 = y0;y0 = n;}if(fColor==2){for(n=y0; n <= y1; n++){if(n%2==0){LCD_DrawPixel(x0, n, 1);}else{LCD_DrawPixel(x0, n, 0);}}}else{for(n=y0; n <= y1; n++){LCD_DrawPixel(x0, n, fColor);}}}/***********************************************函数名:LCD_DrawLine入口参数:无功能:图形模式下的画线函数***********************************************/void LCD_DrawLine(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char Color ){/*根据屏幕大小改变变量类型(如改为int 型)*/unsigned char t, distance;unsigned char x=0, y=0;char delta_x, delta_y ;char incx, incy;if((x0>127)||(x1>127)||(y0>63)||(y1>63)) //超出显示范围{return ;}delta_x = x1 - x0;delta_y = y1 - y0;//=================================//if(delta_x > 0){incx = 1;}else if(delta_x == 0){LCD_DrawLine_Y(x0, y0, y1, Color);return;}else{delta_x = -delta_x; //绝对值incx = -1 ;}//=================================//if(delta_y > 0){incy = 1;}else if(delta_y == 0){LCD_DrawLine_X(y0, x0, x1, Color);return;}else{delta_y = -delta_y; //绝对值incy = -1;}//=================================//if(delta_x > delta_y){distance = delta_x ;}else{distance = delta_y ;}//=================================///* Draw Line*/for(t=0; t <= distance+1; t++ ){LCD_DrawPixel(x0, y0, Color) ;x += delta_x ;y += delta_y ;if(x > distance){x -= distance ;x0 += incx ;}if(y > distance){y -= distance ;y0 += incy ;}}}/*************************** 结束*********************************/。
LCD12864程序
}
/*======================================
显示框架函数
=======================================*/
void disp_frame(void)
wr_lcd (dat,0x11);
}
else if((i%2==1)&&(i!=7)&&(j%4==0))
{
wr_lcd (dat,0x00);
wr_lcd (dat,0x01);
}
else
{
wr_lcd (dat,0x00);
wr_lcd (dat,0x00);
}
}
}
//wr_lcd (comm,0x36);//扩展功能:绘图显示开
wr_lcd (comm,0x30); //进入基本指令动作,8位MPU
wr_lcd (comm,0x01); //清DDRAM
wr_lcd (comm,0x06); //光标左移,AC自动加一
wr_lcd (comm,0x0c); //开显示,关游标
clear_Wdisp();//清除GDRAM
disp_frame();
wr_lcd (comm,0x30);//确保在基本指令模式,此模式下所写的数据存在DDRAM中
wr_lcd (comm,r); //列地址
wr_lcd (comm,c); //行地址,此处的行地址只能是0x80或0x90
wr_lcd (dat,word1); //以(x,y)为起点的8*16区域内显示一个字符,格式为'字符',如显示a则写为'a'。
12864程序
include<reg52.h>#include <math.h>void lcd_init(void);void clr_lcd(void);void send_com(unsigned char cmd);void send_data(unsigned char dat);void chek_busy(void);void set_xy(unsigned char xpos,unsigned char ypos);void print(unsigned char x,unsigned char y,char* str);void printstr(unsigned char xpos,unsigned char ypos,unsigned charstr[],unsigned char k);unsigned char code buf[4] ={0xbb,0xb6,0xd3,0xad};//欢迎#define DATA P2#define CONTROL P0#define E 7 //并行的使能信号 sbit E = P0^7#define RW 6 //并行的读写信号 sbit RW = P0^6#define RS 5 //并行的指令数据选择信号 sbit RS = P0^5#define PSB 4 //并/串行接口选择 sbit PSB = P0^4#define RST 3 //复位低电平有效 sbit RST = P0^3#define SETB(x,y) (x|=(1<<y))#define CLRB(x,y) (x&=(~(1<<y)))#define CHKB(x,y) (x&(1<<y))/********************测忙碌**********************///测忙碌子程序//RS=0,RW=1,E=H,D0-D7=状态字/************************************************/void chek_busy(void){ unsigned char temp1;//状态信息(判断是否忙)CLRB(CONTROL,RS); // RS = 0;SETB(CONTROL,RW); // RW = 1;SETB(CONTROL,E); // E = 1;do{temp1 = DATA;DATA=0xFF;} while(temp1&0x80);SETB(CONTROL,E); // E = 1;DATA=0xFF;}/********************写命令**********************///写命令子程序///************************************************/void send_com(unsigned char cmd)/*写命令*/{chek_busy();CLRB(CONTROL,RS); //RS = 0;CLRB(CONTROL,RW); //RW = 0;DATA = cmd;SETB(CONTROL,E); //E = 1;CLRB(CONTROL,E); //E = 0;}/********************写数据**********************///写数据子程序///************************************************/void send_data(unsigned char dat){chek_busy();SETB(CONTROL,RS); //RS = 1;CLRB(CONTROL,RW); //RW = 0;DATA = dat;SETB(CONTROL,E); //E = 1;CLRB(CONTROL,E); //E = 0;}/********************初始化**********************///复位、通讯方式选择/************************************************/void lcd_init(void){SETB(CONTROL,RST);//复位RST=1SETB(CONTROL,PSB); //通讯方式为并口PSB = 1//send_com(0x34);//34H--扩充指令操作send_com(0x30);//功能设置,一次送8位数据,基本指令集send_com(0x0C);//0000,1100 整体显示,游标off,游标位置offsend_com(0x01);//0000,0001 清DDRAMsend_com(0x02);//0000,0010 DDRAM地址归位send_com(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC }/*******************************************************************/ // 设置显示位置 xpos(1~16),tpos(1~4)/*******************************************************************/ void set_xy(unsigned char xpos,unsigned char ypos){switch(ypos){case 1:send_com(0X80|xpos);break;case 2:send_com(0X90|xpos);break;case 3:send_com(0X88|xpos);break;case 4:send_com(0X98|xpos);break;default:break;}}/*******************************************************************/ // 在指定位置显示字符串/*******************************************************************/ void print(unsigned char x,unsigned char y,char* str){unsigned char lcd_temp;set_xy(x,y);lcd_temp=*str;while(lcd_temp != 0x00){send_data(lcd_temp);lcd_temp=*(++str);}}/********************写字符串******************///写字符串子程序//xpos1取0~7共八列,ypos1取0~3共四行。
12864程序
void lcd_disp(unsigned char x,unsigned char y){unsigned char da[8];unsigned char j;y = 63-y;for(j=1;j<7;j++)da[j] = 0x0;{// 绘制边框da[0]=0x01;da[7]=0x80;if((x==0)||(x==127)){for(j=0;j<8;j++)da[j] = 0xff;}}if(x%5==0)da[pointY>>3] |= 0x01 《(pointY&0x07);// 绘制由变量pointY 控制的水平游标线if(x==pointX)// 绘制由变量pointX 控制的垂直游标线for(j=0;j<64;j++)if(j%5==0)da[j>>3] |= 0x01 《(j&0x07);da[y/8] |= 0x01《(y%8);// 绘制信号波形lcd_row_wr(x,da);}五、图形液晶LCD12864数字符号显示图形点阵LCD 显示数字,原理是把数字以点阵的形式取模,再把点阵模写入特定的LCD 空间即可,首先来看数字取模,如图7 所示,对数字“0”按8×5点取模。
纵向看,8 点一列,从上至下对应bit0 到bit7,我们用1 表示“亮”,0 表示“暗”,从左至右,依次确定为0111 1100,即0x7c ;1000 0010,即0x82 ;10000010,即0x82 ;1000 0010,即0x82 ;0111 1100,即0x7c ;如果我们依次将这5 个字节写入LCD 某页连续5个地址空间,LCD 上就会显示“0”。
下面我们把数字变量在LCD 上动态显示,就是数值变了,显示跟着变。
字符显示LCD 驱动函数,实现8×n 点阵字符写入函数。
void lcd_put_xyns(unsigned char x,y,n,unsigned char *s){unsigned char i;for(i=0;i<n;i++){if((x+i)>63){lcd_cmd_wr(ORGY+y,1);lcd_cmd_wr(ORGX+x+i-64,1);lcd_dat_wr(s[i],1);}else {lcd_cmd_wr(ORGY+y,0);lcd_cmd_wr(ORGX+x+i,0);lcd_dat_wr(s[i],0);}}}参数:“x, y”是坐标,这里y 是页坐标,取值从0 到7,“n”是点阵模字节数,“*s”是点阵模起始地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//---------------************----------------------------------------------//------------------*****************--------------------------------------//12864的C文件应包含单片机库文件,端口设置以及各种根据时序图得来的功能函数。
//其中最基本的是读写和检查忙函数,并串口的区别就在于读写和检查函数以及端口设置//主函数需包括声明函数库文件subfuncs.h及显示内容库文件dispdata.h。
////1、12864如只想写一个字符的话,先发送地址指令,再发送那个字符的十六进制ASCII // 数据内容给12864.这跟串口操作原理一样。
//2、如数组中存储一个数字,要显示这个数字,记得要用这个语句:// Write_Data(dN[i]+0x30);//--------------------*******************----------------------------------//-----------------------******************--------------------------------#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;//端口配置#define LCD_DataIn P4DIR=0x00 //数据口方向设置为输入#define LCD_DataOut P4DIR=0xff //数据口方向设置为输出#define LCD2MCU_Data P4IN#define MCU2LCD_Data P4OUT#define LCD_CMDOut P3DIR|=0x07 //P3口的低三位设置为输出#define LCD_RS_H P3OUT|=BIT0 //P3.0#define LCD_RS_L P3OUT&=~BIT0 //P3.0#define LCD_RW_H P3OUT|=BIT1 //P3.1#define LCD_RW_L P3OUT&=~BIT1 //P3.1#define LCD_EN_H P3OUT|=BIT2 //P3.2#define LCD_EN_L P3OUT&=~BIT2 //P3.2/*******************************************函数名称:Delay_1ms功能:延时约1ms的时间参数:无返回值:无********************************************/void Delay_1ms(void){uchar i;for(i = 150;i > 0;i--) _NOP();}/*******************************************************************函数名称:Delay_Nms功能:延时N个1ms的时间参数:n--延时长度返回值:无注意:如果知道系统MCLK为8Mhz,且没用到定时器A则可用以下函数精确定时Nms。
真的要使用以下函数时,复制粘贴其函数体内容到Delay_Nms函数内容即可,无需改Delay_Nms其名字,否则12864下面的函数将调用不了Delay_Nms函数。
函数名称:DelayNus功能:实现N个微秒的延时参数:n--延时长度返回值:无说明:函数通过定时器A取得精确的定时时间!!!定时器A的计数时钟是1MHz,CPU主频8MHz所以通过定时器延时能够得到极为精确的us级延时注意:定时器A使用的时钟源可设置为SMCLK,定时一定时间时,可设置时钟源、分频数、CCR0、计数模式,等待到中断标志TAIFG置位时停止计数,不必进入中断!也进入不了中断!要想进入中断程序,设置CCR0前,必须设置CCIFG中断标志位才能进入中断!也就是,在设置CCR0前,需编写这么一句:CCTL0 = CCIE; //设置捕捉CCIFG中断。
void DelayNus(uint n){TACTL |= TASSEL_2 + ID_3;//计数时钟选择SMLK=8MHz,1/8分频后为1MHzCCR0 = n; //1Mhz的计数时钟,则CCR0=1时捕捉的是1usTACTL |= MC_1; //增计数到CCR0while(!(TACTL & BIT0)); //等待定时Nus后置位中断标志TAIFGTACTL &= ~MC_1; //停止计数,在于清除了计数器设置!TACLR=1。
TACTL &= ~BIT0; //清除中断标志}*****************************************************************************/void Delay_Nms(uint n){uint i;for(i = n;i > 0;i--) Delay_1ms();}/*******************************************函数名称:Check_Busy功能:检查忙标志,一直到系统不忙为止参数:无返回值:无********************************************/void Check_Busy(void){uchar lcdtemp = 0;LCD_CMDOut; //P3口的低三位设置为输出LCD_RS_L;LCD_RW_H; //先读忙LCD_DataIn; //P4端口设置为输出do //判忙判断的是最高位数据{LCD_EN_H; //EN高_NOP(); //等一段时间lcdtemp = LCD2MCU_Data; //读取LCD忙碌状态LCD_EN_L; //EN低}while(lcdtemp & 0x80); //一直等到LCD不忙为止才跳出函数}/*******************************************函数名称:Write_Cmd功能:向液晶中写控制命令参数:cmd--控制命令返回值:无明确:向液晶写控制命令和显示数据的时序图都相同指令RS低,数据RS高********************************************/void Write_Cmd(uchar cmd){Check_Busy();LCD_DataOut;LCD_RS_L;LCD_RW_L;MCU2LCD_Data = cmd;LCD_EN_H;_NOP();LCD_EN_L;}/*******************************************函数名称:Write_Data功能:向液晶中写显示数据参数:dat--显示数据返回值:无********************************************/void Write_Data(uchar dat){Check_Busy();LCD_DataOut;LCD_RS_H;LCD_RW_L;MCU2LCD_Data = dat;LCD_EN_H;_NOP();LCD_EN_L;}/******************************************* 函数名称:Read_Data功能:从液晶中读取数据参数:无返回值:RData--液晶内部字符型数据********************************************/ uchar Read_Data(void){uchar RData;LCD_DataIn;Check_Busy();LCD_RS_H;LCD_RW_H;LCD_EN_L;LCD_EN_H;RData=LCD2MCU_Data;LCD_EN_L;return RData; //将LCD状态字返回给函数}/******************************************* 函数名称:Ini_Lcd功能:初始化液晶模块参数:无返回值:无********************************************/ void Ini_Lcd(void){LCD_CMDOut; //液晶控制端口设置为输出Delay_Nms(500);Write_Cmd(0x30); //基本指令集Delay_1ms();Write_Cmd(0x02); // 地址归位Delay_1ms();Write_Cmd(0x0c); //整体显示打开,游标关闭Delay_1ms();Write_Cmd(0x01); //清除显示Delay_1ms();Write_Cmd(0x06); //游标右移Delay_1ms();Write_Cmd(0x80); //设定显示的起始地址}/*******************************************函数名称:Disp_HZ功能:控制液晶显示汉字参数:addr--显示位置的首地址pt--指向显示数据的指针,其实指向一个汉字的编码num--显示字符个数返回值:无明确:写的命令对应的是液晶地址在于命令是在内部ROM里面!写的数据对应的是显示内容********************************************/void Disp_HZ(uchar addr,const uchar * pt,uchar num){uchar i;Write_Cmd(addr);for(i = 0;i < (num*2);i++)Write_Data(*(pt++));}/*******************************************函数名称:Lcd_Print功能:在坐标(x,y)处连续显示一个字符串!x*y=8*4=32处位置。
参数:x--------------取数字0-7,在于一行显示8个字y--------------取数字0-3,在于一列显示4个字adata----------指向显示字符串数据(汉字或字母或数字或符号)的指针返回值:无********************************************/void Lcd_Print(uchar x,uchar y,uchar *adata){uchar address;uchar i=0;{case 0:address=0x80+x;break;case 1:address=0x90+x;break;case 2:address=0x88+x;break;case 3:address=0x98+x;break;default:break;}Write_Cmd(address);while(*(adata+i)){Write_Data(*(adata+i));i++;}}/*******************************************函数名称:Clear_GDRAM----->如何理解?功能:清除液晶GDRAM中的随机数据参数:无返回值:无********************************************/void Clear_GDRAM(void){uchar i,j,k;Write_Cmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++) //32行{Write_Cmd(i++);Write_Cmd(0x80); //设定显示的起始地址for(k = 0;k < 16;k++) //16列{Write_Data(0x00);}}i = 0x80;for(j = 0;j < 32;j++){Write_Cmd(i++);Write_Cmd(0x88);for(k = 0;k < 16;k++){Write_Data(0x00);}Write_Cmd(0x30); //回到基本指令集}/*******************************************函数名称:Draw_PM功能:在整个液晶屏幕上画图,显示一幅128*64的图画参数:图形指针*ptr返回值:无注意:尚未理解此函数********************************************/void Draw_PM(const uchar *ptr){uchar i,j,k;Write_Cmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++) //一行有32个字节共128位{Write_Cmd(i++); //一行的字节地址xWrite_Cmd(0x80); //一列的字节地址yfor(k = 0;k < 16;k++) //一列有16个字节共64位{Write_Data(*ptr++); //写入内容}}i = 0x80;for(j = 0;j < 32;j++){Write_Cmd(i++);Write_Cmd(0x88);for(k = 0;k < 16;k++){Write_Data(*ptr++);}}Write_Cmd(0x36); //打开绘图显示Write_Cmd(0x30); //回到基本指令集}/*********************************************************** 函数名:Disp_Picture函数说明:显示一幅128*64的图画传入参数:图形指针*img传出参数:无**********************************************************/ void Disp_Picture(uchar *img){uchar i,j;for(j=0;j<32;j++){for(i=0;i<8;i++){Write_Cmd(0x34); //打开扩展指令集Write_Cmd(0x80+j);Write_Cmd(0x80+i);Write_Cmd(0x30); //回到基本指令集Write_Data(img[j*16+i*2]);Write_Data(img[j*16+i*2+1]);}}for(j=32;j<64;j++){for(i=0;i<8;i++){Write_Cmd(0x34);Write_Cmd(0x80+j-32);Write_Cmd(0x80+(i+8));Write_Cmd(0x30);Write_Data(img[j*16+i*2]);Write_Data(img[j*16+i*2+1]);}}Write_Cmd(0x36); //打开绘图显示}/*******************************************函数名称:Draw_TX功能:显示一个16*16大小的图形参数:Yaddr--Y地址Xaddr--X地址dp--指向图形数据存放地址的指针返回值:无********************************************/void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp){uchar j;uchar k=0;Write_Cmd(0x01); //清屏,只能清除DDRAMWrite_Cmd(0x34); //使用扩展指令集,关闭绘图显示for(j=0;j<16;j++){Write_Cmd(Yaddr++); //Y地址Write_Cmd(Xaddr); //X地址Write_Data(dp[k++]);Write_Data(dp[k++]);}Write_Cmd(0x36); //打开绘图显示Write_Cmd(0x30); //回到基本指令集模式}/***********************************************************函数名:DispU_Picture函数说明:上半屏显示一幅128*32的图画传入参数:图形指针*img传出参数:无返回值:无**********************************************************/void DispU_Picture(uchar *img){uchar i,j;for(j=0;j<32;j++){for(i=0;i<8;i++){Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示Write_Cmd(0x80+j);Write_Cmd(0x80+i);Write_Cmd(0x30); //回到基本指令集模式Write_Data(img[j*16+i*2]);Write_Data(img[j*16+i*2+1]);}}Write_Cmd(0x36);}/***********************************************************函数名:DispD_Picture函数说明:下半屏显示一幅128*32的图画传入参数:图形指针*img传出参数:无返回值:无**********************************************************/void DispD_Picture(uchar *img){uchar i,j;for(j=0;j<32;j++){for(i=0;i<8;i++){Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示Write_Cmd(0x80+j);Write_Cmd(0x80+(i+8));Write_Cmd(0x30); //回到基本指令集模式Write_Data(img[j*16+i*2]);Write_Data(img[j*16+i*2+1]);}}Write_Cmd(0x36);}/***********************************************************函数名:Draw_Point函数说明:画点传入参数:打点位置(x0,y0);color=1,点亮;color=0,擦除传出参数:无返回值:无**********************************************************/void Draw_Point(uchar x,uchar y,uchar color){uchar row,collum,cbite;uchar tempH,tempL;Write_Cmd(0x34);Write_Cmd(0x36);collum=x>>4;cbite=x&0x0f;if(y<32)row=y;else{ row=y-32;collum+=8;}Write_Cmd(0x80+row);Write_Cmd(0x80+collum);Read_Data();tempH=Read_Data();tempL=Read_Data();Write_Cmd(0x80+row);Write_Cmd(0x80+collum);{if(cbite<8){tempH|=(1<<(7-cbite));//tempL=(1<<(7-cbite));}else{//tempH=(1<<(15-cbite));tempL|=(1<<(15-cbite));}}else{if(cbite<8){tempH&=~(1<<(7-cbite));//tempL=(1<<(7-cbite));}else{//tempH=(1<<(15-cbite));tempL&=~(1<<(15-cbite));}}Write_Data(tempH);Write_Data(tempL);Write_Cmd(0x30);}/*********************************************************** 函数名:Draw_RowLine函数说明:画水平线传入参数:(x0,y0),水平线的起点;(x1,y0)水平线的终点color=1,点亮;color=0,擦除传出参数:无返回值:无**********************************************************/ void Draw_RowLine(uchar x0,uchar y0,uchar x1,uchar color){uchar temp;if(x0>x1) // 对x0、x1大小进行排列,以便画图{temp = x1;x0 = temp;}do{Draw_Point(x0, y0, color); // 逐点显示,描出垂直线x0++;}while(x1>=x0);}/*********************************************************** 函数名:Draw_CollumLine函数说明:画竖直线传入参数:(x0,y0),竖直线的起点;(x0,y1)竖直线的终点;color=1,点亮;color=0,擦除传出参数:无返回值:无************************************************************/ void Draw_CollumLine(uchar x0,uchar y0,uchar y1,uchar color){uchar temp;if(y0>y1){temp=y0;y0=y1;y1=temp;}while (y0<=y1){Draw_Point(x0,y0,color);y0++;}}/************************************************************* 函数名:Draw_Line函数说明:使用Bresenham法,画任意两点间的直线传入参数:(x0,y0),竖直线的起点;(x1,y1)竖直线的终点color=1,点亮;color=0,擦除传出参数:无返回值:无*************************************************************/ void Draw_Line(uchar x0,uchar y0,uchar x1,uchar y1,uchar color){int dx; // 直线x轴差值变量int dy; // 直线y轴差值变量char dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向int dx_2; // dx*2值变量,用于加快运算速度int dy_2; // dy*2值变量,用于加快运算速度int di; // 决策变量dx = x1-x0; // 求取两点之间的差值dy = y1-y0;if (dx<0) dx_sym=-1;else{if(dx>0) dx_sym=1;else{Draw_CollumLine(x0,y0,y1,color);return;}}if(dy>0) dy_sym=1;else{if(dy<0) dy_sym=-1;else{Draw_RowLine(x0,y0,x1,color);return;}}dx=dx_sym*dx;dy=dy_sym*dy;dx_2=dx*2;dy_2=dy*2;if(dx>=dy){di=dy_2-dx;while(x0!=x1){Draw_Point(x0,y0,color);x0+=dx_sym;if(di<0) di+=dy_2;else {di+=dy_2-dx_2;y0+=dy_sym;}}Draw_Point(x0,y0,color);}else{di=dx_2-dy;while(y0!=y1){Draw_Point(x0,y0,color);y0+=dy_sym;if(di<0) di+=dx_2;else {di+=dx_2-dy_2;x0+=dx_sym;}}Draw_Point(x0,y0,color);}}。