LCD1602显示程序,频率计PROTUES仿真,LCD1602显示结果_第1页
LCD1602显示程序,频率计PROTUES仿真,LCD1602显示结果_第2页
LCD1602显示程序,频率计PROTUES仿真,LCD1602显示结果_第3页
LCD1602显示程序,频率计PROTUES仿真,LCD1602显示结果_第4页
LCD1602显示程序,频率计PROTUES仿真,LCD1602显示结果_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、效果图:程序: 若注释部分为乱码:设置 keil: EditConfigurationEditorEncoding 选择 chinese2312。 编译出现5个警告,是一些函数没有调用的警告,将未调用的函数注释掉警告就会消失。 要将程序写到实体机上时,请看按注释更改忙碌检测语句。以下程序经过多次复制,粘贴到kei l,没有错误,如出现错误,请下载文档后再复制。 /PROTUES 仿真百度网盘地址: HYPERLINK http:/pan.baidu.eom/s/1pJ4W7fd http:/pan.baidu.eom/s/1pJ4W7fd#includevreg52.h#include #de

2、fine uchar unsigned char#define uint unsigned intsbit POO = P0A0; sbit PO1 = P0A1; sbit P02 = P0A2;sbit PO3 = P0A3;sbit P04 = P0A4;sbit P05 = P0A5;sbit P06 = P0A6;sbit P07 =卩0人7;sbit P1O = P1A0;sbit P11 = P1A1;sbit P12 = P1A2;sbit P13 = P1A3;sbit P14 = P1A4;sbit P15 = P1A5;sbit P16 = P1A6;sbit P17 =

3、 P1A7;sbit P20 = P2A0;sbit P21 = P2A1;sbit P22 = P2A2;sbit P23 = P2A3;sbit P24 = P2A4;sbit P25 = P2A5;sbit P26 = P2A6;sbit P27 = P2A7;sbit P3O = P3A0;sbit P31 = P3A1;sbit P32 = P3A2;sbit P33 = P3A3;sbit P34 = P3A4;sbit P35 = P3A5;sbit P36 = P3A6; sbit P37 = P3A7;/* LCD #define RS P22 #define RW P21#

4、define LCDEN P20 uchar idata lcd_code10;用来标记lcdl602什么时候清显示 每个页面都设一个code, code 不想同时清显示#define LCD_DATA P0#define LCD_BUSY P07#define LCD_DATA P0#define LCD_BUSY P07/P0 口接LCD数据口lcd1602忙碌标志位void delayus(uint us)for(;us 0;us-)_nop_();void delayms(uint ms)/延时? 个 msuchar a,b,c;while(ms-)for(c=1;c0;c-)for(

5、b=142;b0;b-)for(a=2;a0;a-);/*字符审复制函数*void string_copy(uchar *target,uchar *source)/字符串复制 target:目标 source: 源 uchar i = 0;for(i = 0;sourcei != 0;i+)/注意 target 的长度 无保护措施!targeti = sourcei;targeti = 0;/* 字符串比较函数*uchar string_cmp(uchar *target,uchar *source)/字符串比较 target:目标 source: 源 uchar revalue;uchar

6、 i = 0;for(i = 0;targeti != 0 & sourcei != 0;i+)两个都不等于0才执行 出现一个等于0就跳出if(targeti = sourcei)revalue = 1;elserevalue = 0; break;if(revalue = 1)if(targeti = 0 & sourcei = 0)revalue = 1;elserevalue = 0;return(revalue);*LCD /LCD基本函数:void busy_check() 忙碌检测/* RW = 1; 读RS = 0; 指令寄存器LCD_DATA = OxFF;/实验证明读数时要将

7、I/O 口要置1LCDEN = 0;_nop_();_nop_();_nop_();_nop_();LCDEN = 1;/ EN高电平读信息负跳变执行指令_nop_();_nop_();_nop_();_nop_();while(1)if(LCD_BUSY = 0)/P07 = 0 跳出循环break; */delayms(2);仿真时用延时法下载到真实单片机上时,将这句注释掉,采用上面的语句。void lcdwrcom(uchar command)/写 扌旨令busy_check();RW = 0;/写RS = 0;/指令寄存器LCD_DATA = command;LCDEN = 1;/负跳

