




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
J I A N G S U U N I V E R S I T Y单片机原理及应用课程设计学院名称: 计算机 专业班级: 通信0902 学生姓名: 柳健 学生学号: 3090601061 指导教师姓名: 熊 书 明 2012年 1 月点阵式液晶显示屏的显示程序设计一、设计目的1熟练掌握C51系统仿真开发系统的应用。2加强单片机的综合运用能力、提高单片机的软件编程和调试能力,为以后的学习和开发工作打下良好基础。3掌握的液晶的工作原理以及应用设计。4掌握小系统开发设计的流程以及设计思路。二、设计方案 实验要求:1)从下到上滚动显示:“江苏大学计算机学院”然后交替显示:“单片机课程设计”“液晶点阵显示屏程序设计”“作者姓名、班级、学号” 2)能进行正常的模拟量采样值显示(温度、压力、电位) 。 3) 改变字库的内容,显示其它汉字。 4) 改变页地址或列地址,使显示的内容改变位置。 5)其它功能(如左、右移,上下卷、显示图片等)。设计思路:由于实验指导书中做过液晶显示和模数转换得实验,根据两个实验的功能实现和流程原理进行设计将程序分成三个模块:主函数模块main.c模数转换模块ADC.c液晶显示模块KS0108.c其中让主函数模块做一些初始化和函数调用工作,模数转换模块主要是将温度,压力,点位的值转化为数字量供液晶显示用,液晶显示模块得到模数转换模块传递过来的数字量显示到液晶面板上。程序流程图:1系统主流程图如下开始主函数模块显示模块模数转换模块2主函数流程图开始使能比较器1开中断初始化系统时钟钟初始化定时器0初始化IO端口初始化SPI0使能片内参考电压使能DAC3 显示模块流程图开始初始化LCD滚屏显示江苏大学计算机学院读取数字量并显示调用模数转换得到值显示课程设计题目、班级、姓名健值是否1.2.34 模数转换模块流程图开始读取No和模拟量返回温度返回点位结束返回压力No=2?No=3?No=1? 主要的源程序及注释主函数:#include c8051f020.h #include void Delay1us(unsigned char us)/延时uswhile (us) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); -us;void SYSCLK_Init (void)/系统时钟初始化 int i; / delay counter OSCXCN = 0x67; / start external oscillator with / 18.432MHz crystal for (i=0; i 256; i+) ; / Wait for osc. to start up while (!(OSCXCN & 0x80) ; / Wait for crystal osc. to settle OSCICN = 0x88; / select external oscillator as SYSCLK / source and enable missing clock / detector/OSCICN = 0x07; /interal 16MHZ#define PRT0CF P0MDOUT#define PRT1CF P1MDOUT#define PRT2CF P2MDOUTvoid PORT_Init (void) /串口初始化 XBR0 = 0x07; / Enable SMBus, SPI0, and UART0 XBR1 = 0x00; XBR2 = 0x44; / Enable crossbar and weak pull-ups EMI0CF = 0x27; EMI0TC = 0x21; P74OUT = 0xFF; P0MDOUT = 0x15; P1MDOUT |= 0x3C; /P1.2-P1.5推挽输出 P1 &= 0xc3;/P1.2-P1.5=0void SPI0_Init (void) /spi0初始化 SPI0CFG = 0x07; / data sampled on 1st SCK rising edge / 8-bit data words SPI0CFG|=0xC0;/CKPOL =1; SPI0CN = 0x03; / Master mode; SPI enabled; flags / cleared SPI0CKR = SYSCLK/2/8000000-1; / SPI clock 8; / set Timer0 to overflow in 1ms TL0 = -SYSCLK/1000; TR0 = 1; / START Timer0 IE|= 0x2; void Timer0_ISR (void) interrupt 1 /1ms TH0 = (-SYSCLK/1000) 8; TL0 = -SYSCLK/1000;if (Count1ms) Count1ms-;void Delay1ms(unsigned char T) /延时1msCount1ms=T;while (Count1ms);void Delay1s(unsigned char T) /延时1swhile (T)Delay1ms(200);Delay1ms(200);Delay1ms(200);Delay1ms(200);Delay1ms(200);T-;void TestLCD(void);/测试初始画面char GetKeyValue(void);/获取键值void init_adc(void);unsigned int GetADCValue(char No);void Display (char *DispBuf,char ShowDot,char x,char y);void menulcd ();void zuoyouyi();void caiji ();void main (void) char i;unsigned int u;char Num;WDTCN = 0xde;WDTCN = 0xad; /关看门狗SYSCLK_Init (); /初始化时钟Timer0_Init();/初始化定时器PORT_Init (); /初始化IO口SPI0_Init (); /初始化SPI0 init_adc();CPT1CN|=0x80;/使能比较器1REF0CN = 0x07; /使能片内参考电压DAC0CN |= 0x80;/使能DAC0DAC0H=0;DAC0L=0; EA=1;/开中断 Num=0; menulcd ();u= GetADCValue(Num);/获取按键值for (;)i=GetKeyValue();if (i3)Num=i;Delay1ms(100);if (Num=0)menulcd ();/按0显示主菜单else if(Num=4) TestLCD();/按4显示开始画面else if(Num=5)zuoyouyi();/按5汉字,图画左右移动else if(Num=6)caiji ();/按6采集温度,电压,压力u = GetADCValue(Num);KS0108模块:#include c8051F020.h#include #include dianzhen.c/所有用到的汉字,图画点阵#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 P35sbitHD7279_DAT=P17;sbitHD7279_CLK=P16;#define NOSELECT7279 P5 |= 0x80/SPICS4(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=0/7279模块void Delay1ms(unsigned char T);void Delay1s(unsigned char T);void Delay1us(unsigned char T);void Send7279Byte(unsigned char ch)/发送char i;SELECT7279; /置CS低电平 Delay1us(50);/延时50for (i=0;i8;i+)if (ch&0x80)/输出7位到HD7279A的DATA端 Set7279DAT;elseClr7279DAT;Set7279CLK;/置CLK高电平 ch=ch1;/待发数据左移 Delay1us(8);/延时8Clr7279CLK;/置CLK低电平 Delay1us(8);/延时50Clr7279DAT;/发送完毕,DATA端置低,返回 unsigned char Receive7279Byte(void)/接收unsigned char i,ch;ch=0;Set7279DAT;/DATA端置为高电平,输入状态Delay1us(50);/延时50for (i=0;i8;i+)Set7279CLK;/置CLK高电平Delay1us(8);/延时8ch=ch1;/接收数据左移1位if (HD7279_DAT)ch+=1;/接收1位数据Clr7279CLK;/置CLK低电平Delay1us(8);/延时8Clr7279DAT;/接收完毕,DATA端重新置成低电平(输出状态)return ch;unsigned char code BdSeg=0x7e,0x30,0x6d,0x79, / 0 1 2 3 0x33,0x5b,0x5f,0x70, / 4 5 6 7 0x7f,0x7b,0x77,0x1f, / 8 9 a b 0x4e,0x3d,0x4f,0x47, / c d e f 0x00,0x01; char GetKeyValue(void)/获取键值char KeyValue;if (CPT1CN&0x40) return -1;/无键按下 Send7279Byte(0x15);/发读键盘指令 KeyValue=Receive7279Byte();NOSELECT7279; /置CS高电平 return KeyValue; /KS0108模块#define SELECTCS 0void LCD_WaitReady1(void) /判断LCD控制芯片KS0108是否忙LCD_DATA=0xff;_nop_();LCD_CS2=SELECTCS;LCD_RW=1;LCD_RS=0;LCD_E=1;while (LCD_DATA&0x80);LCD_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;LCD_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=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;void LCD_WriteZM(char x,char y,char *Dot) /显示16*16点阵汉字 char i;for (i=0;i16;i+)if (x+i%8)64)LCD_WriteCommand1(0xB8+y+i/8);LCD_WriteCommand1(0x40+x+i%8);LCD_WriteData1(Doti);elseLCD_WriteCommand2(0xB8+y+i/8);LCD_WriteCommand2(0x40+x-64+i%8);LCD_WriteData2(Doti);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);elseLCD_WriteCommand2(0xB8+y+i/16);LCD_WriteCommand2(0x40+x-64+i%16);LCD_WriteData2(Doti);void LCD_WriteHZcircle(char x,char y,char *Dot) /显示循环汉字char i;for (i=0;i32;i+)if (x+i%16)63&(x+i%16)=127)LCD_WriteCommand2(0xB8+y+i/16);LCD_WriteCommand2(0x40+x-64+i%16);LCD_WriteData2(Doti);elseLCD_WriteCommand1(0xB8+y+i/16);LCD_WriteCommand1(0x40+(x+i%16)%128);LCD_WriteData1(Doti); void InitLCD(void) /初始化LCDchar i,j;LCD_RST=0;Delay1ms(1);LCD_RST=1; LCD_WriteCommand1(0xc0);LCD_WriteCommand2(0xc0);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,int n)/显示一幅位图int i,j;for (j=0;j8;j+)/显示位图LCD_WriteCommand1(0xB8+j+n);LCD_WriteCommand1(0x40);for (i=0;i64;i+)LCD_WriteData1(buf(j*2)*64+i);LCD_WriteCommand2(0xB8+j+n);LCD_WriteCommand2(0x40);for (i=0;i64;i+)LCD_WriteData2(buf(j*2+1)*64+i);void DispBmp1(char *buf,int n,int m)/显示一幅位图/128*16,n为页值,m为列值int i,j;for (j=0;j2;j+)/显示位图if(m=63) LCD_WriteCommand1(0xB8+j+n);LCD_WriteCommand1(0x40);for(i=128-m;i=127;i+) LCD_WriteData1(bufi+128*j);for(i=0;i=63-m;i+) LCD_WriteData1(bufi+128*j);LCD_WriteCommand2(0xB8+j+n);LCD_WriteCommand2(0x40);for(i=64-m;i=127-m;i+)LCD_WriteData2(buf128*j+i);else LCD_WriteCommand2(0xB8+j+n);LCD_WriteCommand2(0x40);for(i=192-m;i=127;i+)LCD_WriteData2(buf128*j+i);for(i=0;i=127-m;i+) LCD_WriteData2(buf128*j+i);LCD_WriteCommand1(0xB8+j+n);LCD_WriteCommand1(0x40);for(i=128-m;i=191-m;i+)LCD_WriteData1(bufi+128*j);void Display (char *DispBuf,char ShowDot,char x,char y) /液晶屏显示温度、电压,压力值char i,ch,j=-16;ShowDot-;for (i=2;i6;i+)j+=16;ch=DispBufi;switch(ch)case 0: LCD_WriteZM(x+j,y,led0); break; case 1: LCD_WriteZM(x+j,y,led1); break;case 2: LCD_WriteZM(x+j,y,led2); break;case 3: LCD_WriteZM(x+j,y,led3); break;case 4: LCD_WriteZM(x+j,y,led4); break;case 5: LCD_WriteZM(x+j,y,led5); break;case 6: LCD_WriteZM(x+j,y,led6); break;case 7: LCD_WriteZM(x+j,y,led7); break;case 8: LCD_WriteZM(x+j,y,led8); break;case 9: LCD_WriteZM(x+j,y,led9); break;default: LCD_WriteZM(x+j,y,led); break;if(i=ShowDot)LCD_WriteZM(x+j+8,y,Dot);unsigned int GetADCValue(char No);char GetKeyValue(void);void menulcd () /显示菜单InitLCD();DispBmp(menu,0);void TestLCD(void) /开头文字的显示char i;InitLCD();DispBmp(ss,1);/江苏大学计算机学院 Delay1s(0.5);for (i=0;i64;i+)Delay1ms(100);LCD_WriteCommand1(0xc0+i%64);/设置起始行,实现向上滚动LCD_WriteCommand2(0xc0+i%64);Delay1s(2); InitLCD();DispBmp(ss1,1);/单片机课程设计Delay1s(2); InitLCD();DispBmp(ss2,1);/液晶点阵显示屏程序设计Delay1s(2);InitLCD();DispBmp(ss3,1);/作者:柳健 班级:计算机0902 学号:3090601061Delay1s(2);void zuoyouyi()/汉字,图画左右移动char i,j,k;k=1; for (j=0;j8;j+)/汉字从左向右滚动for(i=0;i=0;j-)/汉字从右向左滚动for(i=0;i=0)&(i=3)/如果按键大于3,则不读入键值No=i;Delay1ms(250);buf0= No;buf1= ;buf2=(w%10000)/1000;buf3=(w%1000)/100;buf4=(w%100)/10;buf5=(w%10);if (No=1)InitLCD();DispBmp(tem,1);/按1采集到温度Display(buf,4,50,4);else if (No=2)InitLCD();DispBmp(volte,1);/按2采集到电压Display(buf,3,50,4); else if (No=3)InitLCD();DispBmp(pres,1);/按3采集到压力Display(buf,4,50,4);else break;/按0回到主菜单 w = GetADCValue(No);ADC模块:#include c8051F020.h#include /*压力应变片ADC试验运行此程序,压力值将在数码管上显示.用手触摸应变片观察压力变化.*/#define MUX_TEMP0x08#define MUX_VOLT0x01#define MUX_PRESS0x02unsigned 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-justifiedREF0CN = 0x07; / enable temp sensor, on-chip VREF, / and VREF output buffermux_select = MUX_TEMP; / CPU on-chip temp sensorAMX0SL = MUX_TEMP; ADC0CF = (SYSCLK/2500000) 3; / ADC conversion clock = 2.5MHz/ADC0CF |= 0x01; / PGA gain = 2EIE2 &= 0x02; / disable ADC0 EOC interruptEIE1 &= 0x04; / disable ADC0 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 completeswitch (mux_select)case MUX_TEMP: temp_long = ADC0 - 42380/2; temp_long = (temp_long * 200L) / 156;Temp=temp_long;AMX0SL = MUX_VOLT;/ Select AIN1 for next readmux_select = MUX_VOLT;break; case MUX_VOLT:temp_long = ADC0;Volt = 24*temp_long/655;AMX0SL = MUX_PRESS;/ Select on-chip temp sensormux_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;default:AMX0SL = MUX_TEMP;mux_select = MUX_TEMP;break; unsigned int GetADCValu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏南京建邺区五校联考2026届化学九年级第一学期期中达标检测模拟试题含解析
- 黑龙江省哈尔滨市顺迈2026届九年级化学第一学期期中质量检测模拟试题含解析
- 四川省巴中市2025-2026学年高三上学期9月零诊考试数学试题(含答案)
- 山东省临沂蒙阴县联考2026届九年级化学第一学期期中调研模拟试题含解析
- 2025年新训政府专职消防员职业技能鉴定理论参考试题库(含答案)
- 河南省南阳市内乡县2026届化学九上期中监测模拟试题含解析
- 福建省龙岩市永定区2026届化学九年级第一学期期中经典模拟试题含解析
- 智能制造行业技术工人派遣合同及技能提升协议
- 离婚抚养权变更及子女财产继承协议范本
- 离婚协议书范本:保障离婚后子女教育权益
- GB/T 41972-2022铸铁件铸造缺陷分类及命名
- YY/T 0471.3-2004接触性创面敷料试验方法 第3部分:阻水性
- GB/T 3871.9-2006农业拖拉机试验规程第9部分:牵引功率试验
- PEP小学英语五年级上册第四单元全国优质课赛课一等奖《思维导图在小学英语复习课的应用》精品课件
- 新闻传播中的媒介素养课件
- 小军师面试万能绝杀模板-组织管理
- 超疏水材料课件
- 中医刮痧法诊疗操作评分标准
- 腧穴定位法课件
- 社会体育导论PTPPT课件讲义
- 学校体育学(第三版)ppt全套教学课件
评论
0/150
提交评论