AD+12864
12864液晶显示模块概述
12864液晶显示模块概述
液晶显示模块的核心部件是显示器,它由无数个液晶单元组成。
液晶是一种特殊的有机化合物,具有可控制光线传输的特性。
通过在液晶材料中加入电场,可以改变液晶分子的排列,从而控制光线的透射与背反射,实现显示功能。
为了使液晶显示模块能正常工作,还需要配备一个控制器。
控制器是一个专用的芯片,通过接收外部指令和数据,对液晶单元进行控制。
它负责处理输入信号,生成适合液晶单元的驱动信号,并将外部数据转换成图像信息。
常见的控制器有ST7920、ST7565和KS0108等。
液晶芯片12864A编程(中文)
12864系列点阵型液晶显示模块使用说明书一、OCM12864液晶显示模块概述1.OCM12864液晶显示模块是128×64点阵型液晶显示模块,可显示各种字符及图形,可与CPU直接接口,具有8位标准数据总线、6条控制线及电源线。
采用KS0107控制IC。
2.外观尺寸:113×65×11mm(ocm12864-1), 93×70×10mm(ocm12864-2)78×70×10mm(ocm12864-3),3.视域尺寸:73.4×38.8mm(ocm12864-1) 70.7×38mm(ocm12864-2),64×44mm(ocm12864-3)4.重量:大约g补充说明:外观尺寸可根据用户的要求进行适度调整。
二、最大工作范围1、逻辑工作电压(Vcc):4.5~5.5V2、电源地(GND):0V3、LCD驱动电压(Vee):0~-10V4、输入电压:Vee~Vdd5、工作温度(Ta):0~55℃(常温) / -20~70℃(宽温)6、保存温度(Tstg):-10~65℃三、电气特性(测试条件 Ta=25,Vdd=5.0+/-0.25V)1、输入高电平(Vih):3.5Vmin2、输入低电平(Vil):0.55Vmax3、输出高电平(Voh):3.75Vmin4、输出低电平(Vol):1.0Vmax5、工作电流:2.0mAmax四、接口说明12864-3A接口说明表五、指令描述1、显示开/关设置CODE : R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0功能:设置屏幕显示开/关。
DB0=H ,开显示;DB0=L ,关显示。
不影响显示RAM(DD RAM)中的内容。
2、设置显示起始行CODE : R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0功能:执行该命令后,所设置的行将显示在屏幕的第一行。
12864液晶显示器种类识别
12864液晶显示器种类识别12864液晶种类繁多,光常用的控制器就有4种,每一种都有自己的特点。
当然指令也各不相同。
学习者不搞明白液晶类型,肯定是无从下手。
1. 12864液晶的型号通常的型号是XX12864A,XX12864B,XX12864C,XX12864-1,XX12864-2,XX12864-3之类。
前面的XX是厂家的标志,中间的12864指的是12864点阵,后面的A,B,C,-1,-2,-3是液晶的编号。
一个厂家生产的12864液晶有许多种,于是ABCDE或者12345的一路往下排。
比如有的网友给一个型号12864B,这不是一个规范的型号,不能给使用者提供任何信息,这种不规范型号的液晶通常不是正规厂家生产的。
找到规范的型号,用户可以自己搜索到正规厂家的网站,然后下载资料。
2. 12864液晶的控制器上文提到的4种这里介绍一下。
(1)ST7920类这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液晶还支持画图方式。
该类液晶支持68时序8位和4位并口以及串口。
(2)KS0108类这种控制器指令简单,不带字库。
支持68时序8位并口。
(3)T6963C类这种控制器功能强大,带西文字库。
有文本和图形两种显示方式。
有文本和图形两个图层,并且支持两个图层的叠加显示。
支持80时序8位并口。
(4)COG类常见的控制器有S6B0724和ST7565,这两个控制器指令兼容。
支持68时序8位并口,80时序8位并口和串口。
COG类液晶的特点是结构轻便,成本低。
各种控制器的接口定义:接口定义ST7920GNDVCCV0RSR/WEDB0-DB7PSBRESVOUTBLABLKGND VCCV0RSR/WEDB0-DB7 CS1CS2 RES VOUT BLA BLKT6963C FGGND VCCV0WRRDDB0-DB7 RSCSRESFSBLA BLKS6B0724 GND VCCRSWRRDCSDB0-DB7BLABLK其中PSB是ST7920类液晶的标志性引脚;CS1和CS2是KS0108类引脚的标志性引脚;FS是T6963C类液晶的标志性引脚。
51单片机综合学习系统之12864点阵型液晶显示篇
51单片机综合学习系统之 12864点阵型液晶显示篇大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了1602字符型液晶显示的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习12864点阵型液晶显示屏的基本原理与使用方法。
点阵LCD的显示原理在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。
对于显示英文操作,因为英文字母种类很少,只需要8位<一字节)即可。
而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。
而剩下的低128位则留给英文字符使用,即英文的内码。
那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:图1 “A”字模图而中文的“你”在字模中的记载却如图2所示:图2 “你”字模图12864点阵型LCD简介12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4个(16×16点阵>汉字。
管脚号管脚名称LEVER 管脚功能描述1 VSS 0 电源地2 VDD +5.0V 电源电压3 V0 - 液晶显示器驱动电压4 D/I(RS> H/L D/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据5 R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR6 E H/L R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB07 DB0 H/L 数据线8 DB1 H/L 数据线9 DB2 H/L 数据线10 DB3 H/L 数据线11 DB4 H/L 数据线12 DB5 H/L 数据线13 DB6 H/L 数据线14 DB7 H/L 数据线15 CS1 H/L H:选择芯片(右半屏>信号16 CS2 H/L H:选择芯片(左半屏>信号17 RET H/L 复位信号,低电平复位18 VOUT -10V LCD驱动负电压19 LED+ - LED背光板电源20 LED- - LED背光板电源表1:12864LCD的引脚说明在使用12864LCD前先必须了解以下功能器件才能进行编程。
12864液晶显示ADC电压值
#include <msp430x14x.h>
#include "12864.c"
#include "Flash.c"
#include "ADC.C"
#include "LED.C"
//数码管段码;0--f
//Print(4,8,heiti,xianshi);
Print(4,8,heiti,xianshi1);
Print(4,16,heiti,".");
Print(4,24,heiti,xianshi2);
}
}
//数码管位选变量
uchar cnt = 0;
unsigned char shuzi[] = {"0123456789"};
static unsigned char xianshi[3];
static uint results[Num_of_Results]; //保存ADC转换结果的数组// is not used for anything.
P2DIR &= ~BIT6; //P2.6 input Flash
P6DIR |= BIT0;
P6OUT |= BIT0; //点亮LCD背光
//InitUART();
Initialize();
LCD_Clr();
for(int j=2;j>=0;j--)
{
for(int i=0;i<10;i++)
#define kaiti 0x802A0l //楷体字体开始地址
STC12C5A60S2AD采集12864显示程序
STC12C5A60S2AD采集12864显示程序/************************************************************** *************** 文件名:AD_CAIYANG.C* 功能:使用AD采集电压显示在LCD* 说明:本程序是STC12C5A60S2单片机自带AD的采集数据并通过12864液晶串行模式显示的程序*************************************************************** *************/#include//#include#define uint unsigned int#define uchar unsigned charsbit CS=P2^4; //LCD12864串行通信片选sbit SID=P2^5; //LCD12864串行通信数据口sbit SCLK=P2^6; //LCD12864串行通信同步时钟信号sbit PSB=P2^3; //LCD12864并/串选择:H并行 L串行sbit jd1=P2^0; //继电器1控制引脚sbit jd2=P2^1; //继电器2控制引脚sbit fengming=P2^7; //蜂鸣器控制引脚sbit start=P1^0; //开始信号控制引脚unsigned int temp1,sh1,ge1,n1,m1;unsigned char ad_result_data[10]; //AD转换高八位unsigned char ad_result_low2[10]; //AD转换低八位unsigned char ad_result_total[10]; //AD转换总十位unsigned char ad_average_result; //AD转换十次的平均值unsigned char Ain,Vin;unsigned char b,t,R;char tp=0;unsigned char code ma1[6]={0xb5,0xe7,0xd1,0xb9,0xa1,0xc3}; //电压:unsigned char code ma2[]={"."};uchar code disp1[]={" LG "};uchar code disp2[]={" 电压采集 "};uchar code disp3[]={"超级电容检测工装"};unsigned char code num0[]={0xa3,0xb0};unsigned char code num1[]={0xa3,0xb1};unsigned char code num2[]={0xa3,0xb2};unsigned char code num3[]={0xa3,0xb3};unsigned char code num4[]={0xa3,0xb4};unsigned char code num5[]={0xa3,0xb5};unsigned char code num6[]={0xa3,0xb6};unsigned char code num7[]={0xa3,0xb7};unsigned char code num8[]={0xa3,0xb8};unsigned char code num9[]={0xa3,0xb9};//-------模块延时程序---------------------------- 1msvoid delay1ms(uint delay1ms) //STC11F60XE,22.1184M,延时1ms{uint i,j;for(;delay1ms>0;delay1ms--)for(i=0;i<7;i++)for(j=0;j<210;j++);}void delay(uint delay) //STC11F60XE,22.1184M,延时170us{uint i,j;for(;delay>0;delay--)for(i=0;i<124;i++);for(j=0;j<124;j++);}/*******************************************************AD转换程序*******************************************************/void AD_initiate() //初始化函数{ES=0;TMOD=0x21; //定时计数器方式控制寄存器,"自动重装,16位计数器".SCON=0x50; //串行控制寄存器,方便在串口助手那观察TH1=0xfa;TL1=0xfa;TR1=1;}void ADC_Power_On() //AD转换电{ADC_CONTR|=0x80; //打开AD转换电源delay(5); //必要的延时延时一会儿等待AD供电电源稳定}void get_ad_result() //取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据{uint i,q=0;for(i=0;i<10;i++){tp=0;ADC_RES=0; //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同ADC_RESL=0; //低两位清零ADC_CONTR|=0x08; //启动AD转换while(!tp) //判断AD转换是否完成{tp=0x10;tp&=ADC_CONTR;}ADC_CONTR&=0xe7;ad_average_result=ADC_RES;q=q+ad_average_result;}ad_average_result=q/10;//ad_average_result=ad_average_result*4*5000/1024;}/************************AD转换结束***********************/void send_ad_result() //取AD结果函数发送到串口,方便调试{SBUF=n1;while(TI==0) ;TI=0;delay1ms(100);//SBUF=R>>4;}//---------------------电压采样程序-------------------------void caiyangP10() //测电压{P1M0|=0x01; //设P1_0为开漏模式如: P1_0= #00000000B P1M1|=0x01;ADC_CONTR=0xe0; //设置P1.0为输入AD转换口delay(2);get_ad_result(); //取转换数据Vin=ad_average_result;// R=Vin;}/*-----------写控制字到LCD12864------------*/void write_cmd(uchar cmd){uchar i;uchar i_data;i_data=0xf8; //命令控制字:11111000写指令11111010写数据11111100读状态 11111110读数据CS=1; //片选置高,才能进行读写操作SCLK=0;/*----------写命令控制字-----------------*/for(i=0;i<8;i++) //循环八次,每次读取一位数据{SID=(bit)(i_data&0x80); //bit表示取其最高位SCLK=0;SCLK=1; //正跳变写入指令i_data=i_data<<1; //左移一位}/*---------------------------------------*//*----------写指令高四位-----------------*/i_data=cmd;i_data=i_data&0xf0; //把低四位置0for(i=0;i<8;i++) //循环八次,每次读取一位数据{SID=(bit)(i_data&0x80); //bit表示取其最高位SCLK=0;SCLK=1; //正跳变写入指令i_data=i_data<<1; //左移一位}/*---------------------------------------*//*----------写指令低四位-----------------*/i_data=cmd;i_data=i_data<<4; //左移四位,把低四位的数据移到高四位,再把低四位置0for(i=0;i<8;i++) //循环八次,每次读取一位数据{SID=(bit)(i_data&0x80); //bit表示取其最高位SCLK=0;SCLK=1; //正跳变写入指令i_data=i_data<<1; //左移一位}/*-----------------------------------------*/CS=0; //把片选置低delay1ms(5); //延时是因为没有进行忙检测,适当的延时可以不进行忙检测}/*-----------------------------------------*//*------------写数据到LCD12864-------------*/void write_dat(uchar dat){uchar i;uchar i_data;i_data=0xfa;CS=1;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=dat;i_data=i_data&0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=dat;i_data=i_data<<4;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;delay1ms(5);}/*-----------------------------------------*//*--------------显示坐标-------------------*/void lcd_pos(uchar x,uchar y) //汉字显示坐标,x为哪一行,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; //显示哪一行(总共有4行)哪一竖(总共有8竖,每16列为1竖)write_cmd(pos);}/*-----------------------------------------*//*--------------显示8个汉字-------------------*/void disp_hanzi(uchar code *chn){uchar i;write_cmd(0x30); //基本指令操作方式for(i=0;i<16;i++) //16列*8个汉字=128(刚好)write_dat(chn[i]);}/*-----------------------------------------*//*--------------显示数字-------------------*/void disp_num(uchar code *chn){uchar i;write_cmd(0x30); //基本指令操作方式for(i=0;i<2;i++) //1个数字write_dat(chn[i]);}void disp_number(uchar num){switch(num){case 0: disp_num(num0);break;case 1: disp_num(num1);break;case 2: disp_num(num2);break;case 3: disp_num(num3);break;case 4: disp_num(num4);break;case 5: disp_num(num5);break;case 6: disp_num(num6);break;case 7: disp_num(num7);break;case 8: disp_num(num8);break;case 9: disp_num(num9);break;default: break;}}/*----------- --LCD初始化------------------*/ void lcd_init(){PSB=0;write_cmd(0x30); //基本指令write_cmd(0x02); //地址归位write_cmd(0x06); //游标右移write_cmd(0x0c); //整体显示write_cmd(0x01); //清屏}/*-----------------------------------------*/ void displayP10(){float ad1;//unsigned int temp1,sh1,ge1,n1,m1;//uchar code dis2[]={0x01,0x02,0x00};//ad1=x*7.8125; //电压修正uchar i;// ad1=Vin*3.9608; //具体线性参数由输入电压值调整,该值的测量范围为0-10.00V,5V左右的测量比较准确,//两端的最大误差为70mv,其他一般在40mv以内ad1=Vin*2;temp1=(int)ad1;/* sh1=temp1/1000; //十位ge1=(temp1%1000)/100; //个位n1=((temp1%1000)%100)/10; //小数点后一位m1=((temp1%1000)%100)%10; //小数点后二位 */sh1=temp1/1000; //十位ge1=(temp1%1000)/100; //个位n1=(temp1%100)/10; //小数点后一位m1=temp1%10; //小数点后二位//write_cmd(0x01);write_cmd(0x30); //基本指令操作方式lcd_pos(0,0);for(i=0;i<6;i++)write_dat(ma1[i]);lcd_pos(0,3);disp_number(sh1);lcd_pos(0,4);disp_number(ge1);lcd_pos(0,5);for(i=0;i<2;i++) write_dat(ma2[i]);lcd_pos(0,6);disp_number(n1);lcd_pos(0,7);disp_number(m1);lcd_pos(1,0);disp_hanzi(disp1); lcd_pos(2,0);disp_hanzi(disp2);lcd_pos(3,0);disp_hanzi(disp3); delay1ms(5);}init ()start=1;jd1=0;jd2=0;fengming=0;}void main(){EA=1;AD_initiate(); //初始化ADC_Power_On(); //开AD电源init();lcd_init();delay(10);while(1){caiyangP10(); //测电压if(start==0){delay(10)if(start==0){if(Vin*2>1)jd1=1;else if(Vin*2<1)jd2=1;}send_ad_result(); //Vin=Vin*4007; displayP10(); delay(10);}}。
用12864做示波器(程序和图)
#include <reg51.h>#include <intrins.h>#include <ADC0808.c>sbit DI=P2^2; // 数据\指令选择sbit RW=P2^1; // 读\写选择sbit E=P2^0; // 读\写使能sbit CS1=P2^4; // 片选1sbit CS2=P2^3; // 片选2sbit busy=P1^7;sbit jia=P3^7;sbit jian=P3^3;sbit jia1=P3^0;sbit jian1=P3^1;unsigned int i;unsigned char ye,lei,shu; unsigned char a[94];char code t[]={0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x40,0x60,0x80,0x00,0x7F,0xFF, //小0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x80,0x82,0x7F,0xE2, //子0x00,0xA2,0x00,0x92,0x00,0x8A,0x00,0x86,0x00,0x80,0x00,0xC0,0x00,0x80,0x00,0x00,0x00,0x40,0x00,0x60,0x3F,0x5E,0x01,0x48,0x01,0x48,0xFF,0xFF,0x11,0x48,0x21,0x4C, //制0x1F,0x68,0x00,0x40,0x07,0xF8,0x40,0x00,0x80,0x00,0x7F,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x40,0x00,0x20,0xFF,0xF8,0x00,0x87,0x00,0x40,0x00,0x30,0x00,0x0F, //作0xFF,0xF8,0x08,0x88,0x08,0x88,0x08,0xC8,0x0C,0x88,0x08,0x0C,0x00,0x08,0x00,0x00,};void checkstate(){//bit dat;DI=0;RW=1;//P1=0x00;do{E=1;E=0;//仅当第7位为0时才可操作(判别busy信号)}while(busy==1);}void writecommand(unsigned char command) //写命令{checkstate();DI=0;RW=0;P1=command;E=1;E=0;}void writedate(unsigned char date) //写数据{checkstate();DI=1;RW=0;P1=date;E=1;E=0;}void pianxuan(unsigned int i){if(i==1)CS1=0,CS2=1;if(i==2)CS1=1,CS2=0;if(i==3)CS1=0,CS2=0;}void cleanscreen() //清屏{unsigned char page,i;for(page=0xb8;page<0xc0;page++){writecommand(page);writecommand(0x40);for(i=0;i<64;i++)writedate(0x00);}}void init(void) //开显示,起始行0行{writecommand(0xc0);writecommand(0x3f);}void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}void shuju(){pianxuan(i); writecommand(ye); writecommand(lei); writedate(shu);}void qing(){uchar i;for(i=0xb8;i<=0xbf;i++) {ye=i;shu=0x00;shuju();}}void main(){uint r,j,g=0,q,dianya=1,k,p;uchar U,m,l;pianxuan(3);cleanscreen();init();pianxuan(2);l=0xb8;for(k=0;k<4;k++,l=l+0x02){ye=l;lei=0x70;for(r=0;r<16;r++){shu=t[2*r+1+32*k];shuju();lei++;}ye=l+0x01;lei=0x70;for(r=0;r<16;r++){shu=t[2*r+32*k];shuju();lei++;}}while(1){uchar d1,d2,d3,d4,d5;aaa:do{adc();}while((AD!=128)&&(AD!=129)&&(AD!=130));U=AD;adc();if(U>AD)goto aaa;while(jia==0){while(jia==0);g=g+1;}while(jian==0){while(jian==0);if(g!=0) g=g-1;}while(jia1==0){while(jia1==0);dianya=dianya+1;}while(jian1==0){while(jian1==0);if(dianya!=1) dianya=dianya-1;}for(j=0;j<94;j++) //AD采样{adc();a[j]=AD;delay_50us(g);}lei=0x40;for(r=0,j=0;r<94;r++,j++){if(j<64) i=1;if(j==64) lei=0x40;if(j>=64)i=2;qing(); //清掉之前的内容AD=a[j]*0.196/dianya; //计算在12864的电压值if(AD<=7) ye=0xbf,shu=(0x80>>AD); else if(AD<=15) ye=0xbe,shu=0x80>>(AD-8); else if(AD<=23) ye=0xbd,shu=0x80>>(AD-16); else if(AD<=31) ye=0xbc,shu=0x80>>(AD-24); else if(AD<=39) ye=0xbb,shu=0x80>>(AD-32); else if(AD<=47) ye=0xba,shu=0x80>>(AD-40); else if(AD<=55) ye=0xb9,shu=0x80>>(AD-48); else if(AD<=63) ye=0xb8,shu=0x80>>(AD-56);if(r==0){d1=shu;d2=ye;}if(r!=0){d3=shu;d4=ye;if(ye==d2){if(shu>d1){d5=shu;d5=d5>>1;while(d5!=d1){d5=d5>>1;shu=shu|(shu>>1);}}if(shu<d1){d5=shu;d5=d5<<1;while(d5!=d1){d5=d5<<1;shu=shu|(shu<<1);}}if(ye<d2){for(q=0;q<7;q++){shu=shu|(shu<<1);}shuju();ye++;while(ye<d2) {shu=0xff,shuju(),ye++;}if(ye==d2){shu=0x01;if(shu<d1){d5=shu;d5=d5<<1;while(d5!=d1){d5=d5<<1;shu=shu|(shu<<1);}}}}if(ye>d2){for(q=0;q<7;q++){shu=shu|(shu>>1);}shuju();ye--;while(ye>d2) {shu=0xff,shuju(),ye--;}if(ye==d2){shu=0x80;if(shu>d1){d5=shu;d5=d5>>1;while(d5!=d1){d5=d5>>1;shu=shu|(shu>>1);}}}}}if(r!=0)d1=d3;d2=d4;}shuju();if(lei!=0x7f) lei++; }}}。
12864液晶屏学习使用手册
12864液晶屏学习手册1.液晶模组概览12864A-1汉字图形点阵液晶显示模块,可显示汉字和图形,内置8192个汉字(16X16点矩阵,16 * 8 = 128,16 * 4 = 64,一行,4行只能写8个汉字;),128个字符(8X16点矩阵)和64X256点矩阵显示RAM(GDRAM)。
主要技术参数和显示特性:电源:VDD 3.3V〜+5伏(内置升压电路,无负压);显示内容:128列X第64行(128分)显示颜色:黄绿色显示角度:直接看6:00LCD类型:STN与MCU的接口:8位或4位并行/ 3位串行配置LED背光多种软件功能:光标显示,屏幕移位,自定义字符,睡眠模式等2.尺寸1.尺寸2。
主要尺寸项目标准尺寸单元模子片身体产品113.0X65.0X12.8毫米2.模块引脚说明逻辑工作电压(VDD):4.5〜5.5V电源地(GND):0V穿孔温度(Ta):0〜60°C(常温)/ -20〜75°C(宽温度)三,接口定时模块有两种连接方式:并行和串行(时间如下):8位并行连接时序图MPU将数据写入模块MPU从模块读取数据2,串行连接时序图串行数据传输以三个字节完成:第一个字节:串口控制—格式11111ABCA是数据传输方向控制:H表示从LCD到MCU的数据,L表示从MCU到LCD的数据B是数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三个字节:(并行)8位数据的低4位—格式0000DDDD串行接口时序参数:(测试条件:T =25℃VDD = 4.5V)备注:1,在模块接受指令之前,微处理器必须首先确认模块不忙,即读取高炉签到时间高炉需要0接受新说明之前;如果你不这样做’t在发送命令之前检查高炉商标,(通常在输入每日命令之前添加延迟)那么上一条指令和该指令之间必须有很长的延迟,也就是等待上一条命令的执行完成,有关命令的执行时间,请参阅命令表中的各个命令描述。
12864使用心得、笔记
备注:这篇文章是对12864操作的具体介绍,仅限刚接触12864的新手,大神请拍砖,文章写的较散,建议先参考12864手册及控制驱动器ST7920英文手册有个初步理解之后再阅读该篇文章,将会有更深的认识。
强烈建议阅读ST7920英文手册,细节内容里面有详细介绍,中文的12864也是从中译过来的。
本文分三个步骤介绍12864的内部资源原理,指令集详细讲解,以及应用例子。
对12864的所有操作概括起来有4种:1)、读忙状态(同时读出指针地址内容),初始化之后每次对12864的读写均要进行忙检测。
2)、写命令:所有的命令可以查看指令表,后续讲解指令的详细用法。
写地址也是写指令。
3)、写数据:操作对象有DDRAM、CGRAM、GDRAM。
4)、读数据:操作对象也是DDRAM、CGRAM、GDRAM。
对12864的学习首相要了解其内部资源,知道了它里面有哪些东西,你就可以更加方便的使用它。
先介绍几个英文的名字:DDRAM:(Data Display Ram),数据显示RAM,往里面写啥,屏幕就会显示啥。
CGROM:(Character Generation ROM),字符发生ROM。
里面存储了中文汉字的字模,也称作中文字库,编码方式有GB2312(中文简体)和BIG5(中文繁体)。
笔者使用的是育松电子的QC12864B,讲解以此为例。
CGRAM:(Character Generation RAM),字符发生RAM,,12864内部提供了64×2B 的CGRAM,可用于用户自定义4个16×16字符,每个字符占用32个字节。
GDRAM:(Graphic Display RAM):图形显示RAM,这一块区域用于绘图,往里面写啥,屏幕就会显示啥,它与DDRAM的区别在于,往DDRAM中写的数据是字符的编码,字符的显示先是在CGROM中找到字模,然后映射到屏幕上,而往GDRAM中写的数据时图形的点阵信息,每个点用1bit来保存其显示与否。
stc12c5a60s2-AD采集-12864串行显示终极程序-带滤波
code unsigned char name2[] = {"电流采集显示"};
code unsigned char name3[] = {"电流:A "};
code unsigned char name4[] = {"参数:mm "};
current = SmoothingFilter(current);//进行一下平滑滤波
displaystring(0x8b,current);
displaystring(0x9b,0.5*current);
}
}
/*********************延时函数******************************/
"};
void main()
{
//InitializeAD();
//InitializeTimer0();
//InitializeUart();
InitializeLcd12864();
InitializeDisplay();
while(1)
{
ADvalue = ReadADvalue(0);//读回AD值
for(y=0;y<600;y++);
}
/*******************延时函数*****************************/
/*******************************************************/
/********************lcd12864显示部分*******************/
51单片机示波器制作(12864显示带字库)
51单⽚机⽰波器制作(12864显⽰带字库)⾸先说明:我才接触51单⽚机3个星期(6⽉8号才⾼考完),对C语⾔还很陌⽣。
我就是⼀个萌新,还希望⼤佬们多多指导。
12864(带字库st7920驱动)为显⽰器,XPT2046为AD转换芯⽚。
(不要问我为什么⽤这个芯⽚,开发板⾃带的坑货。
我在⽹上下载的⽰波器程序⼤多以ADC0832或ADC0808为AD转换芯⽚,结果我都⽤不了,所以才被迫⾃写程序。
)⽰波器程序由main.c XPT2046.c XPT2046.h三个⼦⽂件构成,main.c是我根据⽹上的⼀个12864画图程序改编⽽成我也加了⼀些注释,后⾯两个⽂件取⾃开发板⾃带的例程并进⾏了修改。
所以说这个程序基本上不是我编写的,也有很多问题和不⾜之处还请指正。
下⾯是效果图。
⾸先是⽅波。
由于没有函数发⽣器,就只能通过⼿机播放只做好的正弦⾳频,再检测⼿机⽿机接⼝信号。
不知道为什么,正弦波有⼀半不见了,似乎是由于不能检测到负电压还是什么的。
下⾯贴出main.c 的代码。
01.#include <reg52.h>02.#include"XPT2046.h" 03.#define uint unsigned int 04.#define uchar unsigned char05.06.sbit RS=P2^6; //LCD 数据或命令选择端07.sbit RW=P2^5; //LCD 写⼊或读出选择端08.sbit RST=P1^0; //LCD 复位端⼝09.sbit LCDE=P2^7; // LCD 使能端10.sbit PSB=P3^2;//串⾏或并⾏选择端11.12. void delay(uchar i)13. {14. while(i--);15. } //延时函数,i=1时延时约10微秒(12M晶振)16.17. void SPI_Start()18. {19. CLK = 0;20. CS = 1;21. DIN = 1;22. CLK = 1;23. CS = 0;24. } //ADC芯⽚(XPT2046)初始化函数25.26. void lcd_busy()27.28. {29.30. RS=0;31.32. RW=1;33.34. P0=0XFF;35.36. LCDE=1;37.38. delay(14);39.40. while((P0&0x80)==0x80);41. LCDE=0;42.43. }//LCD12864(st7920驱动)查忙函数44.45. void write_com(uchar com)46.47. {48.49. lcd_busy();RS=0;50.51. RW=0;52.53. LCDE=0;54.55. P0=com;56.57. delay(9);58.59. LCDE=1;60.61. delay(9);62.63. LCDE=0;64.65. }//LCD写指令函数66.67. void write_num(uchar num)68.69. {70.71. lcd_busy();72.73. RS=1;75. RW=0;76.77. LCDE=0;78.79. P0=num;80.81. delay(7);82.83. LCDE=1;84.85. delay(9);86.87. LCDE=0;88.89. }//LCD写数据函数90.91. uchar read_data()92.93. {94.95. uchar read;96.97. lcd_busy();98.99. RS=1;100.101. RW=1;102.103. LCDE=0;104.105. delay(7);106.107. LCDE=1;108.109. delay(9);110.111. read=P0;112.113. LCDE=0;114.115. delay(11);;116.117.118.119. return read;120.121. } //LCD读数据函数122.123. void clear_lcd()124.125. {126.127. uchar i,j;128.129. write_com(0x34);130.131. for(i=0;i<32;i++) //因为LCD有纵坐标32格所以写三⼗⼆次132.133. {134.135. write_com(0x80+i); //先写⼊纵坐标Y的值137. write_com(0x80); //再写⼊横坐标X的值138.139. for(j=0;j<32;j++) //横坐标有16位,每位写⼊两个字节的的数据,也就写⼊32次140.141. { //因为当写⼊两个字节之后横坐标会⾃动加1,所以就不⽤再次写⼊地址了。
AD采样以及12864液晶显示成功程序
sid=1; //数据
else
sid=0; //指令
clk=1;// rw完成
clk=0;//进行传送
sid=0;// rs=0,显示指令数据
clk=1;//
clk=0;//传送'0'
while(temp!=0xf0)//有键按下
{
delay(5);
temp=P0;
temp=temp&0xfe;
while(temp!=0xf0)
{
temp=P0;
switch(temp)
{
case 0x7b:num=7;break;
}
sid=0;
for(i=0;i<4;i++)
{
clk=1;
clk=0;
}
}
} /*一次攒的数据八位*/
/*---------------显示汉字或字符----------------*/
uint ad0809_dy()
{
uint ad_0809;
ABC=0;//选通通道,ABC同时接A8
oe=0;//以下三条指令为起动AD0809
st=0;
st=1;
st=0;
delay(1);
while(!eoc);//等待转换结束
oe=1;//取出读得的数据
case 0xbb:num=8;break;
case 0xdb:num=9;break;
case 0xeb:num=12;break;
}
while(temp!=0xf0)//松手检测
将光敏电阻adc后显示在12864上
//此程序的实验板为郭天祥51单片机用的是郭天祥板子自带的AD 8位转换器数据输入口为P1口此处使用的液晶数据口为P0口此处将12864的写读使能端与ad的adwr定义到一个io口//上了//此程序仅供初学者且是选用郭天祥板片的此处的ADC0804//如有解释错误或者有什么问题可直接通过百度账号与我联系#include<reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit adrd=P3^7; //IO口定义sbit adwr=P3^6;sbit dula=P2^6;//段定义sbit wela=P2^7;//位定义sbit LCM_CS = P3^5;//12864数据命令选择端sbit LCM_EN = P3^4;//12864使能信号sbit LCM_POS = P1^3;//位置选择端sbit key2=P3^1;//设置阀sbit key3=P3^2;//设置阀值unsigned char j,k,adval;//定义变量uchar shichu,busy,s,count;//定义变量uchar dis2[]={"阀值"};//12864上显示阀值uchar dis1[]={"光照强度"};//12864上显示光照强度void delay(unsigned char i) //延时程序{for(j=i;j>0;j--)for(k=125;k>0;k--);}void delayms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=114;j>0;j--);}void chk_busy() //此处可省略由于有些液晶反应速度要慢单片机故加上此处用来防置液//晶显示混乱{do{LCM_EN=0;adwr=1;LCM_CS=0;LCM_EN=1;busy=P0;LCM_EN=0;delayms(1);} while(busy&&0x80==1);}void write_data(uchar Dispdata)//用来写数据到液晶中{chk_busy();//检测液晶是否处于工作中如果处于工作中则等待不动LCM_CS=1;adwr=0;LCM_EN=1;P0=Dispdata;LCM_EN=0;delayms(5);}void write_com(uchar cmdcode)//些命令到12864中{LCM_CS=0;adwr=0;LCM_EN=1;P0=cmdcode;LCM_EN=0;delayms(5);}/*set position*/void lcd_pos(uchar X,uchar Y) //数据在12864中的地址设置{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_com(pos);//diaplay the address}//显示函数void display(){uchar i;dis1[9]=(uint)(0x30+count/100);//dis1[10]=(uint)(0x30+count%100/10);dis1[11]=(uint)(0x30+count%100%10);count=5*count/255;//此处用于将二进制数据转换为十进制(此处为8位数据)lcd_pos(0,0);//将所得的数据放入12864的第一行第一个位置for(i=0;i<12;i++){write_data(dis1[i]);//将数据写入12864中}}//ad 转换程序//想必大家看到这里会有疑问因为此程序的PO口是做为12864的数据口使用的如果在使用本程序时12864与ad是否会产生影响我可以肯定的告诉大家不会产生任何影响、//只要将程序调理的写好就会避开此处问题void ad(){uchar a;wela=1;//由于IO口不够用所以有重用的可能所以先将数码管关掉P0=0; //由于io口不过用所以将ad的片选段接到了P0口当片选段为低时ad被选通adwr=0; //AD写入(随便写个什么都行,主要是为了启动AD转换)_nop_();adwr=1; //将写入的数据锁存住P0=0xff; //关闭ADCSdelay(10);wela=0; //关闭有AD片选信号锁存器的锁存端以防止在操作数码管时使AD的片选发生变化因为PO 口连接着数码管display();//此处将显示函数写到这里正常应为一个延时(最好大一些)(当做延时使用了)wela=1; //重新打开有AD片选信号锁存器的锁存端P1=0xff; //读取P1口之前先给其写全1(先将单片机的P1口全写为高电平)P0=0; //选通ADCSadrd=0; //AD读使能count=P1; //将P1口读到的数据送给countadrd=1;P0=0xff; //关闭ADCSadwr=0;}//12864初始化设置//写数据到LCD(底层)void lcd_init(){ chk_busy();LCM_POS=1; //bingkoufangshiwrite_com(0x30); //选择8bit数据流delayms(5);write_com(0x0c); //开显示(无游标、不反白)delayms(5);write_com(0x01); //清除显示,并且设定地址指针为00Hdelayms(5);}//阀值设置部分void shenzhi() //阀值设置{uchar xuanze,i,b;xuanze=1;switch(xuanze)//此处应用switch case 语句有点写多余了嘿嘿嘿{case 1:{if(key2==0){delayms(100);shichu++;if(shichu==100) //加阀值shichu=0;}if(key3==0){ //如果阀值大于零则进入减阀值if(shichu>0){delayms(100);shichu--;}}dis2[4]=(uint)(0x30+shichu/100);//取百位写到第四个位置上dis2[5]=(uint)(0x30+shichu%100/10); //取十位将处理后的阀值显示在12864上写到第五个位置上dis2[6]=(uint)(0x30+shichu%100%10);//取个位写到第六个位置上lcd_pos(2,0);将得到的值写到12864上第三行for(i=0;i<8;i++){write_data(dis2[i]);//将数据写进12864内部}} break;default:break;}}void main() // 主程序{lcd_init();液晶初始化while(1){shenzhi(); 阀值设置ad();ad转换}}。
12864引脚资料以及硬件电路
LCD12864硬件连接前不久在做一个小东西,使用STC12C5A60S2部AD采集外界波形数据,驱动LCD12864画出采集的波形,并设置有数据处理切换功能,单独显示幅度与周期。
调试LCD12864液晶屏过程中出现了不少问题,程序倒不是主要原因,关于12864的引脚小异。
看到很多论坛倒是有不少LCD的底层驱动程序,不过引脚连接以与调试过程说的倒是不多。
LCD12864的引脚图:硬件连接:这里重点说一下,LCD12864的电源问题,关于控制线与数据线我想英爱不需要说的吧。
VCC和GND是最基本的电源,一般接5V即可,还有就是关于VEE以与VL(很多种屏称作V0,不过都一样了),一般接法如上图所示即可,这里强调一下:当LCD 与单片机接线以与电源供给完毕以后,需要调节可变电阻的阻值,可以说这个决定了你的液晶屏是否显示。
只有阻值在特定的位置区域以才会显示。
最后就是关于BL+和BL-了,这个是液晶屏的背光,不建议直接接在VCC和GND上,加小电阻限流同时可以使用DA或者普通的IO口来控制(当然DA可以控制得更加犀利——改变亮度,IO口只能控制亮与灭)。
最后在总结一下,调试中遇到的各种问题如何应付:一、无任何显示A:硬件问题1:这种情况是新手最常碰到的问题,碰到这种情况首先对应硬件pdf文档,确定你的接线没有任何问题,如果是51单片机,用P0口一定要加10K的上拉电阻,不然程序正常了也显示不出来。
2:另外要注意第三脚VO的连接方式,这个是对比度电位引脚,实际中常采用10k的可变电阻滑动端连接vo脚,固定端的一段接vcc,另外一端应根据实际硬件连接。
如果用的是1602,另一端直接接到gnd就可以了,但是对于12864就应该看18脚的标记了,如果写的是NC ,那么另一端直接接地,如果是VEE,那么就应该接到18脚,因为这时的18脚是负压输出端。
根据这点确定你的对比对调节电路接确无误。
3:关于串并行选择的问题。
AD以及12864部分程序
开始外设初始化AD开始滤波采样读取转换结果并存储由算法将转换结果换算成原始数据显示到LCD* Filename : ProcessorExpert.c** Project : ProcessorExpert** Processor : MC9S08JM60CLHE** Version : Driver 01.12** Compiler : CodeWarrior HCS08 C Compiler** Date/Time : 2013-11-29, 13:18, # CodeGen: 0** Abstract :** Main module.** This module contains user's application code.** Settings :** Contents :** No public methods**** ###################################################################*/ /*!** @file ProcessorExpert.c** @version 01.12** @brief** Main module.** This module contains user's application code.*//*!** @addtogroup ProcessorExpert_module ProcessorExpert module documentation ** @{*//* MODULE ProcessorExpert *//* Including needed modules to compile this module/procedure */#include "Cpu.h"#include "Events.h"/* Include shared modules, which are used for whole project */#include "PE_Types.h"#include "PE_Error.h"#include "PE_Const.h"#include "IO_Map.h"/* User includes (#include below this line is not maintained by Processor Expert) */ISR(AD_Interrupt){int i;uchar Channels[16],AD_outVH[],AD_outVL[];Channels[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E, 0x0F};i=0;AD_outVH[i]=ADCRH;AD_outVL[i]=ADCRL;i++;if(i==16){i=0;OutFlg=TRUE;ModeFlg=STOP;return;}ADCSC1=Chanels[i];}void AD_start(){ADCSC1=0x01;/*chan1 */}char AD_Getvalue(uchar *temph,*templ){int i=0;char temper;temper=(&temph<<8)|&templ;return temper;}char Gettemp(char temper){}void write_cmd(uchar com){uchar temp=0;LCDRS=0;LCDRW=1;do{LCDEN=1;Delayms(1);temp=P0;LCDEN=0;}While(temp$0x80);LCDRW=0;P0=com;LCDEN=1;Delayms(1);LCDEN=0;}void write_data(uchar data) {uchar temp=0;LCDRS=0;LCDRW=1;do{LCDEN=1;Delayms(1);temp=P0;LCDEN=0;}While(temp$0x80);LCDRW=0;P0=com;LCDEN=1;Delayms(1);LCDEN=1;}void LCD_init(){LCDRST=1;write_cmd(0x30);Delayms(1);write_cmd(0x02);Delayms(1);write_cmd(0x0C);Delayms(1);write_cmd(0x01);Delayms(1);write_cmd(0x06);Delayms(1);}void LCD_show(int i,uchar temp[]){LCD_init();int s;switch(i){case1:write_cmd(0x80);for(s=0;s++;s<10){write_data(temp[s]) ;break;}case2:write_cmd(0x90);for(s=0;s++;s<10){write_data(temp[s]) ;break;}case3:write_cmd(0x88);for(s=0;s++;s<10){write_data(temp[s]) ;break;}case4:write_cmd(0x98);for(s=0;s++;s<10){write_data(temp[s]) ;break;}}}void main(void){/* Write your local variable definition here */uchar temp[],AD_outV[];int n;/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/PE_low_level_init();/*** End of Processor Expert internal initialization. ***//* Write your code here *//* For example: for(;;) { } */for(;;){AD_start();char *p,*q,temper*p=&temph[0];*q=&templ[0];temper=AD_Getvalue(*p,*q);temp=Gettemp();}/*** Don't write any code pass this line, or it will be deleted during code generation. ***/ /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/for(;;){}/*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***//* END ProcessorExpert *//*!** @}*//*** ###################################################################**** This file was created by Processor Expert 10.3 [05.08]** for the Freescale HCS08 series of microcontrollers.**** ###################################################################*/。
94单片机示波器--12864
94单片机示波器–12864简介本文档介绍了使用94单片机和12864液晶屏制作示波器的方法。
示波器是一种用于查看电信号波形的仪器,它可以帮助我们理解电路的工作原理以及检测电路中的故障。
在本项目中,我们将使用94单片机和12864液晶屏来制作一个简易的示波器。
通过采集输入信号并在液晶屏上显示波形,我们可以实时观察信号的变化,并进行分析。
所需材料在开始之前,我们需要准备以下材料:•94单片机开发板•12864液晶屏•面包板和跳线•电阻、电容等元件(根据电路设计需要)硬件连接首先,我们需要将94单片机开发板和12864液晶屏进行连接。
具体的连接方式可以参考开发板和液晶屏的产品手册。
一般来说,我们需要将94单片机的引脚通过跳线连接到液晶屏的引脚上。
连接的方式可能包括并行连接、串行连接等方式,具体使用哪种连接方式可以根据液晶屏的型号进行选择。
连接完成后,我们可以将94单片机开发板上的程序下载到开发板上,并进行相应的设置。
软件设计接下来,我们需要进行软件设计。
本示波器的软件设计主要包括以下几个方面:输入信号采集我们需要使用94单片机的ADC模块来采集输入信号。
通过设置合适的引脚和参数,我们可以将输入信号通过ADC转换为数字信号,方便后续处理。
数据处理和显示采集到的数字信号需要进行处理和显示。
我们可以使用94单片机的计算能力和12864液晶屏的显示能力来进行数据处理和图形显示。
具体的数据处理方式可以根据需求进行选择。
通常可以使用FFT算法进行频谱分析,或者使用差值和滤波算法进行波形插值和滤波处理。
用户界面设计为了方便用户操作和观察,我们需要设计一个简洁明了的用户界面。
通过液晶屏上的菜单和按键,用户可以选择不同的参数和功能。
控制逻辑设计示波器的控制逻辑需要根据用户的操作来进行相应的响应和处理。
我们可以使用94单片机的中断和定时器功能来实现控制逻辑。
程序实现根据上述软件设计的要求,我们可以编写相应的程序来实现示波器的功能。
无杂点 12864 显示AD
无杂点 12864 显示AD.txt让人想念而死,是谋杀的至高境界,就连法医也鉴定不出死因。
#include <iom16v.h>#include <macros.h>#include <string.h>#include<MATH.H>#define uchar unsigned char#define uint unsigned int#pragma interrupt_handler ad_handler:15uint addata,flag;uchar i,y;#define RS (1<<0)#define RW (1<<1)#define EN (1<<2)void Write_com(unsigned char WCLCM);void Write_data(unsigned char WDLCM);void img_disp(__flash unsigned char *img){uchar i,j;for(j=0;j<32;j++){for(i=0;i<8;i++){Write_com(0x34); //扩充指令集,关绘图Write_com(0x80+j); //先将垂直坐标(Y)写入绘图RAM地址Write_com(0x80+i); //再将水平坐标(X)写入绘图RAM地址Write_com(0x30); //打开基本指令集Write_data(img[j*16+i*2]); //将D15--D8写入到RAM,Write_data(img[j*16+i*2+1]); //将D7--D0写入到RAM}}for(j=32;j<64;j++) //下半屏{for(i=0;i<8;i++){Write_com(0x34); //扩充指令集,关绘图Write_com(0x80+j-32); //先将垂直坐标(Y)写入绘图RAM地址Write_com(0x88+i); //再将水平坐标(X)写入绘图RAM地址Write_com(0x30); //打开基本指令集Write_data(img[j*16+i*2]); //将D15--D8写入到RAM,Write_data(img[j*16+i*2+1]); //将D7--D0写入到RAM}}Write_com(0x36); //打开绘图显示}//延时函数void s_ms(uint ms){for(;ms>1;ms--);}//此处定义字符串//写数据void Write_data(unsigned char WDLCM) {s_ms(5);PORTD|=RS; //RS=1s_ms(5);PORTD&=~RW; //RW=0s_ms(5);PORTD|=EN; //EN=1s_ms(5);PORTB=WDLCM; //输出数据s_ms(5);PORTD&=~EN; //EN=0s_ms(5);}//写指令void Write_com(unsigned char WCLCM) {s_ms(5);PORTD&=~RS; //RS=0s_ms(5);PORTD&=~RW; //RW=0s_ms(5);PORTD|=EN; //EN=1s_ms(5);PORTB=WCLCM; //输出指令s_ms(5);PORTD&=~EN; //EN=0s_ms(5);}uchar read_data(void){uchar lcd_data;PORTB=0xff;DDRB=0x00;PORTD|=RW;PORTD|=RS;PORTD|=EN;s_ms(10);lcd_data=PINB;s_ms(10);PORTD&=~EN;DDRB=0xff;return(lcd_data) ;}void point(uchar x,uchar y,uchar flag) {uchar x_Dyte,x_byte;uchar y_Dyte,y_byte;uchar GDRAM_hbit,GDRAM_lbit;Write_com(0x36);x_Dyte=x/16;x_byte=x&0x0f;y_Dyte=y/32;y_byte=y&0x1f;Write_com(0x80+y_byte);Write_com(0x80+x_Dyte+8*y_Dyte);read_data();GDRAM_hbit=read_data();GDRAM_lbit=read_data();s_ms(5);Write_com(0x80+y_byte); //设定行地址(y坐标)Write_com(0x80+x_Dyte+8*y_Dyte); //设定列地址(x坐标),并通过8*y_Dyte选定上下屏s_ms(5);if(x_byte<8){if(flag==1)Write_data(GDRAM_hbit|(0x01<<(7-x_byte)));elseWrite_data(GDRAM_hbit&(~(0x01<<(7-x_byte))));Write_data(GDRAM_lbit);}else{Write_data(GDRAM_hbit);if(flag==1)Write_data(GDRAM_lbit|(0x01<<(15-x_byte)));elseWrite_data(GDRAM_lbit&(~(0x01<<(15-x_byte))));}Write_com(0x30);}//LCM初始化void LCMInit(void){Write_com(0x30); //三次显示模式设置,不检测忙信号s_ms(5);Write_com(0x30);s_ms(5);//Write_com(0x30);//s_ms(10);Write_com(0x30); //显示模式设置,开始要求每次检测忙信号Write_com(0x08); //关闭显示Write_com(0x01); //显示清屏Write_com(0x06); //显示光标移动设置Write_com(0x0C); //显示开及光标设置}void clear(uchar dat){uchar i,j,k;uchar addr=0x80;for(i=0;i<2;i++){for(j=0;j<32;j++){for(k=0;k<8;k++){Write_com(0x36);Write_com(0x80+j);Write_com(addr+k);Write_data(dat);Write_data(dat);}}addr=0x88;}Write_com(0x36);Write_com(0x30);void ad_handler(void){addata=ADCH;//PORTB=~(addata); //取反用LED显示ADCSRA|=BIT(ADSC); //启动下一次转换 ADCSR状态寄存器 ADSC模数转换启动位//ADCSR|=(1< }}//主函数void main(void){//端口初始化uchar table[127]={0};int b;PORTA=0; //无上拉DDRA=0; //设置PA口为输入DDRD=0xff;PORTD=0xff;DDRB=0xff;PORTB=0xff;s_ms(10);LCMInit(); //LCM初始化 //液晶初始化s_ms(10);clear(0x00);for(i=0;i<128;i++){point(i,58,1);}for(i=0;i<64;i++){point(10,i,1);}ADMUX=0x60; //基准AVCC,左对齐选择第2通道加入ADCSRA=0xCE; //采用单次转换模式,64分频ADCSRA|=BIT(ADSC); //启动一次哑转换SREG=0x80;//开中断while(1){for(i=12;i<128;i++){ADCSRA|=BIT(ADSC); //启动一次转换b=54-addata/4;point(i,b,1);table[i]=b;s_ms(10000);}for(i=12;i<128;i++){point(i,table[i],0);}}/*for(i=12;i<128;i++){ADCSRA|=BIT(ADSC); //启动一次转换s_ms(10);point(i,54-addata/4,1);table[i]=54-addata/4;s_ms(1000);}while(1){for(i=12;i<128;i++){point(i,table[i],0);ADCSRA|=BIT(ADSC); //启动一次转换s_ms(10);point(i,54-addata/4,1);table[i]=54-addata/4;s_ms(1000);}}*/}。
12864液晶4位并行接口驱动程序
12864液晶4位并行接口驱动程序#include#include#include#include#define uchar unsigned char#define uint unsigned int#define DATA 1#define COMMAND 0sbit rs=P2^4;sbit rw=P2^5;sbit en=P2^6;sbit psb=P2^1;sbit rst=P2^3;sbit key=P1^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, //第四行汉字位置};uchar code str1[]="黄河远上白云间,一片孤城万仞山。
羌笛何须怨杨柳,春风不度玉门关。
";uchar code bmp1[]={//********************************************************//// 位图点阵占用1024字节//********************************************************//0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0 xFF,0x FF,0xFF,0xFF,0x80,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x70,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x3F,0xC0,0x00,0x07,0x07,0x00,0x04,0x01,0x00,0x 00,0x38,0x60, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x78,0xE0,0x00,0x3F,0x83,0x80,0x06,0x03,0x80,0x 00,0x1C,0x70, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x02,0x38,0x70,0x00,0xFF,0x07,0x80,0x06,0x39,0x80,0x 00,0x1F,0x70, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x02,0x1C,0x30,0x00,0x7C,0x0E,0x00,0x06,0x19,0xC0,0 x00,0x1F,0x8 0,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x02,0x1C,0x30,0x00,0x3E,0x1C,0x00,0x06,0x1F,0xC0,0x 00,0x7F,0x0 0,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x03,0x3E,0x30,0x00,0x62,0x1A,0x00,0x0F,0x79,0x00,0x 03,0xFE,0x00 ,0x00,0x01,0x80,0x00,0x00,0x60,0x0F,0x00,0x3F,0x00,0x00,0x00,0x3C,0x 00,0xC0,0x00 ,0x00,0x01,0x80,0x07,0x76,0x18,0x00,0xC3,0xC1,0x00,0x1F,0xFB,0x00,0x 03,0xFE,0x0 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x3F,0xC0,0xF1,0xC0,0x00,0x00,0xF0,0x 01,0xC0,0x0 0,0x00,0x01,0x80,0x07,0x6E,0x18,0x00,0xCF,0xC1,0x80,0x7E,0x3F,0x80,0x 01,0xE2,0x0 0,0x00,0x01,0x80,0x00,0x07,0xE0,0x7F,0xE0,0xE0,0xE0,0x00,0x03,0xC0,0x 03,0xC0,0x0 0,0x00,0x01,0x80,0x07,0x7F,0x98,0x00,0xFE,0x83,0x81,0xFC,0x1E,0xC0,0x 00,0x83,0x0 0,0x00,0x01,0x80,0x00,0x0F,0xE0,0x63,0xE1,0xE0,0xE0,0x00,0x07,0x00,0x 03,0xC0,0x0 0,0x00,0x01,0x80,0x06,0xFF,0xD8,0x01,0xFA,0x87,0x00,0xFD,0xF8,0xC0,0x 01,0x73,0x0 0,0x00,0x01,0x80,0x00,0x01,0xE0,0xC1,0xE1,0xE0,0xE0,0x00,0x0F,0x00,0x 07,0xC0,0x0 0,0x00,0x01,0x80,0x0F,0xD9,0xD8,0x03,0xE3,0x0E,0x80,0xFE,0x7E,0xC0,0 x03,0xF9,0x8 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x01,0xE1,0xF0,0xE0,0x00,0x1E,0x00,0x 0B,0xC0,0x0 0,0x00,0x01,0x80,0x0D,0xB8,0x18,0x1F,0xC3,0x08,0xC0,0x0E,0x6D,0x80,0 x03,0xF1,0x8 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x01,0xE0,0xFD,0xC7,0xEF,0x9E,0x00,0x 13,0xC0,0x0 0,0x00,0x01,0x80,0x0D,0xFE,0x18,0x0F,0xC2,0x10,0xE0,0x1C,0x3F,0x00,0x 03,0xE0,0xC 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x01,0xC0,0xFF,0x83,0xC6,0x1F,0xE0,0x 13,0xC0,0x0 0,0x00,0x01,0x80,0x0D,0xCE,0x18,0x06,0xC2,0x01,0xC0,0x38,0x3E,0x00,0 x00,0xE8,0xC 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x01,0x80,0x3F,0x81,0xE4,0x3C,0x78,0x 23,0xC0,0x00 ,0x00,0x01,0x80,0x0C,0x4C,0x18,0x00,0xC2,0x03,0x80,0x78,0x1F,0xF0,0x 00,0xFC,0x6 0,0x00,0x01,0x80,0x00,0x01,0xE0,0x03,0x80,0x3F,0xC1,0xE8,0x3C,0x78,0x 43,0xC0,0x0 0,0x00,0x01,0x80,0x0C,0x5E,0x18,0x00,0xC2,0x07,0x00,0x68,0x3F,0xF8,0x 03,0xFC,0x2 2,0x00,0x01,0x80,0x00,0x01,0xE0,0x03,0x00,0x6F,0xC0,0xF0,0x3C,0x3C,0x 83,0xC0,0x0 0,0x00,0x01,0x80,0x06,0x3F,0x38,0x01,0x82,0x0E,0x00,0x09,0xF8,0x00,0x 03,0xC0,0x32 ,0x00,0x01,0x80,0x00,0x01,0xE0,0x06,0x00,0xC3,0xE0,0x78,0x3C,0x3C,0 xFF,0xF0,0x0 0,0x00,0x01,0x80,0x07,0x10,0x38,0x00,0x82,0x1C,0x00,0x0B,0x99,0xC0,0 x03,0x00,0x1A ,0x00,0x01,0x80,0x00,0x01,0xE0,0x0C,0x11,0xC3,0xE0,0x78,0x3C,0x3C,0 xFF,0xF0,0x0 0,0x00,0x01,0x80,0x03,0xFF,0xF0,0x00,0x02,0x38,0x00,0x08,0x30,0xE0,0x 02,0x00,0x1E ,0x00,0x01,0x80,0x00,0x01,0xE0,0x08,0x11,0xC1,0xE0,0x7C,0x3C,0x3C,0 xFF,0xF0,0x0 0,0x00,0x01,0x80,0x01,0xEF,0xF0,0x00,0x00,0xE0,0x00,0x08,0xE0,0x60,0x 00,0x00,0x0E ,0x00,0x01,0x80,0x00,0x01,0xE0,0x1F,0xF1,0xC1,0xE0,0xBC,0x1C,0x3C,0 x03,0xC0,0x 00,0x00,0x01,0x80,0x00,0x03,0xE0,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x 00,0x00,0x07, 0x00,0x01,0x80,0x00,0x01,0xE0,0x3F,0xE1,0xC1,0xC0,0x9E,0x1E,0x38,0x 03,0xC0,0x0 0,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x01, 0x00,0x01,0x80,0x00,0x01,0xF0,0x7F,0xE0,0xE3,0x83,0x1F,0x0E,0x70,0x 03,0xC0,0x0 0,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x0F,0xFC,0xFF,0xE0,0x3F,0x07,0xDF,0x83,0xE0,0x 03,0xC0,0x0 0,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00, 0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x60,0x00, 0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0 xFF,0x FF,0xFF,0xFF,};void writeByte(uchar flag,uchar content);void delayUs(uint z){while(z--);}void delay1MS(uchar x){uchar k,j;x=x<<1;for(k=0;k<x;k++)< p="">for(j=0;j<255;j++)_nop_();}/*------------------------------------------------检测忙位------------------------------------------------*/void CheckBusy(){uchar temp1,temp2;do{en=0;delayUs(5);rs=0;rw=1;en=1;temp1=P0; //读高字节delayUs(10);en=0;delayUs(5);rs=0;rw=1;en=1;temp2=P0; //读低字节en=0;/*数据处理*/temp1=temp1&0xf0;temp2=(temp2&0xf0)>>4;temp1=(temp1+temp2);}while((temp1&0x80)==0x80);}void init(){rst=0;delayUs(40);rst=1;delayUs(40);psb=1;delayUs(8);writeByte(COMMAND,0x20); //基本指令集4bit数据delayUs(8);writeByte(COMMAND,0x01);delayUs(8);writeByte(COMMAND,0x06);delayUs(8);writeByte(COMMAND,0x0c);delayUs(8);}/************************************************************** ************************** *** 函数名称:SendByte* 功能描述:串口发送一个字节*flag=1,写入数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define FIRST_ADDR 0/*TS12864A-3 端口定义*/#define LCD_data P0#define ad0_7 P1 //数据口#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};sbit LCD_RS = P3^5; //寄存器选择输入sbit LCD_RW = P3^6; //液晶读/写控制sbit LCD_EN = P3^4; //液晶使能控制sbit LCD_PSB = P3^7; //串/并方式控制sbit dula=P2^6;sbit wela=P2^7;sbit cs=P3^2; //芯片选择信号,控制芯片的启动和结果读取,低电平有效sbit rd=P3^7; //读数据控制,低电平有效sbit wr=P3^6;unsigned char a,j,k,adval;uint q=4,colour=1;/*******************************************************************/ /* */ /* 延时函数*/ /* */ /*******************************************************************/void delay(int ms){while(ms--){uchar i;for(i=0;i<250;i++){_nop_();_nop_();_nop_();_nop_();}}}void delay1(uint i){ uint j;for(;i>0;i--)for(j=0;j<410;j++);}/*******************************************************************//* *//*检查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=数据。
*//* */ /*******************************************************************/void lcd_wdat(uchar dat){while(lcd_busy());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}/*******************************************************************/ /* */ /* LCD初始化设定*/ /* */ /*******************************************************************/ void lcd_init(){LCD_PSB = 1; //并口方式ad0_7=0xff;lcd_wcmd(0x34); //扩充指令操作delay(5);lcd_wcmd(0x30); //基本指令操作delay(5);lcd_wcmd(0x0C); //显示开,关光标delay(5);lcd_wcmd(0x01); //清除LCD的显示内容delay(5);lcd_wcmd(0x06);delay(5);}/*------------------显示字符串--------------------------*/void hzkdis(unsigned char code*s){while(*s>0){lcd_wdat(*s);s++;delay(50);}}//------------------清整个GDRAM空间----------------------------void clrgdram(){unsigned char x,y ;for(y=0;y<64;y++)for(x=0;x<16;x++){lcd_wcmd(0x34);lcd_wcmd(y+0x80);//行地址lcd_wcmd(x+0x80);//列地址lcd_wcmd(0x30);lcd_wdat(0x00);lcd_wdat(0x00);}}//------------------------------------------------------------void clrscreen(){lcd_wcmd(0x01);delay(50);}unsigned char ReadByte(void){unsigned char byReturnValue ;lcd_busy();LCD_data=0xff ;LCD_RS=1 ;LCD_RW=1 ;LCD_EN=0 ;LCD_EN=1 ;byReturnValue=LCD_data ;LCD_EN=0 ;return byReturnValue ;}//增加画点子程序void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color){unsigned char Row,Tier,Tier_bit ;unsigned char ReadOldH,ReadOldL ;lcd_wcmd(0x34);lcd_wcmd(0x36);Tier=X>>4 ;Tier_bit=X&0x0f ;if(Y<32){Row=Y ;}else{Row=Y-32 ;Tier+=8 ;}lcd_wcmd(Row+0x80);lcd_wcmd(Tier+0x80);ReadByte();ReadOldH=ReadByte();ReadOldL=ReadByte();lcd_wcmd(Row+0x80);lcd_wcmd(Tier+0x80);if(Tier_bit<8){switch(Color){case 0 :ReadOldH&=(~(0x01<<(7-Tier_bit)));break ;case 1 :ReadOldH|=(0x01<<(7-Tier_bit));break ;case 2 :ReadOldH^=(0x01<<(7-Tier_bit));break ;default :break ;}lcd_wdat(ReadOldH);lcd_wdat(ReadOldL);}else{switch(Color){case 0 :ReadOldL&=(~(0x01<<(15-Tier_bit)));break ;case 1 :ReadOldL|=(0x01<<(15-Tier_bit));break ;case 2 :ReadOldL^=(0x01<<(15-Tier_bit));break ;default :break ;}lcd_wdat(ReadOldH);lcd_wdat(ReadOldL);}lcd_wcmd(0x30);}void start_ad(void){ //wela=1;cs=0; //允许进行A/D转换wr=0;_nop_();wr=1; //WR由低变高时,AD开始转换cs=1; //停止AD转换}//读A/D数据子程序///////////////////////////////////////read_ad(){ uint ad_data;wela=1;cs=0; //允许读rd=0; //读取转换数据结果数据结果_nop_();ad_data=ad0_7; //把数据存到ad_data中wela=1;rd=1;cs=1; //停止A/D读取return(ad_data);}void data_shout(uint ad_data){ uint three,four,two,one,addata;addata=read_ad();four=addata/17; //第四位数码管(最高位)three=(addata%17)*10/17; //第三位数码管addata=(four*10+three)/2;//two=ad_data%51*10%51*10/51; //第二位数码管//one=ad_data%51*10%51*10%51*10/51; //第一位数码管(最低位)addata=(four*10+three)/2;delay1(35);DrawPoint(q,addata,colour);q=q+1;delay1(10);}/*********************************************************//* *//* 主程序*//* *//*********************************************************/int main(void){ uchar x;LCD_RW =0;lcd_init(); //初始化LCDclrgdram(); //清整个GDRAM空间delay(100);clrscreen();while(1){start_ad(); //启动AD//data_shout(read_ad()); //读AD数据并显示//DrawPoint(i,data_shout(),colour);//i=i+1;//m=m+1;//while(m>=89) m=0;//while(i>=124) i=4;data_shout(read_ad()); //读AD数据并显示if(q>=120) {//lcd_wcmd(0x01);delay(50);q=4;LCD_RW =0;lcd_init(); //初始化LCDclrgdram();delay(100);clrscreen();}delay(12);//start_ad(); //启动AD。