基于ST7920控制器的12864温度曲线

合集下载

12864显示温度曲线

12864显示温度曲线

12864显示温度曲线//12864并行连接,PSB接地正极#include#include#include#define uint unsigned int#define uchar unsigned charsbit rs=P2^0; /*数据\指令选择*/sbit rw=P2^1; /*读\写选择*/sbit e=P2^2; /*读\写使能*/sbit ds=P3^3; //18B20信号脚uint temp;float ftemp;uchar code table[]="0123456789.d"; void writecom(uchar com);void writedat(uchar dat);void initinal(void);//12MHZ晶振延时50微秒void delay50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}void dsreset() // ds18b20初始化函数{uint i;ds=0; //拉低总线开始复位i=103;while(i>0)i--;ds=1;//释放总线i=4;while(i>0)i--;// 省去了等待芯片返回应答的过程。

}bit readbit(void) //ds18b20读取一个二进制位,参照时序图{ uint i;bit dat;ds=0;i++;ds=1;i++,i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar tempread(void) //ds18b20读取一个字节的数据{ uchar i,j,dat;dat=0;for(i=0;i<8;i++){j=readbit();dat=(j<<7)|(dat>>1); //}return(dat);}void tempwrite(uchar dat) //ds18b20写入字节数据{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb==1) // 写1{ds=0; // 拉低总线以开始一个写时序i++;i++;ds=1; // 释放总线i=8;while(i>0)i--;}else // 写0{ds=0;i=8;while(i>0)i--;ds=1;i++;i++;}}}void tempchang(void) //温度转换{dsreset();delay50us(20);tempwrite(0xcc); //tempwrite(0x44); //}uint gettemp() // 获取温度{uchar a,b;dsreset();delay50us(2000); //延时100毫秒消除恐怖85度tempwrite(0xcc); //tempwrite(0xbe); //a=tempread(); //b=tempread(); //temp=b;temp<<=8; //////temp=temp|a;ftemp=temp*0.0625; //temp=ftemp*10+0.5; //ftemp=ftemp+0.05; //return temp; //}/*------------------检查忙位-----------------------------*/ void chkbusy(){rs=0;rw=1;e=1;P0=0xff ;while((P0&0x80)==0x80);e=0;}/*************读数据************/uchar read(){uchar shuju;chkbusy();P0=0xff;rs=1;rw=1;e=0;delay50us(1);e=1;shuju=P0;// delay(5);e=0;return(shuju);}//增加画点子程序void DrawPoint(uchar X,uchar Y,uchar Color) {uchar Row,Tier,Tier_bit ;uchar ReadOldH,ReadOldL ;writecom(0x34);writecom(0x36);Tier=X>>4 ;Tier_bit=X&0x0f ;if(Y<32){Row=Y ;}else{Row=Y-32 ;Tier+=8 ;}writecom(Row+0x80);writecom(Tier+0x80);read();ReadOldH=read();ReadOldL=read();writecom(Row+0x80);writecom(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 ;}writedat(ReadOldH);writedat(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 ;}writedat(ReadOldH);writedat(ReadOldL);}writecom(0x30);}//写命令void writecom(uchar com){chkbusy();rw=0;rs=0;delay50us(1);P0=com;e=1;delay50us(10);e=0;delay50us(10);}//写数据void writedat(uchar dat){chkbusy();rw=0;rs=1;delay50us(1);P0=dat;e=1;delay50us(10);e=0;delay50us(10);}//初始化void initinal(void){delay50us(2);writecom(0x30);delay50us(4);writecom(0x30);delay50us(4);writecom(0x0e);delay50us(4);writecom(0x01);delay50us(240);writecom(0x06);delay50us(10);}void clrscreen(){writecom(0x01);delay50us(10);}//------------------清整个GDRAM空间---------------------------- void clrgdram(){unsigned char x,y ;for(y=0;y<64;y++)for(x=0;x<16;x++){writecom(0x34);writecom(y+0x80);//行地址writecom(x+0x80);//列地址writecom(0x30);writedat(0x00);writedat(0x00);}}//------------------------------------------------------------ //主函数void main(){uchar i,j,e,colour=1;uint a ;rw=0;initinal();clrgdram();delay50us(2);// clrscreen();writecom(0x34);while(1){uint a,b,c,d;DrawPoint(17,6,colour); DrawPoint(17,22,colour); DrawPoint(17,38,colour); DrawPoint(17,54,colour); for(j=16;j<124;j++){DrawPoint(16,j-16,colour); DrawPoint(j,63,colour); DrawPoint(i,e,colour); writecom(0x80); writedat(table[6]); writedat(table[7]); writecom(0x90); writedat(table[5]); writedat(table[1]); writecom(0x88); writedat(table[3]); writedat(table[5]); writecom(0x98); writedat(table[1]); writedat(table[9]);}for(i=16;i<124;i++){tempchang();a=gettemp();e=73-a/10;DrawPoint(i,e,colour); delay50us(10000);b=a/100;c=a%100/10;d=a%100%10; writecom(0x83); writedat(table[b]); delay50us(1); writedat(table[c]); delay50us(1); writedat(table[10]); delay50us(1); writedat(table[d]); delay50us(1); writedat(table[11]); delay50us(4); writecom(0x83); }clrgdram();// writecom(0x36); // delay50us(5);// clrgdram();// clrscreen();// tempchang();// a=gettemp();}}。

ST7920控制器的lcd12864驱动程序头文件+6页+0[1].1M

ST7920控制器的lcd12864驱动程序头文件+6页+0[1].1M

