ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:76.25KB ,
资源ID:6120067      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6120067.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(整理液晶点阵显示屏程序设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

整理液晶点阵显示屏程序设计.docx

1、整理液晶点阵显示屏程序设计液晶点阵显示屏程序设计单片机课程设计报告一、设计题目:液晶点阵显示屏程序设计二、设计要求:1 能进行正常的模拟量采样值显示(温度、压力、电位),并将其显示到液晶面板上。2 LCD将从下到上滚动显示:“江苏大学计算机学院”,然后显示:“2006年单片机课程设计” “液晶点阵显示屏程序设计”“作者姓名、班级、学号”3 改变字库的内容,显示其它汉字。4 改变页地址或列地址,使显示的内容改变位置5 改变滚动显示模式,使显示内容左右、上下滚动;改变参数使滚动速度变化。三、设计思路及实施步骤:(一)设计思路:由于实验指导书中做过液晶显示和模数转换得实验,根据两个实验的功能实现和流

2、程原理进行设计将程序分成三个模块:主函数模块main.c模数转换模块ADC.c液晶显示模块KS0108.c其中让主函数模块做一些初始化和函数调用工作,模数转换模块主要是将温度,压力,点位的值转化为数字量供液晶显示用,液晶显示模块得到模数转换模块传递过来的数字量显示到液晶面板上。(二)系统流程图:1系统主流程图如下:2主函数流程图:3 显示模块流程图4 模数转换模块流程图(三)系统部程序及功能说明(程序注释部分)#include c8051F020.h#include 液晶点阵显示试验 -128*64,控制器KS0108 试验准备:将拨码开关S1和S2置于ON位置. 运行此程序,LCD将从下到上

3、滚动显示:“江苏大学计算机学院” 然后交替显示:“2010年单片机课程设计” “液晶点阵显示屏程序设计”“作者姓名、班级、学号” */#define LCD_DATA P2#define LCD_RS P30#define LCD_RW P31#define LCD_E P32#define LCD_CS1 P33#define LCD_CS2 P34#define LCD_RST P35#define MUX_TEMP 0x08#define MUX_VOLT 0x01#define MUX_PRESS 0x02#define NOSELECT7279 P5 |= 0x80 /SPICS4(

4、P57)=1#define SELECT7279 P5 &= (0x80) /SPICS4(P57)=0;#define Set7279DAT HD7279_DAT=1#define Clr7279DAT HD7279_DAT=0#define Set7279CLK HD7279_CLK=1#define Clr7279CLK HD7279_CLK=0void Delay1ms(unsigned char);/*- 宽度x高度=128x64 -*/char code screen=江苏大学计算机学院;/*- 宽度x高度=128x64 -*/char code screen1=2010年单片机课

5、程设计;/*- 宽度x高度=128x64 -*/char code screen2=液晶点阵显示屏程序设计;/*- 宽度x高度=128x64 -*/;char code screen3=作者姓名、班级、学号;#define SELECTCS 0/LCDvoid LCD_WaitReady1(void) /判断LCD控制芯片KS0108是否忙 LCD_DATA=0xff; _nop_(); LCD_CS2=SELECTCS; /片学cs2 LCD_RW=1; /读写选择 LCD_RS=0; /数据指令选择 LCD_E=1; /读写使能 while (LCD_DATA&0x80); /等待空闲 L

6、CD_CS2=!SELECTCS; void LCD_WaitReady2(void) /判断LCD控制芯片KS0108是否忙 LCD_DATA=0xff; _nop_(); LCD_CS1=SELECTCS; LCD_RW=1; LCD_RS=0; LCD_E=1; while (LCD_DATA&0x80); LCD_CS1=!SELECTCS;void LCD_WriteCommand1(char ch) /向LCD控制芯片KS0108发送控制命令 LCD_WaitReady1(); LCD_CS2=SELECTCS; LCD_RW=0; LCD_RS=0; LCD_DATA=ch; L

7、CD_E=1; LCD_E=0; LCD_CS2=!SELECTCS;void LCD_WriteCommand2(char ch) /向LCD控制芯片KS0108发送控制命令 LCD_WaitReady2(); LCD_CS1=SELECTCS; LCD_RW=0; LCD_RS=0; LCD_DATA=ch; LCD_E=1; LCD_E=0; LCD_CS1=!SELECTCS;void LCD_WriteData1(char ch) /向LCD控制芯片KS0108发送数据命令 LCD_WaitReady1(); LCD_CS2=SELECTCS; LCD_RW=0; /写 LCD_RS

8、=1; /数据、指令 LCD_DATA=ch; LCD_E=1; /读写使能 LCD_E=0; LCD_CS2=!SELECTCS;void LCD_WriteData2(char ch) /向LCD控制芯片KS0108发送数据命令 LCD_WaitReady2(); LCD_CS1=SELECTCS; LCD_RW=0; LCD_RS=1; LCD_DATA=ch; LCD_E=1; LCD_E=0; LCD_CS1=!SELECTCS;/*- 文字: 温 -*/char code Wen=;/*- 文字: 度 -*/char code Du=;/*- 文字: 压 -*/char code

