欢迎来到沃文网! | 帮助中心 分享知识,传播智慧!
沃文网
全部分类
  • 教学课件>
  • 医学资料>
  • 技术资料>
  • 学术论文>
  • 资格考试>
  • 建筑施工>
  • 实用文档>
  • 其他资料>
  • ImageVerifierCode 换一换
    首页 沃文网 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    点阵式液晶显示屏的显示程序设计.doc

    • 资源ID:1162153       资源大小:134KB        全文页数:19页
    • 资源格式: DOC        下载积分:10积分
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录 微博登录
    二维码
    微信扫一扫登录
    下载资源需要10积分
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,下载更划算!
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    点阵式液晶显示屏的显示程序设计.doc

    1、C8051F单片机原理及应用课程设计点阵式液晶显示屏的显示程序设计J I A N G S U U N I V E R S I T Y单片机原理及应用 学院名称: 计算机 专业班级: 计算机0802 学生姓名: 陈 帅 学生学号: 3080602048 指导教师姓名: 陈 向 益 2011年 6月点阵式液晶显示屏的显示程序设计一、设计目的1熟练掌握C51系统仿真开发系统的应用。2加强单片机的综合运用能力、提高单片机的软件编程和调试能力,为以后的学习和开发工作打下良好基础。3掌握的液晶的工作原理以及应用设计。4掌握小系统开发设计的流程以及设计思路。二、设计方案 实验要求:1)从下到上滚动显示:“江

    2、苏大学计算机学院”然后交替显示:“单片机课程设计”“液晶点阵显示屏程序设计”“作者姓名、班级、学号” 2)能进行正常的模拟量采样值显示(温度、压力、电位) 。 3) 改变字库的内容,显示其它汉字。 4) 改变页地址或列地址,使显示的内容改变位置。 5)其它功能(如左、右移,上下卷、显示图片等)。设计思路:由于实验指导书中做过液晶显示和模数转换得实验,根据两个实验的功能实现和流程原理进行设计将程序分成三个模块:主函数模块main.c模数转换模块ADC.c液晶显示模块KS0108.c其中让主函数模块做一些初始化和函数调用工作,模数转换模块主要是将温度,压力,点位的值转化为数字量供液晶显示用,液晶显

    3、示模块得到模数转换模块传递过来的数字量显示到液晶面板上。程序流程图:1系统主流程图如下开始主函数模块显示模块模数转换模块2主函数流程图开始使能比较器1开中断初始化系统时钟钟初始化定时器0初始化IO端口初始化SPI0使能片内参考电压使能DAC3 显示模块流程图开始初始化LCD滚屏显示江苏大学计算机学院读取数字量并显示调用模数转换得到值显示课程设计题目、班级、姓名健值是否1.2.34 模数转换模块流程图开始读取No和模拟量返回温度返回点位结束返回压力No=2?No=3?No=1? 主要的源程序及注释主函数:#include c8051f020.h #include void Delay1us(un

    4、signed 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 o

    5、sc. 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

    6、= 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 = 0x

    7、03; / 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(

    8、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 *Disp

    9、Buf,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; /使能片内参考电压

    10、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);

    11、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

    12、 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;SEL

    13、ECT7279; /置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;/DA

    14、TA端置为高电平,输入状态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,0x7

    15、b,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控制芯片KS010

    16、8是否忙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控制芯片

    17、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控制芯片KS0

    18、108发送数据命令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_WriteHZ(char x,char y,char *Dot) /显示1

    19、6*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 (

    20、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_W

    21、riteCommand2(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,in

    22、t 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

    23、 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_WriteComm

    24、and2(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) /液晶屏显示温度

    25、、电压,压力值char i,ch,j=-16;ShowDot-;for (i=2;i6;i+)j+=16;ch=DispBufi;switch(ch)case 0: LCD_WriteHZ(x+j,y,led0); break; case 1: LCD_WriteHZ(x+j,y,led1); break;case 2: LCD_WriteHZ(x+j,y,led2); break;case 3: LCD_WriteHZ(x+j,y,led3); break;case 4: LCD_WriteHZ(x+j,y,led4); break;case 5: LCD_WriteHZ(x+j,y,led

    26、5); break;case 6: LCD_WriteHZ(x+j,y,led6); break;case 7: LCD_WriteHZ(x+j,y,led7); break;case 8: LCD_WriteHZ(x+j,y,led8); break;case 9: LCD_WriteHZ(x+j,y,led9); break;default: LCD_WriteHZ(x+j,y,led); break;if(i=ShowDot)LCD_WriteHZ(x+j+8,y,Dot);unsigned int GetADCValue(char No);char GetKeyValue(void);

    27、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();Dis

    28、pBmp(ss2,1);/液晶点阵显示屏程序设计Delay1s(2);InitLCD();DispBmp(ss3,1);/作者:陈帅 班级:计算机0802 学号:48Delay1s(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

    29、)/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 /*压力应变片A

    30、DC试验运行此程序,压力值将在数码管上显示.用手触摸应变片观察压力变化.*/#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 initiate

    31、d / 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;

    32、 / 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 compl

    33、eteswitch (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_sel

    34、ect = 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 GetADCValue(char No)/采集数据read_analog_inputs();read_analog_inputs();read_analog_inputs();switch (No)case 1:return Temp;case 2:return Volt;case 3:if (Press10) Press=0;return Press;3、调试过程将如下源文件main.c,c8051F020.h,ADC.c,KS0108.c加入到开发工具中,调试程序,并下载到单片机中运行,首先有“江苏大学计算机学院”一行字向上滚动,然后显示“液晶点阵显示屏程序设


    注意事项

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




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给沃文网发消息,QQ:2622162128 - 联系我们

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

    Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1

    陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922