8、变写入指令_nop_();_nop_();_nop_();_nop_();LCDEN = 0;void lcdwrdata(uchar lcd_data)/写数据数字、字母、标点符号都是数据busy_check();RW = 0;/写RS = 1;/数据寄存器LCD_DATA = lcd_data;LCDEN = 1;/负跳变写入指令_nop_();_nop_();_nop_();_nop_();LCDEN = 0;void lcd_init()delayms(15);必要lcd1602上电到电压稳定需要时间RW = 0;/写RS = 0;/指令寄存器LCD_DATA = 0 x38;/ 0

9、x38设置显示模式为:16X2显示,5X7点阵,8位数据接口LCDEN = 1;_nop_();_nop_();_nop_();_nop_();LCDEN = 0;delayms(5);lcdwrcom(0 x0c);打开显示无光标不闪烁lcdwrcom(0 x06);指令3光标右移屏幕所有文字移动无效lcdwrcom(OxOl);/清显示,光标复位到地址00H位置。/LCD扩展函数:void address(uchar x,uchar y) 定位下一步要写数的地址uchar location;if(x = 0)location = 0 x80ly;elselocation = 0 xC0|y

10、;lcdwrcom(location);void printchar(uchar x,uchar y,uchar letter)/显示字母、单个字符address(x,y);lcdwrdata(letter);void printword(uchar x,uchar y,uchar *word) /显示单词(字符数组)uchar i = 0;for(i = 0;wordi != 0;i+)address(x,y + i);lcdwrdata(wordi);void printuint(uchar x,uchar y,uchar num_ws_max,uint num)/显示无符号整形 0655

11、35 x:行 y:列num_ws_max变量的最大位数uchar i = 0;uchar str =0 x20,0 x20,0 x20,0 x20,0 x20;if(num = 10000)str0 = num/10000 + 0;str1 = num%10000/1000 + 0;str2 = num%1000/100 + 0;str3 = num%100/10 + 0;str4 = num%10 + 0;/ str5 = 0;手动加字符串结束标志else if(num = 1000)str0 = num/1000 + 0;str1 = num%1000/100 + 0;str2 = num

12、%100/10 + 0;str3 = num%10 + 0;str4 =0;else if(num = 100)str0 = num/100 + 0;str1 = num%100/10 + 0;str2 = num%10 + 0;str3 = 0;else if(num =10)str0 = num/10 + 0;str1 = num%10 + 0;str2 = 0;else if(num = 0)str0 = num + 0;str1 = 0;for(i = 0;i = 5;i+) /uint 类型 最大值 65535 为 5 位数if(stri != 0 & i num_ws_max)ad

13、dress(x,y + i);lcdwrdata(stri);else if(stri = 0 & i num_ws_max)address(x,y+i);lcdwrdata( );/空格/实现功能:在此变量的位数范围内,把没数字的位存0 x20 (空格)例如:最大有3位:999当 变为 99 时,存为 9+0 9+0 0 x20void printvolt(uchar x,uchar y,uint v) /将一个3位数除以100保留两位小数 可用来显示电压0.005.00Vuchar str4 = 0;uchar i = 0;str0 = v/100 + 0;str1=.;str2 = v%

14、100/10 + 0;str3 = v%10 + 0;printword(x,y,str);* 定时器uint t0_flag = 0;uchar t1_flag = 0;uint fre = 0;void timer_init()ET0 = 1;ET1 = 1;TMOD = 0 x15; 定时器0:计数模式,定时器1:定时模式1TH0 = 255;TL0 = 255;TH1 = 0 x3C;TL1 = 0 xB0;/50MS void timer0() interrupt 1 TH0 = 255;TL0 = 255; t0_flag+; void timer1() interrupt 3 TH1 = 0 x3C;TL1 = 0 xB0;t1_flag+;if(t1_flag = 20) fre = t0_flag;TRO = 0;TRI = 0; t1_flag = 0;void main()EA = 1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论