9、Ya=;/*- 文字: 力 -*/char code Li=;/*- 文字: 电 -*/char code Dian=;/*- 文字: 位 -*/char code Wei=;void LCD_WriteHZ(char x,char y,char *Dot) /显示16*16点阵汉字char i; for (i=0;i32;i+) if (x+i%16)64) /左半液晶屏显示 LCD_WriteCommand1(0xB8+y+i/16); /页数选择 LCD_WriteCommand1(0x40+x+i%16); /列数选择 LCD_WriteData1(Doti); /一次写一字节 els

10、e /右半液晶屏显示 LCD_WriteCommand2(0xB8+y+i/16); LCD_WriteCommand2(0x40+x-64+i%16); LCD_WriteData2(Doti); /*- 文字: . -*/char code Dot=;/*- 文字: 0 -*/char code Zero=;/*- 文字: 1 -*/char code One=;/*- 文字: 2 -*/char code Two=;/*- 文字: 3 -*/char code Three=;/*- 文字: 4 -*/char code Four=;/*- 文字: 5 -*/char code Five=

11、;/*- 文字: 6 -*/char code Six=;/*- 文字: 7 -*/char code Seven=;/*- 文字: 8 -*/char code Eight=;/*- 文字: 9 -*/char code Nine=;void LCD_WriteSZ(char x,char y,int num) / 显示8*16点阵数字和点字符 char *Num_Dot; char i; switch (num) /根据需要选择要输出的数字 case 0: Num_Dot=Zero; break; case 1: Num_Dot=One; break; case 2: Num_Dot=Tw

12、o; break; case 3: Num_Dot=Three; break; case 4: Num_Dot=Four; break; case 5: Num_Dot=Five; break; case 6: Num_Dot=Six; break; case 7: Num_Dot=Seven; break; case 8: Num_Dot=Eight; break; case 9: Num_Dot=Nine; break; case -1: Num_Dot=Dot; break; for (i=0;i16;i+) if (x+i%8)64) LCD_WriteCommand1(0xB8+y+

13、i/8); 选择地址显示数字 LCD_WriteCommand1(0x40+x+i%8); LCD_WriteData1(Num_Doti); else LCD_WriteCommand2(0xB8+y+i/8); LCD_WriteCommand2(0x40+x-64+i%8); LCD_WriteData2(Num_Doti); void InitLCD(void) /初始化LCD char i,j; LCD_RST=0; Delay1ms(1); LCD_RST=1;/复位信号把页地址计数器内容清零 LCD_WriteCommand1(0xc0); LCD_WriteCommand2(0

14、xc0); LCD_WriteCommand1(0x3f); /开显示 LCD_WriteCommand2(0x3f); for (j=0;j8;j+) /清屏 LCD_WriteCommand1(0xB8+j); /清左半屏 LCD_WriteCommand1(0x40); for (i=0;i64;i+) LCD_WriteData1(0x00); LCD_WriteCommand2(0xB8+j); /清右半屏 LCD_WriteCommand2(0x40); for (i=0;i64;i+) LCD_WriteData2(0x00); void DispBmp(char *buf) /

15、显示一幅位图 int i,j; / if(mode=0) / for (j=0;j8;j+) /显示位图 LCD_WriteCommand1(0xB8+j); LCD_WriteCommand1(0x40); /Y地址读写后自动加1 for (i=0;i64;i+) LCD_WriteData1(buf(j*2)*64+i); /左半液晶屏显示 LCD_WriteCommand2(0xB8+j); LCD_WriteCommand2(0x40); for (i=0;i64;i+) LCD_WriteData2(buf(j*2+1)*64+i); /右半液晶屏显示 /*void DispBmpU

16、p(char *buf) /显示一幅位图,并上滚 int i; DispBmp(buf); for (i = 0; i = 0; i-) Delay1ms(50); LCD_WriteCommand1(0xc0 + i % 64);/设置起始行,实现下滚 LCD_WriteCommand2(0xc0 + i % 64); void DispBmpLeft(char *buf) /显示一幅位图,并左滚 int i,j,k; for(k = 0; k 128; k+) Delay1ms(30); for (j = 0; j 8; j+) LCD_WriteCommand1(0xB8 + j); L

17、CD_WriteCommand1(0x40); for (i = 0; i 64; i+) LCD_WriteData1(buf(j * 2) * 64 + (i + k)%128); LCD_WriteCommand2(0xB8 + j); LCD_WriteCommand2(0x40); for (i = 0; i 0; k-) Delay1ms(30); for (j = 0; j 8; j+) LCD_WriteCommand1(0xB8+j); LCD_WriteCommand1(0x40); for (i = 0; i 64; i+) LCD_WriteData1(buf(j *

18、2) * 64 + (i + k)%128); LCD_WriteCommand2(0xB8 + j); LCD_WriteCommand2(0x40); for (i = 0; i 64; i+) LCD_WriteData2(buf(j * 2) * 64 + (i + k + 64)%128); */void Delay1s(unsigned char T);unsigned int GetADCValue(char No);char GetKeyValue(void);void WaitKeyOff(void);void TestLCD(void) char i,j,buf4,flag