P4=0x01;
}
/***************************************************************** (6)函数名称:ReadData12864() 读当前地址的DDRAM数据 *****************************************************************/ uchar ReadData12864(void) {
/***************************************************************
(5)函数名称:WriteData12864(uchar lcd_data)写数据
入口参数:lcd_data
返回参数:无
****************************************************************/
for(y=0;y<=31;y++) //注意:st7920用于lcd12864时,分上下两区,lcd_y依次从0到31,lcd_x从0到15
{
for(x=0;x<=7;x++)
{
GdramOff();
WriteCmd12864(0x80+y);
WriteCmd12864(0x80+x+i);
WriteData12864(0x00);
//接线说明
#define LCD_DATA
P5 //8 bit数据线 EN=P4^2 ,RW=P4^1 ,RS=P4^0
//初始化指令 #define CLEAR_LCD //#define AC_INIT //#define CURSE_ADD 体不动) #define FUN_MODE #define DISPLAY_ON #define DISPLAY_OFF //#define CURSE_DIR //#define SET_CG_AC //#define SET_DD_AC

12864液晶的说明

12864液晶的说明

液晶12864(KS0108主控)12864市面上比较流行的有两种,一种是以KS0108为主控芯片的,不带字库的,说白了就是只能靠打点才能显示出字符或图形的,当然要借助取模软件;另一种是以ST7920为主控芯片的,带ASCII码和中文字库。

至于两种的区别下一篇再讨论,这篇先讲述KS0108为主控芯片的12864的原理。

这是网上找的一个管脚图,当然不同品牌的可能略有差异,但是主要的还是一样的重点要讲一下CS1和CS2,KS0108控制的12864内部有两个控制器,分别控制左半屏和右半屏,如下图所示左半屏和右半屏操作时写的地址其实是一样的,那么只能通过片选CS1和CS2来选择哪半个屏了,如果两个都选通,则相当于两块64x64的液晶了,而且显示的内容是一样的,取模方式是纵向8点下高位。

好了,来说下原理,列的范围是0~63,我已经标出了,行是不能按位来写的,而是写“页”,一个页相当于8个点,也就是8位,即一个字符,高位在下面,那么页的范围是0~7,共8页,8页x8个点正好64个点。

这是我用取模软件截的一个“们”字,可以看出它是16x16大小的,实际上占用了两个“页”,16个列,而我们操作时先固定一个页,比如这个就先写上面那页,假设为n好了,从列0写到16,然后页n+1,再从列0写到16,这样一个“们”字就出来了,下面是其代码0x40,0x20,0xF8,0x07,0x00,0xF8,0x02,0x04, 0x08,0x04,0x04,0x04,0x04,0xF E,0x04,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F ,0x00,0x00,可见16x16的字符占了32个字节(上面n页16个字节加n+1页16个),那么如果一幅满幅的图片,就是128x64,占用128x8=1K个字节,可见还是非常占空间的。

ST7920[1](字库)12864

ST7920[1](字库)12864
ST
Sitronix
主要特色
z 電源操作範圍: - 2.7 to 5.5V z 提供8-位元4-位元及串列之MPU界面 z 64 x 16-位元 字元顯示RAM (DDRAM 最多 16 字元 x 4 行 , LCD顯示範圍為16字元 X 2行) z 64 x 256-位元 繪圖顯示RAM(GDRAM) z 2M-位元 ㆗文字型 ROM (CGROM) 總共提供 8192 個㆗文字型 (16x16 點陣) z 16K-位元 半寬字型 ROM (HCGROM) 總共提供 126 個符號字型 (16x8 點陣) z 64 x 16-位元 字型產生 RAM (CGRAM) z 15 x 16-位元 總共240點的 ICON RAM(IRAM) z 33-common x 64-segment (2 行顯示) 液晶顯示 驅動器 z 自動電源啟動復置(RESET)功能 z 提供外部復置觸發接腳(XRESET) z 配合外部 Segment 驅動器可以擴充顯示區域到達 16x2個㆗文字 z 內建振盪器由外部電阻調整
ST7920
㆗文字型點矩陣 LCD 控制/驅動器
Байду номын сангаас
z 低功率省電設計 Normal mode (450uA Typ VDD=5V) Standby mode (30uA Max VDD=5V) Sleep mode (3uA Max VDD=5V) z VLCD (V0~ Vss): 最大 7V z 繪圖及文字畫面混合顯示功能 z 提供多功能指令: - 畫面清除 (Display clear) - 游標歸位 (Return home) - 顯示打開/關閉 (Display on/off) - 游標顯示/隱藏 (Cursor on/off) - 顯示字元閃爍 (Display character blink) - 游標移位 (Cursor shift) - 顯示移位 (Display shift) - 垂直畫面旋轉 (Vertical line scroll) - 反白顯示 (By_line reverse display) - 睡眠模式 (Sleep mode) z 內建 Booster 升壓電路功能(2 倍壓) z 1/33 Duty

12864上打点及造字原理(st7920)

12864上打点及造字原理(st7920)

[转载].教你在12864上打点(基于ST7920控制器)基于ST7920控制的12864液晶用于字符显示很方便的,但它绘图时先要关闭显示,绘完后又要打开,速度会较慢,不如不带字库的,但也可用。

首先,绘图的基础其实就是画点。

ST7920提供了用于绘图的GDRAM(graph display RAM)。

共64×32 个字节的空间(由扩充指令设定绘图 RAM 地址),最多可以控制256×64点阵的二维绘图缓冲空间。

在它的Datasheet给出了GDRAM的坐标地址对照表:用坐标表示,就是这样:它的横坐标每一个地址都是16 位的。

共16个地址,256位。

很明显,它能控制256*64像素的液晶屏,而我们的只是128*64像素液晶屏,显然只用到它的一部分。

我刚开始以为它对应屏幕的绘图RAM是这样分布的(如红色部分):结果栽了大根头,后来终于弄明白,原来它对应屏幕的GDRAM是这样分布的:只要我们清楚了它的GDRAM和屏幕上像素点的映射(对应)关系,点亮对应的像素点就容易多了。

要点亮某一个像素点,就是将这个像素点在GDRAM中对应的位置1打点步骤---------给你x,y的坐标,要你点亮一个点,首先,我们要确定这个点是在上半屏还是下半屏,然后确定它是在那一行(纵坐标Y),再确定它是在哪一个字节的哪一个位(也就是确定它在那一列,即横坐标X),最后,将该位置1下面我们边写代码边讨论。

因为这里仅仅是讨论如何在12864上打点的,而不是给12864写一个驱动,所以对于基本的数据读写函数,我们不做讨论,这里假设已经有了如下基本函数:view sourceprint1void lcd_write_cmd(unsigned char);73 F0F 3F屏原因:带中文字库的LCD,使用图形模式时,应对所有GDRAM写0x00才算清屏,清屏命令是对使用自带字库显示时用的,对于画图不适用。

清屏程序:void LCD12864_DisplayCLR(){uchar i, j, k ;LCD12864_IfBusy();操作步骤:1>设置为扩充指令集;2>设置SR=O(设定CGRAM地址的前提),允许设定CGRAM地址;3>设置为基本指令集;4>循环执行以下操作写入16个字节数据(设定CGRAM的存储地址;写入自定义数据);5>设置DDRAM地址6>写入显示CGRAM显示码也就是说只有后六位是CGRAM的地址范围是00 0000(0x00)-11 1111(0x3F),整个字节也就是0x40-0x7F,这就是CGRAM地址的范围,在进行设置CGRAM字库的过程中,进行的有如下三句操作,也就是在设置CGRAM地址时是在SR=0有效时进行的,SR=0,也就表明是对CGRAM地址的设置,依此来区分是设置的DDRAM地址或CGRAM地址;LcdWcom(0x34); //再次设置为8位并行口,扩展指令集LcdWcom(0x02); //SR=0,允许设置CGRAM地址LcdWcom(0x30); //恢复设置为8位并行口,基本指令集你写入的数据编码分为三种:一种是一个字节的HCGROM,也就是字符;一种是两字节的CGROM,也就是内部的中文汉字字库;最后一种就是两字节的CGRAM,也就是你自己造的字库;具体的编码是这样的:如果你第一个字节写入DDRAM的内容在0x02-0x7F之间,那么就会认为你要写入的是HCGROM编码;如果你第一个字节写入DDRAM的内容不在0x02-0x7F之间,在0xA1之上的,那就认为是CGROM编码,接收第二个字节,然后组合在一块显示出汉字;如果你第一个字节写入DDRAM的内容不属于以上的范围那自然就是CGRAM编码了,接收第二个字节,然后组合在一块显示出自造的16*16的字符;另外还对CGRAM的编码有详细的规定,只能是0x0000,0x0002,0x0004,0x0006四种编码,对应的是CGRAM中你写入的0x40-0x7F范围的数据,0x40-0x7f正好是4个16*16(每个地址两个字节数据2*8)的数据。

ST7920 LCD12864液晶显示屏中文说明书例程 单片机控制LCD12864液晶显示屏方法

ST7920 LCD12864液晶显示屏中文说明书例程 单片机控制LCD12864液晶显示屏方法
LCD 模块使用手册
EDM12864-66 图形点阵式液晶显示器模块
原理与应用手册
大连东福彩色液晶显示器有限公司
大连东福彩色液晶显示器有限公司
LCD 模块使用手册
目录
1. 使用范围----------------------------------------------------3 2. 质量保证----------------------------------------------------3 3. 性能特点----------------------------------------------------3 4. 外形图-------------------------------------------------------7 5. I/O 接口特性-----------------------------------------------7 6. 质量等级---------------------------------------------------15 7. 可 靠 性---------------------------------------------------18 8. 生产注意事项---------------------------------------------18 9. 使用注意事项---------------------------------------------19
Z 地址计数器可以用指令 DISPLAY START LINE 预置。因此,显示屏幕的起始行就由此 指令控制。即 DD RAM 的数据从哪一行开始显示在屏幕的第一行。此组件的 DD RAM 共 64 行,屏幕可以循环显示 64 行。
5-5-2 本模块的控制指令: 1、显示开关控制(DISPLAY ON/OFF)

12864显示文字+图像

12864显示文字+图像

引用12864液晶原理分析3他山之石2010-07-21 20:52:05 阅读7 评论0 字号:大中小小峰的12864液晶原理分析3一、ST7920控制IC的LCD12864实现反白显示从使用手册上可知,扩展指令里的0x03+行号即可实现反白对应行。

但是ST7920 控制器的128×64 点阵液晶其实原理上等同256×32 点阵,第三行对应的DDRAM 地址紧接第一行;第四行对应的DDRAM 地址紧接第二行。

所以128×64 点阵的液晶执行反白功能时实用意义不大,因为用户对第一行执行反白显示操作时,第三行必然也反白显示;第二行反白,第四行也必然反白。

其实还是有办法做到单行反白的,解决方法就是混用图形显示和字符显示。

其理论支持在于:在ST7920中,字符显示的DDRAM和图形的GDRAM是相互独立的,而最后显示到液晶上的结果,是两个RAM中数据的异或。

具体来说:假如某个点上,绘图RAM的没有绘图(数据为0),而字符RAM上有点阵(数据为1),那么异或的结果就是1,也就是说正常显示字符;当字符上RAM没有点阵的时候,异或的结果是0,自然也就不显示了。

假如该点上绘图RAM绘图了(数据为1),当字符RAM上有点阵(数据为1时),异或的结果为0,效果就是反白显示;如果字符RAM没有点阵(数据为0时),异或结果为1,效果就是显示绘图的背景。

所以,如果要在某个地方反白显示,那么就在该点绘图并且写字,如果要取消反白,就重新用全0擦掉那个地方的绘图!这样一来可以实现任何地方、任意大小的反白显示,反而比原指令中的单行反白的功能更好更强大。

二、对于整屏既有图象又有文本,则可以用两种方式实现:1、首先文本DDRAM写入要写的字符,其余全部空格(即0X00),然后再在没有字符的地方(即非点亮的晶格中,0X00)绘入图象。

DDRAM与GDRAM异或后就可以整屏实现图象与文本。

参见程序实例1。

st7920 并行方式驱动12864液晶驱动

st7920 并行方式驱动12864液晶驱动
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0C,0x43,0x01,0x80,0x00,0x7F,0xFF,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x19,0xFF,0x07,0x00,0x07,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,
0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30,
0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90,
0x00,0x00,0x00,0x01,0xDF,0xFF,0xC0,0x07,0xFF,0xFF,0xFF,0x80,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0xFF,0xFF,0x00,0x0F,0xFF,0xFF,0xFF,0xE0,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

12864显示图形中上半屏和下半屏

12864显示图形中上半屏和下半屏

最近买了一块12864液晶显示屏,淘宝给我的资料不算多,我就从网上下载了部分资料,通过研究别人的例程我发现了一些问题,并得出了自己的见解。

写程序一定要严谨,同时又要求精练,如果程序中多了些没用的语句不仅让学习的人看的一头雾水,而且又占用多余的空间,我想通过自己的实践来鄙视那些程序不严谨就挂到网上的人,给初学者很多困惑。

我就通过12864的绘图功能来说下,不对之处望求指正(附上绘图说明)12864(ST7920驱动芯片)把屏幕分成上下两部分(如上图中把垂直坐标分成了两部分的00~1F)。

水平坐标00到0F处于同一面,而不是上下屏的关系,[上半屏“07”后通过我标注的箭头连接是到下一个红色00行]。

在向GDRAM中写入要显示的图片时,我们先指定从X:00、Y:00处(也就是第①处)开始写入数据,我们先在第①处写图形数据(按照图片所标注,第15位在最左边,第0位在最右边,即在写入的时候LCD会先写高位字节,接着再写低位字节),接着LCD会自动把坐标定位到同一行第②处的开头,此时我们可以接着告诉LCD在这里写入图形数据,依此类推,当我们写满16次后,第00行(包括上半屏和下半屏的)就全写满了。

那么我们接下去写入数据会出现什么情况呢?接着LCD又自动从第00行的第①处重新开始写了。

这是因为ST7920控制芯片设计出来就这样,在写入的时候它只会在水平方向(X轴上)地址自增,并且在增加到0F地址之后就会变成00地址从头开始写。

从这里我们可以明白,每次写满一行(共16部分)后就必须在程序里人为地把垂直方向(Y轴)的地址加1,不然就会造成只是在同一行重复写入的现象。

垂直(列)地址由AC6~AC0指定,共32行,列地址由AC3AC2AC1AC0指定,共16列(00-0F),绘图程序如下:通过以上所讲我想大家也明白了很多了吧,我看网上有很多教程说是要把屏幕分开两半来写程序,其实我觉得下半屏程序根本没必要再写出来,因为见上面的分析过程,其实“上半部分屏”程序已经完全把整个屏幕覆盖了,而下半部分屏相当于在原来的基础上又重新覆盖了一部分。

12864液晶中文资料,控制芯片为ST7920

12864液晶中文资料,控制芯片为ST7920

12864液晶中文资料,控制芯片为ST7920概述二、带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII 字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

三、基本特性:(1)、低电源电压(VDD:+3.0--+5.5V)(2)、显示分辨率:128×64点(3)、内置汉字字库,提供8192个16×16点阵汉字(简繁体可选(4)、内置128个16×8点阵字符(5)、2MHZ时钟频率(6)、显示方式:STN、半透、正显(7)、驱动方式:1/32DUTY,1/5BIAS(8)、视角方向:6点(9)、背光方式:侧部高亮白色LED,功耗仅为普通LED 的1/5—1/10(10)、通讯方式:串行、并口可选(11)、内置DC-DC 转换电路,无需外加负压(12)、无需片选信号,简化软件设计(13)、工作温度:0℃-+55℃,存储温度:-20℃-+60℃模块接口说明:*注释1:如在实际应用中仅使用串口通讯模式,可将PSB 接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。

2.2并行接口管脚号管脚名称电平管脚功能描述1VSS 0V 电源地2VCC 3.0+5V电源正3V0-对比度(亮度)调整4RS(CS)H/LRS=“H”,表示DB7——DB0为显示数据RS=“L”,表示DB7——DB0为显示指令数据5R/W(SIDH/LR/W=“H”,E=“H”,数据被读到DB7——DB0R/W=“L”,E=“H→L”,DB7——DB0的数据被写到IR 或DR6E(SCLKH/L使能信号7DB0H/L三态数据线8DB1H/L三态数据线9DB2H/L三态数据线10DB3H/L三态数据线11DB4H/L三态数据线12DB5H/L三态数据线13DB6H/L三态数据线14DB7H/L三态数据线15PSB H/LH:8位或4位并口方式,L:串口方式(见注释1)16NC -空脚17/RESETH/L复位端,低电平有效(见注释2)18VOUT -LCD 驱动电压输出端19A VDD 背光源正端(+5V)(见注释3)20K VSS 背光源负端(见注释3)*注释1:如在实际应用中仅使用并口通讯模式,可将PSB 接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。

st7920控制的12864液晶画线,画圆,作图

st7920控制的12864液晶画线,画圆,作图

st7920控制的12864液晶画线,画圆,作图2009-10-30 17:031、打点部分该部分已在该论坛发帖,这里不就重复了(打点是所有绘图的基础)2、画线部分先看程序/********************************************************* 名称:GUI_Line()采用布兰森汉姆(Bresenham)算法画线* 功能:任意两点间的直线。

根据硬件特点,实现加速。

* 入口参数:x0 直线起点所在行的位置* y0 直线起点所在列的位置* x1 直线终点所在行的位置‘ y1 直线终点所在列的位置* 出口参数:无* 说明:操作失败原因是指定地址超出缓冲区范围。

*********************************************************/void GUI_Line8(uchar x0,uchar y0,uchar x1,uchar y1){int temp;int dx,dy; //定义起点到终点的横、纵坐标增加值int s1,s2,status,i;int Dx,Dy,sub;dx=x1-x0;if(dx>=0) //X的方向是增加的s1=1;else //X的方向是降低的s1=-1;dy=y1-y0; //判断Y的方向是增加还是降到的if(dy>=0)s2=1;elses2=-1;Dx=fabs(x1-x0); //计算横、纵标志增加值的绝对值Dy=fabs(y1-y0);if(Dy>Dx) //{ //以45度角为分界线,靠进Y轴是status=1,靠近X 轴是status=0temp=Dx;Dx=Dy;Dy=temp;status=1;}elsestatus=0;/********判断垂直线和水平线********/if(dx==0) //横向上没有增量,画一条水平线GUI_XLine(x0,y0,y1,1);if(dy==0) //纵向上没有增量,画一条垂直线GUI_YLine(x0,y0,x1,1);/*********Bresenham算法画任意两点间的直线********/sub=2*Dy-Dx; //第1次判断下个点的位置for(i=0;i<Dx;i++){GUI_Point(x0,y0,1); //画点if(sub>=0){if(status==1) //在靠近Y轴区,x值加1x0+=s1;else //在靠近X轴区,y值加1 y0+=s2;sub-=2*Dx; //判断下下个点的位置}if(status==1)y0+=s2;elsex0+=s1;sub+=2*Dy;}}下面是图片:在(0,0)到(127,32)之间画线在(0,0)到(63,63)之间画线大家可以看到,直线越长其线性越差,主要是算法的问题3、画圆部分主要思路是用Bresenham算法先画1/8个圆,在利用对称行画出其余的部分程序如下:/*****************************************名称:Draw_circle (在任意位置画圆)说明:使用Bresenham法画1/8个圆,在用对称性画出其他的7/8个圆按下图把圆分为8份7 16 25 34*****************************************/void Draw_circle(uchar x0,uchar y0,uchar r){int a,b;int di;a=0;b=r;di=3-2*r; //判断下个点位置的标志while(a<=b){GUI_Point(x0-b,y0-a,1); //3GUI_Point(x0+b,y0-a,1); //0GUI_Point(x0-a,y0+b,1); //1GUI_Point(x0-b,y0-a,1); //7GUI_Point(x0-a,y0-b,1); //2GUI_Point(x0+b,y0+a,1); //4GUI_Point(x0+a,y0-b,1); //5GUI_Point(x0+a,y0+b,1); //6GUI_Point(x0-b,y0+a,1);a++;/***使用Bresenham算法画圆**/if(di<0)di +=4*a+6;else{di +=10+4*(a-b);b--;}GUI_Point(x0+a,y0+b,1);}}这是在以(63,32)为圆心,32为半径画的圆(小问题是当圆大后,会有部分画不出来,有待完善)4、整屏画图部分这个比较简单,就直接上程序了void LCD_fulldisplay_picture_2(const uchar *pic) //全屏显示图片方法2 {unsigned int x=0;unsigned char i,j;Write_command(0x34); //扩展指令动作Write_command(0x36); //扩展指令动作for(i=0;i<32;i++) //上半屏显示{Write_command(0x80|i); //列位置Write_command(0x80); //行位置for(j=0;j<16;j++) //256/8=32 byte{ //列位置每行自动增加Write_data(*pic);pic++;}}for(i=0;i<32;i++) //下半屏显示{Write_command(0x80|i); //列位置Write_command(0x88); //行位置for(j=0;j<16;j++) //256/8=32 byte{Write_data(*pic);pic++;}}Write_command(0x30);}5、图片和文字在一起显示我用的是带字库的,所以显示汉字较简单,即先作图,之后关闭绘图模式,打开普通模式就可以显示汉字了,先上个图片这个程序很简单,就是先画5个圆,再在下面写汉字,就不用上传了。

12864液晶中文资料,控制芯片为ST7920

12864液晶中文资料,控制芯片为ST7920

12864液晶中文资料,控制芯片为ST7920概述二、带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII 字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

三、基本特性:(1)、低电源电压(VDD:+3.0--+5.5V)(2)、显示分辨率:128×64点(3)、内置汉字字库,提供8192个16×16点阵汉字(简繁体可选(4)、内置128个16×8点阵字符(5)、2MHZ时钟频率(6)、显示方式:STN、半透、正显(7)、驱动方式:1/32DUTY,1/5BIAS(8)、视角方向:6点(9)、背光方式:侧部高亮白色LED,功耗仅为普通LED 的1/5—1/10(10)、通讯方式:串行、并口可选(11)、内置DC-DC 转换电路,无需外加负压(12)、无需片选信号,简化软件设计(13)、工作温度:0℃-+55℃,存储温度:-20℃-+60℃模块接口说明:*注释1:如在实际应用中仅使用串口通讯模式,可将PSB 接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。

2.2并行接口管脚号管脚名称电平管脚功能描述1VSS 0V 电源地2VCC 3.0+5V电源正3V0-对比度(亮度)调整4RS(CS)H/LRS=“H”,表示DB7——表示DB7——DB0为显示数据RS=“L”,数据被读到DB7——DB0 DB0为显示指令数据5R/W(SIDH/LR/W=“H”,E=“H”,DB0的数据被写R/W=“L”,E=“H→L”,DB7——到IR 或DR6E(SCLKH/L使能信号7DB0H/L三态数据线8DB1H/L三态数据线9DB2H/L三态数据线10DB3H/L三态数据线11DB4H/L三态数据线12DB5H/L三态数据线13DB6H/L三态数据线14DB7H/L三态数据线15PSB H/LH:8位或4位并口方式,L:串口方式(见注释1)16NC -空脚17/RESETH/L复位端,低电平有效(见注释2)18VOUT -LCD 驱动电压输出端19A VDD 背光源正端(+5V)(见注释3)20K VSS 背光源负端(见注释3)*注释1:如在实际应用中仅使用并口通讯模式,可将PSB 接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。

玩转12864液晶屏(ST7920)

玩转12864液晶屏(ST7920)
在我们常用的人机交互显示界面中,除了数码管, LED,以及我们之前已经提到的 LCD1602 之外,还有一种液晶屏用的比较多。相信接触过单片机的朋友都知道了,那就是 12864 液晶。顾名思义,12864 表示其横向可以显示 128 个点,纵向可以显示 64 个点。我们 常用的 12864 液晶模块中有带字库的, 也有不带字库的, 其控制芯片也有很多种, 如 KS0108 T6963,ST7920 等等。在这里我们以 ST7920 为主控芯片的 12864 液晶屏来学习如何去驱动 它。(液晶屏采用金鹏的 OCMJ4X8C)
SET_READ SET_INC } void v_Lcd12864SendData_f( unsigned char byData ) //发送数据 { v_Lcd12864CheckBusy_f() ; SET_DATA SET_WRITE CLR_EN io_LCD12864_DATAPORT = byData ; _nop_(); _nop_(); SET_EN _nop_(); _nop_(); CLR_EN SET_READ SET_INC } void v_DelayMs_f( unsigned int nDelay ) { unsigned int i ; for( ; nDelay > 0 ; nDelay-- ) { for( i = 125 ; i > 0 ; i-- ) ; } } void v_Lcd12864Init_f( void ) { v_Lcd12864SendCmd_f( 0x30 ) ; v_DelayMs_f( 50 ) ; v_Lcd12864SendCmd_f( 0x01 ) ; v_DelayMs_f( 50 ) ; v_Lcd12864SendCmd_f( 0x06 ) ; v_DelayMs_f( 50 ) ; v_Lcd12864SendCmd_f( 0x0c ) ; } void v_Lcd12864SetAddress_f( unsigned char x, y ) { unsigned char byAddress ; switch( y ) { //延时

C12864ZB使用说明书

C12864ZB使用说明书
字型产生 RAM(CGRAM)
ST7920 的字型产生 RAM 提供用户自定义字符生成(造字)功能,可提供 4 组 16×16 点阵的空 间,用户可以将 CGROM 中没有的字符定义到 CGRAM 中。
显示 RAM(DDRAM)
显示 RAM 提供 64×2 字节的空间,最多可以控制 4 行 16 字的中文字型显示。当写入显示资料 RAM 时,可以分别显示 CGROM,HCGROM 及 CGRAM 的字型。
2
ST7920 控制器液晶模块使用说明书
DDRAM 内容,CGRAM 地址以及 CGRAM 内容的对照关系
版本号 20070511
CGRAM 与中文字型的编码只能出现在 adress counter 的起始位置(见下表)
80 81 82 83 84 85 86 87 88 89 8A 8B 8C 2
2.软件特性如下: z 文字与图形混合显示功能 z 画面清除功能 z 光标归位功能 z 显示开/关功能 z 光标显示/隐藏功能 z 显示字体闪烁功能 z 光标移位功能功能 z 显示移位功能 z 垂直画面旋转功能 z 反白显示功能 z 休眠模式
3. 外形尺寸图:
2
ST7920 控制器液晶模块使用说明书
设定 IRAM 地址或
0
0
0 1 A5 A4 A3 A2 A1 A0 72us
卷动地址
0 0 0 A3 A2 A1 A0
设定绘图 RAM 地址 0
0
1
72us
A6 A5 A4 A3 A2 A1 A0
备注:当 ST7920 在接受指令前,MCU 必须先确认 ST7920 处于非忙状态。即读取 BF=0,才能接受新的指令;如 果在送出一条指令前不检查 BF 状态,则需要延时一段时间,以确保上一条指令执行完毕,具体指令执行时间参 照指令表。

LCD12864_ST7920串行测试程序

LCD12864_ST7920串行测试程序
};
/*****n(ms)延时子程序*****/
void delayms(uint t) //约延时n(ms)
{
uint i;
while(t--)
{
for(i=0;i<125;i++);
}
}
/*****串行发送一个字节*****/
void SendByte(uchar Dbyte)
}
return ((0xf0&temp1)+(0x0f&temp2));
}
/*****检测LCD忙状态*****/
void CheckBusy( void )
{
do SendByte(0xfc); //11111,RW(1),RS(0),0
#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH
#define SET_DD_AC 0x80
/*****汉字地址表*****/
uchar code addr_tab[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
SendByte(0xf0&Cbyte); //高四位
SendByte(0xf0&Cbyte<<4); //低四位(先执行<<)
CS = 0;
}
/*****写数据*****/
void Lcd_WriteData(uchar Dbyte )
void LcdFill_Level()
{
uchar x,y,i;
uchar k;

LCD12864(ST7920)串行驱动程序

LCD12864(ST7920)串行驱动程序
读写函数
0xf8为写命令的命令字;0xfa为写数据的命令字,这里用的是TI_F28027
在编写和调试过程中借鉴了一些网上的程序,在此表示感谢,
这里是已经调好的,在移植过程中,调试时注意先要通过示波器对函数
void send_data(Uint16 D_Ctrl,Uint16 D_data)
void send_data(Uint16 D_Ctrl,Uint16 D_data)
//LCD_CLK一个脉冲写一位
{
Uint16 i,j;
Uint16 temp;
//LCD_CS=1; //片选使能
GpioDataRegs.GPADAT.bit.GPIO16=1;
send_data (0xf8,y+j*2);
send_data (0xf8,x+i);
send_data (0xf8,0x30);
send_data (0xfa,data1);
send_data (0xfa,data1);
for(i=0;i<3;i++) // 串行数据的传送
{
if(i==0) //写第一个字节 格式1111 1ABC
{
temp=D_Ctrl;
}
if(i==1) //写第二个字节 第一次写 高四位放在第一次传送的高四位
{
temp=(D_data&0xf0);
功能:
实现在任意坐标写一个字
X列;Y行
===========================================================================*/

Protues仿真12864液晶显示

Protues仿真12864液晶显示

Protues仿真液晶显示目录1 LCD12864简介 (2)2 LCD12864显示原理 (6)2.1汉字和英文显示原理 (6)2.2图形显示 (7)2.3应用说明 (8)2.4指令描述 (9)3软件仿真 (12)3.1汉字显示 (12)3.2图形显示 (18)3.3同时显示多个汉字 (23)3.4向上滚动显示 (30)4小结 (40)1LCD12864简介(1)ST7920类这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液晶还支持画图方式。

该类液晶支持68时序8位和4位并口以及串口。

(2)KS0108类这种控制器指令简单,不带字库。

支持68时序8位并口。

(3)T6963C类这种控制器功能强大,带西文字库。

有文本和图形两种显示方式。

有文本和图形两个图层,并且支持两个图层的叠加显示。

支持80时序8位并口。

(4)COG类常见的控制器有S6B0724和ST7565,这两个控制器指令兼容。

支持68时序8位并口,80时序8位并口和串口。

COG类液晶的特点是结构轻便,成本低。

ST7920 GND VCC V0 RS R/W E DB0-DB7 PSB RES VOUT BLA BLK KS0108 GND VCC V0 RS R/W E DB0-DB7 CS1 CS2 RES VOUT BLA BLKT6963C FG GND VCC V0 WR RD DB0-DB7 RS CS RES FS BLA BLKS6B0724 GND VCC RS WR RD CS DB0-DB7 RES BLA BLK模块控制芯片提供两套控制命令,基本指令和扩充指令如下:指令表1:(RE=0:基本指令)指令表2:(RE=1:扩充指令)备注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF 标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。

12864带字库(ST7920控制器)液晶学习+25页+1.4M

12864带字库(ST7920控制器)液晶学习+25页+1.4M

由于此液晶为 128*64,即是横向 128 个点,竖向 64 个点,由于该液晶控制器支持的字符 为 8*16,汉字为 16*16,因此只能显示四行,如果是汉字,为每行显示 8 个,如果是字符, 每行显示 16 个。 由上图设置 DDRAM 地址的指令可知,最高位为 1,余下 7 位为地址值,因此就对应了 为什么起始地址为 80H 的原因(即对应的写地址指令为 1000 0000) ; 因此如果你要设定显示的地址为第一行的第一个位置,只需要调用写指令函数,写入 0x80 即可。 存在的问题:参考网上的程序及在试验过程中发现,实际能显示出来的地址分布式这样的 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 //第四行汉字位置 百思不得其解,尤其让人受不了的是居然是第一行和第三行地址接续,而不是第二行,有明 白的高手给讲解一下… //******************************************************** //设置光标函数 //参数说明:x 为行号,y 为列号 //******************************************************** void Set_Cursor(unsigned char x, unsigned char y) { unsigned char i; switch(x)//确定行号 { case 0x00: i=0x80; break;//第一行 case 0x01: i=0x90; break;//第二行 case 0x02: i=0x88; break;//第三行 case 0x03: i=0x98; break;//第四行 default : break; } i = y+i;//确定列号

12864中文字库说明书ST7920

12864中文字库说明书ST7920

12864C-1液晶中文显示模块(一)概述 (3)(一)(二)外形尺寸1 方框图 (3)2 外型尺寸图 (4)(二)(三)模块的接口 (4)(三)(四)硬件说明 (5)(五) 指令说明 (7)(四)(五)读写操作时序 (8)(五)(六)交流参数 (11)(六)(七)软件初始化过程 (12)(七)(八)应用举例 (13)(八)(九)附录1半宽字符表 (20)2 汉字字符表 (21)一、概述12864C-1是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

基本特性:●●低电源电压(VDD:+3.0--+5.5V)●●显示分辨率:128×64点●●内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)●●内置 128个16×8点阵字符●●2MHZ时钟频率●●显示方式:STN、半透、正显●●驱动方式:1/32DUTY,1/5BIAS●●视角方向:6点●●背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10●●通讯方式:串行、并口可选●●内置DC-DC转换电路,无需外加负压●●无需片选信号,简化软件设计●●工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃二、方框图3、外形尺寸图三、模块接口说明*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。

基于128_64点阵液晶显示的智能温度控制器的设计与实现

基于128_64点阵液晶显示的智能温度控制器的设计与实现

ISSN1672-4305CN12-1352/N实 验 室 科 学LABORATORY SC I ENCE 第13卷 第3期 2010年6月Vol 113 No 13 J un 12010实验技术基于128@64点阵液晶显示的智能温度控制器的设计与实现李志广1,张 辉1,王永学1,张志东2(1.河北工业大学理学院,天津 300130;2.深圳市拓普微科技开发有限公司,广东深圳518057)摘 要:以智能温度控制器的设计实验为依托,文章给出了一套液晶显示模块驱动实验的设计方案,详细介绍了L M 3033液晶显示模块的功能特性、接口电路及应用程序。

实验中应用DS18B20温度传感器实现温度信号的采集,并把采集到的信号传送给单片机,单片机将信号进行处理完成相应的智能控制,同时将环境温度、系统状态等信息显示在L M 3033液晶显示模块上。

关键词:液晶显示;温度控制;LM 3033中图分类号:TN 141 文献标识码:B do :i 10.3969/.j issn .1672-4305.2010.03.018Desi gn a nd m i ple m entati on of the i ntelli gent te mperaturecontroll er based on 128@64dotmatri x li qu i d crystal displayLI Zh i-guang 1,Z HANG H ui 1,WANG Y ong-xue 1,Z HANG Zhi-dong2(1.Schoo l of Sciences ,H ebeiU niversity of Techno l o gy ,T ian ji n 300130,Ch i n a ;2.Shenzhen Top -w ay Technology Co .,Ltd .,Shenzhen 518057,China)A bstract :B ased on t h e i n te lli g ent te m perat u re contr o ller desi g n exper i m en,t a desi g n sche m e of the liqu i d crystal d isp lay m odu le (LC M )driv i n g experi m ent is g i v en in th is paper .The functi o na l pr oper -ties ,the interface circ u i,t and the app lication pr ogra m of the L M 3033LC M are i n troduced in detai.l I n th is experi m en,t t h e te m perature si g nal is co llected through the DS18B20dig ita l te m perature sensor ,and then trans m itted to theMCU.The te m perat u re signal processing and the intelligent control are per -for m ed by M C U.A t the sa m e ti m e ,i n for m ations ,such as a m bient te m perature and syste m status are d isp l a yed on the L M 3033LC M.K ey words :li q u i d crystal d isp lay ;te m perat u re con tro;l L M 3033基金项目:国家自然科学基金(项目编号:10704022);河北工业大学教学改革项目。

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

#include <reg51.h>#include <intrins.h>#include <math.h>#define uint unsigned int#define uchar unsigned charsbit rs=P2^4;sbit rw=P2^5;sbit e=P2^6;sbit RES= P2^3;sbit PSB= P2^1;sbit DQ=P3^2; //18B20信号脚bit ReadTempFlag;uint temp;float ftemp;uchar code table[]="0123456789.";unsigned char code user16x16[]={ //℃字模0x00,0x00,0x00,0x00,0x00,0x00,0x63,0xC0,0x66,0x60,0x0C,0x20,0x0C,0x00,0x0C,0x00, 0x0C,0x00,0x0C,0x20,0x06,0x60,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};void writecom(uchar com);void writedat(uchar dat);void initinal(void);void Init_Timer0(void);/*------------------------------------------------uS延时函数------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}//12MHZ晶振延时50微秒void delay50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}bit Init_DS18B20(void){bit dat=0;DQ = 1; //DQ复位DelayUs2x(5); //稍做延时DQ = 0; //单片机将DQ拉低DelayUs2x(200); //精确延时大于480us 小于960us DelayUs2x(200);DQ = 1; //拉高总线DelayUs2x(50); //15~60us 后接收60-240us的存在脉冲dat=DQ; //如果x=0则初始化成功, x=1则初始化失败DelayUs2x(25); //稍作延时返回return dat;}/*------------------------------------------------读取一个字节------------------------------------------------*/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;DelayUs2x(25);return(dat);}/*------------------------------------------------写入一个字节------------------------------------------------*/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;DelayUs2x(25);DQ = 1;dat>>=1;}DelayUs2x(25);}/*------------------------------------------------读取温度------------------------------------------------*/unsigned int ReadTemperature(void){unsigned char a=0;unsigned int b=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换DelayMs(10);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar(); //低位b=ReadOneChar(); //高位temp=b;temp<<=8;temp=temp|a;ftemp=temp*0.0625;temp=ftemp*10+0.5;ftemp=ftemp+0.05;return temp;/*------------------检查忙位-----------------------------*/void chkbusy(){rs=0;rw=1;e=1;P0=0xff ;while((P0&0x80)==0x80);e=0;}//写命令void writecom(uchar com){chkbusy();rw=0;rs=0;delay50us(1);P0=com;e=1;delay50us(10);e=0;}//写数据void writedat(uchar dat){chkbusy();rw=0;rs=1;delay50us(1);P0=dat;e=1;delay50us(10);e=0;}//初始化void initinal(void){DelayMs(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式DelayMs(1); //延时RES=0; //复位DelayMs(1); //延时RES=1; //复位置高DelayMs(10);//Write_Cmd(0x30); //选择基本指令集//DelayUs2x(50); //延时大于100uswritecom(0x30); //选择8bit数据流DelayUs2x(20); //延时大于37uswritecom(0x0c); //开显示(无游标、不反白)DelayUs2x(50); //延时大于100uswritecom(0x01); //清除显示,并且设定地址指针为00HDelayMs(15); //延时大于10mswritecom(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(50); //延时大于100us}/*************读数据************/uchar read(){uchar shuju;chkbusy();P0=0xff;rs=1;rw=1;e=1;shuju=P0;DelayUs2x(5);e=0;DelayUs2x(5);return(shuju);}/*------------------------------------------------用户自定义字符------------------------------------------------*/void CGRAM(){int i;writecom(0x30);writecom(0x40);for(i=0;i<16;i++){writedat(user16x16[i*2]);writedat(user16x16[i*2+1]);}}/*------------------------------------------------显示用户自定义字符------------------------------------------------*/void DisplayCGRAM(unsigned char x,unsigned char y) {switch(y){case 1: writecom(0x80+x);break;case 2: writecom(0x90+x);break;case 3: writecom(0x88+x);break;case 4: writecom(0x98+x);break;default:break;}writedat(0x00);writedat(0x00);}//增加画点子程序void DrawPoint(uchar X,uchar Y,uchar Color){uchar Row,Tier,Tier_bit ;uchar ReadOldH,ReadOldL ;X&=0x7f;//防止x坐标超过127Y&=0x3f;//防止y坐标超过63writecom(0x34);writecom(0x36);Tier=X>>4 ;Tier_bit=X&0x0f ;if(Y<32){Row=Y ;}else{Row=Y-32 ;Tier+=8 ;}writecom(Row+0x80);writecom(Tier+0x80);read();ReadOldH=read();ReadOldL=read();writecom(Row+0x80);writecom(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 ;}writedat(ReadOldH);writedat(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 ;}writedat(ReadOldH);writedat(ReadOldL);}writecom(0x30);}void clrscreen(){writecom(0x01);delay50us(10);}//------------------清整个GDRAM空间---------------------------- void clrgdram(){uchar i,j;for(j=0;j<32;j++){writecom(0x34);writecom(0x80+j);writecom(0x80);writecom(0x30); //基本指令集,绘图关for(i=0;i<32;i++)writedat(0x00); // 写入0x00}writecom(0x36);writecom(0x30);}/*------------------------------------------------------------主函数------------------------------------------------------------*/void main(){uchar i,j,e,colour=1;i=16;rw=0;Init_Timer0();initinal();clrgdram();delay50us(2);clrscreen();writecom(0x34); //绘图显示关CGRAM();while(1){uint a,b,c,d;DrawPoint(17,6 ,colour);DrawPoint(17,22,colour);DrawPoint(17,38,colour); DrawPoint(17,54,colour); for(j=16;j<=127;j++){DrawPoint(16,j-16,colour); DrawPoint(j,63,colour);//DrawPoint(i,e,colour); writecom(0x80);writedat(table[6]); writedat(table[7]); writecom(0x90);writedat(table[5]); writedat(table[1]); writecom(0x88);writedat(table[3]); writedat(table[5]); writecom(0x98);writedat(table[1]); writedat(table[9]); DisplayCGRAM(5,1);}if(ReadTempFlag==1){ReadTempFlag=0;a=ReadTemperature();e=73-a/10;DrawPoint(i,e,colour);delay50us(10);b=a/100;c=a%100/10;d=a%100%10;writecom(0x83);writedat(table[b]);delay50us(1);writedat(table[c]);delay50us(1);writedat(table[10]);delay50us(1);writedat(table[d]);delay50us(4);writecom(0x83);i++;if(i>=128){i=16;clrgdram();}}}}//18B20作为温度传感器,同时显示温度曲线和当前温度。

相关文档
最新文档