12864液晶串行驱动函数

合集下载

串口12864液晶&矩阵键盘驱动

串口12864液晶&矩阵键盘驱动
#include<reg52.h>
#define U8 unsigned char
#define U16 unsigned int
#include<intrins.h>
#define uchar unsigned char
sbit sclk=P0^0; //时钟数据传送端口
sbit sid=P0^1; //串行数据
send_dat(cmd&0xf0); //
send_dat((cmd&0x0f)<<4); //
}
void write_char(U8 dat)
{
check_busy();
send_dat(0xfa);//rw=0;rs=1
send_dat(dat&0xf0);
sclk=1;
}
}
U8 get_byte() //获取数据
{
U8 i,temp1=0,temp2=0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
sclk = 0;
send_cmd(0X98|x_add);break;
default:break;
}
}
void lcd_wstr(U8 y_add , U8 x_add , U8 *str) //
{
U8 i;
lcd_pos(y_add , x_add);
lcd_pos(y_add , x_add);
d[4]=figer%10;
d[3]=figer%100/10;
d[2]=figer%1000/100;

12864液晶屏(带字库)51单片机3线串口驱动程序

12864液晶屏(带字库)51单片机3线串口驱动程序

#include<reg51.h>typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uitn32;sbit CS = P1^0;//片选信号引脚sbit SDA = P1^1;//数据线sbit SCK = P1^2;//串行时钟线//sbit RST = P1^3;//复位引脚//sbit PSB = P1^4;//串并控制引脚code uint8 strint1[] = "I Love You !";/*void delay5ms(void) //误差0us {unsigned char a,b;for(b=185;b>0;b--)for(a=12;a>0;a--);}*///发送一个字节void Send_Byte(uint8 dat){uint8 i;SCK = 0;for(i=0;i<8;i++){SDA = dat&0x80;SCK = 1;dat <<= 1;SCK = 0;}}//读取一个字节数据uint8 Read_Byte(void){uint8 i;uint16 byte = 0;SCK = 0;for(i=0;i<16;i++){byte <<= 1;SCK = 1;if(SDA)byte |= 0x0001;SCK = 0;}byte = ((byte>>4)|(byte>>8))&0x00ff;return ((uint8)(byte));}//读忙标志void Read_Busy(void){uint8 temp;CS = 1;do{Send_Byte(0xfc);//发送读命令temp = Read_Byte();//读取数据}while(temp&0x80);CS = 0;}//发送命令void Write_Cmd(uint8 cmd){uint8 temph = 0;uint8 templ = 0;//制作发送命令格式temph = cmd & 0xf0;templ = (cmd & 0x0f) << 4;Read_Busy();CS = 1;Send_Byte(0XF8);//发送命令命令//发送命令Send_Byte(temph);Send_Byte(templ);CS = 0;}//发送数据void Write_Dat(uint8 dat){uint8 temph = 0;uint8 templ = 0;//制作发送数据格式temph = dat & 0xf0;templ = (dat & 0x0f) << 4;Read_Busy();CS = 1;Send_Byte(0XFA);//发送数据命令Send_Byte(temph);//发送数据Send_Byte(templ);CS = 0;}//在指定位置显示半字宽字符void Dis_HCGROM(uint8 x,uint8 y,uint8 dat) {uint8 addr;switch(y){case 0:addr = 0x80 + x;break;case 1:addr = 0x90 + x;break;case 2:addr = 0x88 + x;break;case 3:addr = 0x98 + x;break;default:break;}Write_Cmd(addr);Write_Dat(dat);}//指定位置显示字符串void Dis_String(uint8 x, uint8 y, uint8 len, uint8 *dat) {uint8 addr,i;switch(y){case 0:addr = 0x80 + x;break;case 1:addr = 0x90 + x;break;case 2:addr = 0x88 + x;break;case 3:addr = 0x98 + x;break;default:break;}Write_Cmd(addr);for(i = 0;i < len;i++){Write_Dat(*dat++);}}//制定位置显示8位无符号数字void Dis_UNum8(uint8 x,uint8 y,uint8 dat){uint8 addr;switch(y){case 0:addr = 0x80 + x;break;case 1:addr = 0x90 + x;break;case 2:addr = 0x88 + x;break;case 3:addr = 0x98 + x;break;default:break;}Write_Cmd(addr);Write_Dat(dat/100%10+'0');Write_Dat(dat/10%10+'0');Write_Dat(dat/1%10+'0');}//制定位置显示16位无符号数字void Dis_UNum16(uint8 x,uint8 y,uint8 dat) {uint8 addr;switch(y){case 0:addr = 0x80 + x;break;case 1:addr = 0x90 + x;break;case 2:addr = 0x88 + x;break;case 3:addr = 0x98 + x;break;default:break;}Write_Cmd(addr);Write_Dat(dat/10000%10+'0');Write_Dat(dat/1000%10+'0');Write_Dat(dat/100%10+'0');Write_Dat(dat/10%10+'0');Write_Dat(dat/1%10+'0');}//在指定位置显示汉字//x范围:0-7,y范围:0-3//dat:汉字字形码void Dis_GB(uint8 x,uint8 y,uint16 dat) {uint8 addr;switch(y){case 0:addr = 0x80 + x;break;case 1:addr = 0x90 + x;break;case 2:addr = 0x88 + x;break;case 3:addr = 0x98 + x;break;default:break;}Write_Cmd(addr);Write_Dat((uint8)(dat >> 8));Write_Dat((uint8)(dat));}//LCD初始化void LCD_Init(void){/*RST = 0;delay5ms();delay5ms();RST = 1;PSB = 0;*/Write_Cmd(0X30);Write_Cmd(0X01);Write_Cmd(0X02);Write_Cmd(0X0C);}void main(void){LCD_Init();while(1){Dis_GB(0,0,0xc9b5);Dis_HCGROM(1,0,0x03);Dis_String(0,1,13,strint1);Dis_UNum8(0,2,250);} }。

STM32驱动12864液晶屏

STM32驱动12864液晶屏

STM32驱动12864液晶屏#include "stm32f10x_lib.h"#define uint unsigned int#define uchar unsigned char#define RSH GPIO_SetBits(GPIOA,GPIO_Pin_0)#define RSL GPIO_ResetBits(GPIOA,GPIO_Pin_0)#define RWH GPIO_SetBits(GPIOA,GPIO_Pin_1)#define RWL GPIO_ResetBits(GPIOA,GPIO_Pin_1)#define ENH GPIO_SetBits(GPIOA,GPIO_Pin_2)#define ENL GPIO_ResetBits(GPIOA,GPIO_Pin_2)#define CS1H GPIO_SetBits(GPIOA,GPIO_Pin_3)#define CS1L GPIO_ResetBits(GPIOA,GPIO_Pin_3)#define CS2H GPIO_SetBits(GPIOA,GPIO_Pin_4)#define CS2L GPIO_ResetBits(GPIOA,GPIO_Pin_4)void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void Delay();uchar table[][16]={/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00 ,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00 ,/*-- 文字: 爸 --*//*-- 文字: 一 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00 ,0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00 ,/*-- 文字: 的 --*//*-- 宋体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 ,/*-- 文字: 成 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x48,0x48,0x48,0xC8,0x08,0xFF,0x08,0x09,0x0A,0xC8,0x88,0x08,0x00 ,0x40,0x30,0x0F,0x00,0x08,0x50,0x4F,0x20,0x10,0x0B,0x0C,0x12,0x21,0x40,0xF0,0x00 ,/*-- 文字: 果 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x3E,0x2A,0x2A,0x2A,0xFE,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00 ,0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x09,0x11,0x31,0x11,0x00 ,};void Write_cmd_left(uchar cmd) {RSL;RWL;CS1H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_cmd_right(uchar cmd) {RSL;RWL;CS2H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void Write_data_left(uchar data) {RSH;RWL;CS2L;CS1H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_data_right(uchar data) {RSH;RWL;CS1L;CS2H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void led_disp(uchar *p,uchar lr) {uchar i,cl,cr;if(lr=='L'){for(i=0;i<16;i++){cl=*p;p++;Write_data_left(cl);}}if(lr=='R'){for(i=0;i<16;i++){cr=*p;p++;Write_data_right(cr);}}}void clear(){uchar i,j,disp_page;for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_left(disp_page);Write_cmd_left(0x40);for(j=0;j<64;j++)Write_data_left(0x00);}for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_right(disp_page);Write_cmd_right(0x40);for(j=0;j<64;j++)Write_data_right(0x00);}}void init(){Write_cmd_left(0x30);Delay(10);Write_cmd_right(0x30);Delay(10);Write_cmd_left(0x3f);Delay(10);Write_cmd_right(0x3f);Delay(10);Write_cmd_left(0xc0);Delay(10);Write_cmd_right(0xc0);}int main(void){/* Infinite loop */RCC_Configuration();NVIC_Configuration();GPIO_Configuration();clear();Delay(10);init();Delay(10);uchar i;while(1){Write_cmd_left(0xb8);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i],'L');Write_cmd_left(0xb8+1);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i+1],'L');Write_cmd_right(0xb8);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+8],'R');Write_cmd_right(0xb8+1);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+9],'R');}}/*******************************************************************************Function Name :RCC_Configuration.*Descriprion :configures the different system clocks.*Input :None*Output :None*Return :None******************************************************************************* /void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;/*RCC system reset(for debug purpose)*/RCC_DeInit();/*Enable HSE 打开外部时钟*/RCC_HSEConfig(RCC_HSE_ON);/*Wait till HSE is read */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS)//起振成功{/*Enable PrefetchBuffer 打开flash的预存储功能*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);//设置代码延时值/*HCLK=syclk*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);/*RCLK1=HCLK*/RCC_PCLK1Config(RCC_HCLK_Div2);/*PLLCLK=8MHZ*9=72MHZ*/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 used as system clock source*/while(RCC_GetSYSCLKSource() !=0x80){}/*打开相应的外部时钟:GPIOF*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); }else{}}/*******************************************************************************Function Name :NVIC_Configuration.*Descriprion :configures Vector Table base location.*Input :None*Output :None*Return :None******************************************************************************* /void NVIC_Configuration(void){#ifdef VECT_TAB_RAM/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_RAM,0X0);#else/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endif}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;//设置GPIO的工作状态GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; / /设置GPIO的速度GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_Init(GPIOA, &GPIO_InitStructure);}/******************************************************************************延时函数******************************************************************************/void Delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}以上是鑫洪泰的小编为你带来的液晶屏ST7565R IC驱动程序演示代码介绍,如果你想有更进一步的了解,请您关注我们微信,或者点击我们官网了解我们,也可以在线咨询或者拨打我们的热线电话与我们联系!我们会有专业的工作人员为你实时解答。

12864(ST7565P)液晶驱动

12864(ST7565P)液晶驱动

12864(ST7565P)液晶驱动显示概念含有ST7565P 芯片的液晶,是没有文库支持的功能,但是没有就没有啦!液晶可以给我画画,那么它就是好东西了。

液晶的“显示”,液晶的“扫描次序”全部都与CGRAM分配有很大的关系。

我们先了解“扫描次序”吧。

宏观上一副液晶是“64高x 128宽”。

微观上由芯片ST7565P驱动的一副12864 液晶是由“8个8 高x 128宽的页”组成。

至于液晶的“扫描次序”就与4个命令有关系。

上图表示了,当命令为0xA0列扫描是“自左向右”,如果命令式0xA1列扫描是“自右向左”。

总归,这两个命令控制了“列扫描次序”除了控制列扫描的命令以外,当然还有控制“页扫描次序”的命令。

如上图,命令0xC0 控制页扫描是“从下至上”,然而命令0xc8 控制页扫描“又上至下”。

无论页扫描的次序是“从上至下”还是“从下至上”,然而每一页的列填充,都是“低位开始高位结束”关于列扫描就有列填充的问题。

我们知道每“一页”都是由“8 高x 128宽”组成。

换句话说,这里没有“行扫描”的概念,因为“一页”都是由“一个字节数据,列填充128次”成为一页。

如上图中所示。

假设“页扫描次序”是由上至下,填充的值是0x0f,那么经过128次的“列扫描”以后,一页的扫描结果会是如上图所示。

关于ST7565P 芯片,命令,和液晶扫描它们之间的关系而已,我们简单来总结一下:(一)CGRAM分布是由8页组成。

(二)每一页是由一个字节填充和128次列扫描组成。

(三)列扫描次序与命令0xA0 与0xA1有关。

(四)页扫描次序与命令0xC0 与0xC8 有关。

(五)列填充字节的高位低位关系与页扫描命令有关。

(六)不存在行扫描概念。

上图所示是“页扫描”由上至下,“列扫描”由左至右,列填充值是0x0f。

在CGRAM分布方面。

CGRAM 可以说是由8 bits x 1024 words,如果以“页”去分配,也就是说8 page x 8 bits x 128 words ,那么“页”的偏移量就是128。

液晶12864的驱动(带注释)

液晶12864的驱动(带注释)

//写主函数的时候直接调用以下部分子函数就行了#include<reg51.h>#include"intrins.h"#define uint unsigned int#define uchar unsigned char#define LCD_data P0sbit lcd_rs=P2^6;sbit lcd_rw=P2^5;sbit lcd_en=P2^7;sbit lcd_psb=P3^2; //串/并方式控制sbit lcd_rst=P3^7; //液晶复位端口void delay_ms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=120;j>0;j--);}void delay_nop(){_nop_();_nop_();_nop_();_nop_();}/* 以下是lcd忙碌检查函数,result为1时,忙;* result为0时,闲;可写指令与数据。

*/bit lcd_busy(){bit result;lcd_rs=0;lcd_rw=1;lcd_en=1;delay_nop();result=(bit)(P0&0x80);lcd_en=0;return(result);}/**** 以下是写指令函数**** */void lcd_wcmd(uchar cmd){while(lcd_busy());lcd_rs=0;lcd_rw=0;lcd_en=0;_nop_();_nop_();P0=cmd;delay_nop();lcd_en=1;delay_nop();lcd_en=0;}/**** 以下是写数据函数**** */void lcd_wdat(uchar dat){while(lcd_busy());lcd_rs=1;lcd_rw=0;lcd_en=0;P0=dat;delay_nop();lcd_en=1;delay_nop();lcd_en=0;}/**** 以下lcd初始化函数**** */void lcd_init(){lcd_psb=1;lcd_rst=0;delay_ms(3);lcd_rst=1;delay_ms(3);lcd_wcmd(0x34);delay_ms(5);lcd_wcmd(0x30); //基本指令操作delay_ms(5);lcd_wcmd(0x0c); //显示开,关光标delay_ms(5);lcd_wcmd(0x01); //清楚lcd显示的内容delay_ms(5);}/**** 以下是lcd清屏函数**** */void lcd_clr(){lcd_wcmd(0x01);delay_ms(5);}/* 以下是设定显示位置函数* 变量X表示行,Y表示列**/void lcd_pos(uchar x,uchar y){uchar pos;if(x==1) {x=0x80;}else if(x==2) {x=0x90;}else if(x==3) {x=0x88;}else if(x==4) {x=0x98;}pos=x+y;lcd_wcmd(pos);}/* 以下是设定显示位置函数* 变量i表闪烁次数*/void flash(uint i){delay_ms(1000);for(;i>0;i--){lcd_wcmd(0x08); //关闭显示delay_ms(500);lcd_wcmd(0x0c); //开显示delay_ms(500);}}。

12864液晶显示串行程序(英飞凌xc824)

12864液晶显示串行程序(英飞凌xc824)

12864液晶显示串行程序(英飞凌xc824)
先说说我的调试初衷前一阵看实验室的兄弟姐妹们都闲的无聊,就有人DIY 了,有人个BF 做电子时钟,一个液晶30 多,一个12C887 20 多,板子加器件还有单片机算下来少说也有70 大洋。

感觉实在不划算,但是对液晶还是
蛮感兴趣的,一方面熟悉一下串行设备,一方面为以后做准备,毕竟液晶显示
操作起来要比LED 简单,而且能实时显示,到什么时候都能用上。

所以,这
次液晶屏的调试,我就想搜集一些常用的程序,适当的修改,让液晶屏达到拿
来就能用上的目的。

先说说我这次调试的液晶屏,12864,带子库的,蓝色屏幕。

就是这张图了
单片机我选的是英飞凌xc824,新出的哦。

不是有啥特殊偏好,手头就有这个,就先用这个吧,主要是我对这个最小系统板上的触摸按键比较感兴趣。


然了,它也有缺点,内存太小,连一个12864 的图片都装不下。

:Q 闲话少说,先从最基本的数据手册开始吧
中显液晶12864.pdf
这是中文资料,因为这种东西已经被使用的多的不能再多了,而且厂家众多,但是有细微差别,比如串行和并行,有的是焊点切换的,有的是软件切换的。

我这个是后者。

刚接线的时候还出了个笑话,太相信实物和datasheet 和对应的了,结果屏幕的背光接反了,幸好没烧。

硬件方面,我选串行是因为它用线少,我很懒的。

:) P1.0 口对应CS,P1.1 口对应SID,P1.2 口对应CLK.
参考时序在datasheet 上写的很清楚有这个当指导思想,照着写程序吧.动手之。

液晶12864

液晶12864

驱动头文件:LCD12864.rar我们看到,打开这个头文件,我们可以看到有需要修改的引脚定义。

假设我们这里将STD和SCLK分别接到了P1.6和P1.7上面,我们就按照上面的连接方法就可以了。

如果你使用的是告诉CPU,你可以修改下面的delay()函数,使CPU输出的控制信号速率降低一些。

好了,修改好了,让我们开始我们的编程吧:#include <REG51.H>#include "LCD12864.H"void main(){LC DInit();LC DInit();LC DChar(0x80,'Z');LC DNum(0x90,722);LC DString(0x88,"");LC DString(0x98,"因为简单所以领先");for(;;){}}液晶屏幕1602是电子上常用的液晶显示器。

这种显示器的优点是带有英文字符字库;价格低廉;接口方便。

这种液晶显示器如此广泛的使用,我们很有必要来学习使用。

你也看到了上面的图片,LCD1602的引脚常规情况下有15个插针引脚。

从左往右分别是GND(液晶)VCC(液晶)VO(对比度调整端)RS RW EN D0 D1 D2 D3 D4 D5 D6 D7 VCC(背液晶1602的使用非常的方便,数据线8条,控制线3条,其实总共需要11根IO口线(8线制使用使这样的,4线制可以节省IO口,这里先不讨论)。

液晶显示模块的VCC和GND(第一和第二个引脚)是需要接的,但是背光的VCC和GND可以不连接。

液晶1602的使用需要注意的一点就是VO这个端口。

这个VO端口接高电平时候,液晶的对比度最小;接低电平时,液晶的对比度最高(会出现“鬼影”)。

最好采用一个电位器,可以调节这个端口的电压。

正如上图这样,一个电位器,方便调节LCD的对比度。

还有一点,如果你想增加整个系统的稳定性,你应该在这11条IO口线上加一个上拉电阻。

12864串行显示(字符、字符串)

12864串行显示(字符、字符串)

12864串行显示(字符、字符串)/************************************************************** ******* 文件名:串行12864显示.c* 描述 : 该程序实现了12864以串行的方式进行通信。

液晶上的R9。

R10决定液晶的串行或者并行通讯方式。

液晶上的PSB已经拉为高电平。

如果使用串行,需要取掉R9。

* 创建人:* 版本号:*************************************************************** ********/#include#include#define uchar unsigned char#define uint unsigned intsbit CS=P2^5; //片选信号sbit SID=P2^6; //数据信号sbit SCLK=P2^7; //时钟信号sbit RST=P2^2; //复位信号sbit CH = P2^4; //并行、串行选择信号/************************************************************** ******* 名称 : delay()* 功能 : 延时,延时时间为 100us * t。

这是通过软件延时,有一定误差。

* 输入 : t* 输出 : 无*************************************************************** ********/void delay(unsigned int t){unsigned int i,j;for(i=0; ifor(j=0; j<10; j++);}/************************************************************** ******* 名称 : sendbyte()* 功能 : 按照液晶的串口通信协议,发送数据* 输入 : zdata* 输出 : 无*************************************************************** ********/void sendbyte(unsigned char zdata){unsigned int i;for(i=0; i<8; i++){if((zdata << i) & 0x80){SID = 1;}else{SID = 0;}SCLK = 0;SCLK = 1;}}/************************************************************** ******* 名称 : write_com()* 功能 : 写串口指令* 输入 : cmdcode* 输出 : 无*************************************************************** ********/void write_com(unsigned char cmdcode){CS = 1;sendbyte(0xf8);sendbyte(cmdcode & 0xf0);sendbyte((cmdcode << 4) & 0xf0);delay(2);}/************************************************************** ******* 名称 : write_data()* 功能 : 写串口数据* 输入 : cmdcode* 输出 : 无***********************************************************************/void write_data(unsigned char Dispdata){CS = 1;sendbyte(0xfa);sendbyte(Dispdata & 0xf0);sendbyte((Dispdata << 4) & 0xf0);delay(2);}/************************************************************** ******* 名称 : lcdinit()* 功能 : 初始化函数* 输入 : cmdcode* 输出 : 无*************************************************************** ********/void lcdinit(){RST = 0;delay(100);RST = 1;delay(20000);write_com(0x30);delay(50);write_com(0x0c);delay(50);}/************************************************************** ******* 名称 : L1602_num(uchar hang,uchar lie,char sign)* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示(0~9) ,调用该函数如下L1602_char(1,5,9)* 输入 : 行,列,需要输入1602的数据* 输出 : 无*************************************************************** ********/void L12864_num(uchar hang,uchar lie,char sign){switch(hang){case 1: write_com(0x80+lie);break;case 2: write_com(0x90+lie);break;case 3: write_com(0x88+lie);break;case 4: write_com(0x98+lie);break;default:break;}write_data(sign+48);}/************************************************************** ******* 名称 : L1602_char(uchar hang,uchar lie,char sign)* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下L1602_char(1,5,'b')* 输入 : 行,列,需要输入1602的数据* 输出 : 无*************************************************************** ********/void L12864_char(uchar hang,uchar lie,char sign){switch(hang){case 1: write_com(0x80+lie);break;case 2: write_com(0x90+lie);break;case 3: write_com(0x88+lie);break;case 4: write_com(0x98+lie);break;default:break;}//write_data(00);write_data(sign);}/************************************************************** ******* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下L1602_string(1,5,"ab cd ef;")* 输入 : 行,列,需要输入1602的数据* 输出 : 无*************************************************************** ********/void L12864_string(uchar hang,uchar lie,uchar *p){switch(hang){case 1: write_com(0x80+lie);break;case 2: write_com(0x90+lie);break;case 3: write_com(0x88+lie);break;case 4: write_com(0x98+lie);break;default:break;}while(*p>0){write_data(*p);p++;}}/************************************************************** ******* 名称 : Test()* 功能 : 显示子函数* 输入 : 无* 输出 : 无*************************************************************** ********/void Test(){//write_com(0x03);//delay(50);L12864_num(1,0,8);L12864_char(2,0,'m');L12864_string(3,0,"sffds");L12864_string(4,0,"是电池");}/************************************************************** ******* 名称 : Main()* 功能 : 主函数* 输入 : 无* 输出 : 无*************************************************************** ********/void Main(){CH = 0;delay(1);lcdinit();delay(10);while(1){Test();delay(5000);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

*****************************************/ void delay10US(uchar x) { uchar k; for(k=0;k<x;k++); } /***************************************** Fucntion: delay1MS(char x) Description: delay for 10 us Parameter: x delay for 1MS Author: kassey@ Date: July,7th,2005 *****************************************/
//第一行汉字位置 //第二行汉字位置 //第三行汉字位置 //第四行汉字位置
uchar code str1[]="黄河远上白云间,一片孤城万仞山。羌笛何须怨杨柳,春风 不度玉门关。"; uchar code bmp1[]; /******************************************************************** ********************** * 函数名称 :SendByte * 功能描述 :串口发送一个字节 ********************************************************************* *********************/ void SendByte(uchar Dbyte) { uchar i; for(i=0;i<8;i++) { SCK = 0; if((Dbyte<<i)&0x80) SID=1; else SID=0; //移出的位给 SID SCK = 1; SCK = 0; }
void delay1MS(uchar x) { uchar k,j; x=x<<1; for(k=0;k<x;k++) for(j=0;j<255;j++)_nop_(); } /******************************************************************** ********************** * 函数名称 :LcmInit ********************************************************************* *********************/ void LcmInit( void ) { RST=0; delay1MS(50); RST=1; WriteCommand(0x30); //8BitMCU,基本指令集合 WriteCommand(0x02); //AC 归 0,不改变 DDRAM 内容 WriteCommand(0x0C); //显示 ON,游标 OFF,游标位反白 OFF WriteCommand(0x01); //清屏,AC 归 0 WriteCommand(0x06); //写入时,游标右移动 }
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

} /******************************************************************** ********************** * 函数名称 :ReceiveByte * 功能描述 :串口接收一个字节 ********************************************************************* *********************/ uchar ReceiveByte(void) { uchar i,temp1,temp2; temp1 = 0; temp2 = 0; for(i=0;i<8;i++) { temp1=temp1<<1; SCK = 0; SCK = 1; SCK = 0; if(SID) temp1++; } for(i=0;i<8;i++) { temp2=temp2<<1; SCK = 0; SCK = 1; SCK = 0; if(SID) temp2++; } temp1=0xf0&temp1; temp2=(0xf0&temp2)>>4; return (temp1+temp2); } /******************************************************************** ********************** * 函数名称 :CheckBusy ********************************************************************* *********************/ void CheckBusy( void ) { do SendByte(0xfc); //11111,RW(1),RS(0),0 while(0x80&ReceiveByte()); //BF(.7)=1 Busy } /********************************************************************
/******************************************************************** ********************** * 函数名称 :LcmClearTXT * 功能描述 :文本区清 RAM 函数 ********************************************************************* *********************/ void LcmClearTXT( void ) { uchar i; WriteCommand(0x30); //8BitMCU,基本指令集合 WriteCommand(0x80); //AC 归起始位 for(i=0;i<64;i++) WriteData(0x20); } /******************************************************************** ********************** * 函数名称 :LcmClearBMP * 功能描述 :图形区清 RAM 函数 ********************************************************************* *********************/ void LcmClearBMP( void ) { uchar i,j; WriteCommand(0x34); //8Bit 扩充指令集,即使是 36H 也要写两次 WriteCommand(0x36); //绘图 ON,基本指令集里面 36H 不能开绘图 for(i=0;i<32;i++) //12864 实际为 256x32 { WriteCommand(0x80|i); //行位置 WriteCommand(0x80); //列位置 for(j=0;j<32;j++) //256/8=32 byte WriteData(0); } } /******************************************************************** ********************** * 函数名称 :PutStr ********************************************************************* *********************/ void PutStr(uchar row,uchar col,uchar *puts) { WriteCommand(0x30); //8BitMCU,基本指令集合 WriteCommand(AC_TABLE[8*row+col]); //起始位置 while(*puts != '\0') //判断字符串是否显示完毕
相关文档
最新文档