19、,keyvalue; /flag 为小数点输出标志 unsigned int w; InitLCD(); DispBmp(screen); /显示第一幅 for (i=0;i64;i+) Delay1ms(50); LCD_WriteCommand1(0xc0+i%64); /设置起始行地址,实现向上滚动,第i行数据放在LCD的第一行显示 LCD_WriteCommand2(0xc0+i%64); DispBmp(screen1);/显示第二幅图 for (i=0;i64;i+) Delay1ms(50); LCD_WriteCommand1(0xc0+i%64); /设置起始行,实现向上滚动

20、 LCD_WriteCommand2(0xc0+i%64); DispBmp(screen2); /显示第三幅图 for (i=0;i64;i+) Delay1ms(50); LCD_WriteCommand1(0xc0+i%64); /设置起始行,实现向上滚动 LCD_WriteCommand2(0xc0+i%64); DispBmp(screen3); /显示第四幅图 for (i=0;i64;i+) Delay1ms(50); LCD_WriteCommand1(0xc0+i%64); /设置起始行,实现向上滚动 LCD_WriteCommand2(0xc0+i%64); Delay1m

21、s(10); InitLCD(); LCD_WriteHZ(0 ,0,Wen); /显示参数的中文字 LCD_WriteHZ(16,0,Du); LCD_WriteHZ(0 ,2,Ya); LCD_WriteHZ(16,2,Li); LCD_WriteHZ(0 ,4,Dian); LCD_WriteHZ(16,4,Wei); for(i=0,flag=0;i=(i+1)%3,flag=0) w = GetADCValue(i+1); /获取温度,电压或压力 Delay1ms(250); buf0=(w%10000)/1000; /取出各位上的数值 buf1=(w%1000)/100; buf2

22、=(w%100)/10; buf3=(w%10); if (i=2) /要输出的是电压,需要输出小数点的位置需改变一下 for(j=0;j5;j+) /5个符号输出 if(j=1) LCD_WriteSZ(32+j*8,i*2,-1); /显示数字,参数为-1输出小数点; flag=1; else LCD_WriteSZ(32+j*8,i*2,bufj-flag);/利用flag来控制数据位 else /输出温度和压力数据 for(j=0;j5;j+) if(j=2) LCD_WriteSZ(32+j*8,i*2,-1); /显示数字参数为-1输出小数点; flag=1; else LCD_W

23、riteSZ(32+j*8,i*2,bufj-flag); ADC:unsigned int idata Temp, Press, Volt;unsigned char idata mux_select;sfr16 ADC0 = 0xbe; / ADC0 datavoid init_adc(void) ADC0CN = 0x81; / ADC0 enabled; normal tracking / mode; ADC0 conversions are initiated / on write to AD0BUSY; ADC0 data is / left-justified REF0CN =

24、0x07; / enable temp sensor, on-chip VREF, / and VREF output buffer mux_select = MUX_TEMP; / CPU on-chip temp sensor AMX0SL = MUX_TEMP; ADC0CF = (SYSCLK/2500000) 3; / ADC conversion clock = 2.5MHz /ADC0CF |= 0x01; / PGA gain = 2 EIE2 &= 0x02; / disable ADC0 EOC interrupt EIE1 &= 0x04; / disable ADC0

25、window compare interrupt/ On-chip temperature/ AN1. 电位器/ AN2. 应变片void read_analog_inputs(void) long temp_long; AD0INT = 0; / clear conversion complete indicator AD0BUSY = 1; / initiate conversion while (AD0INT = 0); / wait for conversion complete switch (mux_select) /通过每次的调用来获取电压,温度和压力值 case MUX_TEM

26、P: temp_long = ADC0 - 42380/2; temp_long = (temp_long * 200L) / 156; Temp=temp_long; AMX0SL = MUX_VOLT; / Select AIN1 for next read mux_select = MUX_VOLT; break; case MUX_VOLT: temp_long = ADC0; Volt = 24*temp_long/655; AMX0SL = MUX_PRESS; / Select on-chip temp sensor mux_select = MUX_PRESS; break; case MUX_PRESS: temp_long = ADC0; temp_long = 24*temp_long/655; Press = temp_long; AMX0SL = MUX_TEMP; mux_select = MUX_TEMP; break;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1