[51单片机] 1602液晶显示控制代码2
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了[51单片机] 1602液晶显示控制代码2,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5576字,纯文字阅读大概需要8分钟。
内容图文
![[51单片机] 1602液晶显示控制代码2](/upload/InfoBanner/zyjiaocheng/1306/ff4da045e4b241dd84672d63057f22cc.jpg)
这是4X4按键映射为0-F的16个字符输入并显示在屏上的程序:
[这里要额外的把单片机p1的8个脚和矩阵键盘的8个脚相连]
1 /* ----------------------------------------------- 2 名称:LCD1602 3 论坛:www.doflye.net 4 编写:shifang 5 内容:通过矩阵键盘输入,依次显示0-F16中字符 6 引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK 7 ------------------------------------------------ */ 8 #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 9 #include<intrins.h> 10 11 sbit RS = P2^4; //定义端口 12 sbit RW = P2^5; 13 sbit EN = P2^6; 14 15#define RS_CLR RS=0 16#define RS_SET RS=1 17 18#define RW_CLR RW=0 19#define RW_SET RW=1 20 21#define EN_CLR EN=0 22#define EN_SET EN=1 23 24#define DataPort P0 25#define KeyPort P1 26 27 unsigned char code dofly_code[]={‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘};//转换成液晶显示的字符 28/*------------------------------------------------ 29uS延时函数,含有输入参数 unsigned char t,无返回值 30unsigned char 是定义无符号字符变量,其值的范围是 310~255 这里使用晶振12M,精确延时请使用汇编,大致延时 32长度如下 T=tx2+5 uS 33------------------------------------------------*/ 34void DelayUs2x(unsigned char t) 35{ 36while(--t); 37} 38/*------------------------------------------------ 39mS延时函数,含有输入参数 unsigned char t,无返回值 40unsigned char 是定义无符号字符变量,其值的范围是 410~255 这里使用晶振12M,精确延时请使用汇编 42------------------------------------------------*/ 43void DelayMs(unsigned char t) 44{ 45 46while(t--) 47 { 48//大致延时1mS 49 DelayUs2x(245); 50 DelayUs2x(245); 51 } 52} 53/*------------------------------------------------ 54判忙函数 55------------------------------------------------*/ 56 bit LCD_Check_Busy(void) 57{ 58 DataPort= 0xFF; 59 RS_CLR; 60 RW_SET; 61 EN_CLR; 62 _nop_(); 63 EN_SET; 64return (bit)(DataPort & 0x80); 65} 66/*------------------------------------------------ 67写入命令函数 68------------------------------------------------*/ 69void LCD_Write_Com(unsigned char com) 70{ 71// while(LCD_Check_Busy()); //忙则等待 72 DelayMs(5); 73 RS_CLR; 74 RW_CLR; 75 EN_SET; 76 DataPort= com; 77 _nop_(); 78 EN_CLR; 79} 80/*------------------------------------------------ 81写入数据函数 82------------------------------------------------*/ 83void LCD_Write_Data(unsigned char Data) 84{ 85//while(LCD_Check_Busy()); //忙则等待 86 DelayMs(5); 87 RS_SET; 88 RW_CLR; 89 EN_SET; 90 DataPort= Data; 91 _nop_(); 92 EN_CLR; 93} 94/*------------------------------------------------ 95清屏函数 96------------------------------------------------*/ 97void LCD_Clear(void) 98{ 99 LCD_Write_Com(0x01); 100 DelayMs(5); 101} 102/*------------------------------------------------ 103写入字符串函数 104------------------------------------------------*/105void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 106{ 107if (y == 0) 108 { 109 LCD_Write_Com(0x80 + x); 110 } 111else112 { 113 LCD_Write_Com(0xC0 + x); 114 } 115while (*s) 116 { 117 LCD_Write_Data( *s); 118 s ++; 119 } 120} 121/*------------------------------------------------ 122写入字符函数 123------------------------------------------------*/124void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 125{ 126if (y == 0) 127 { 128 LCD_Write_Com(0x80 + x); 129 } 130else131 { 132 LCD_Write_Com(0xC0 + x); 133 } 134 LCD_Write_Data( Data); 135} 136/*------------------------------------------------ 137初始化函数 138------------------------------------------------*/139void LCD_Init(void) 140{ 141 LCD_Write_Com(0x38); /*显示模式设置*/142 DelayMs(5); 143 LCD_Write_Com(0x38); 144 DelayMs(5); 145 LCD_Write_Com(0x38); 146 DelayMs(5); 147 LCD_Write_Com(0x38); 148 LCD_Write_Com(0x08); /*显示关闭*/149 LCD_Write_Com(0x01); /*显示清屏*/150 LCD_Write_Com(0x06); /*显示光标移动设置*/151 DelayMs(5); 152 LCD_Write_Com(0x0C); /*显示开及光标设置*/153} 154155/*------------------------------------------------ 156按键扫描函数,返回扫描键值 157------------------------------------------------*/158 unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法159{ 160 unsigned char cord_h,cord_l;//行列值中间变量161 KeyPort=0x0f; //行线输出全为0162 cord_h=KeyPort&0x0f; //读入列线值163if(cord_h!=0x0f) //先检测有无按键按下164 { 165 DelayMs(10); //去抖166if((KeyPort&0x0f)!=0x0f) 167 { 168 cord_h=KeyPort&0x0f; //读入列线值169 KeyPort=cord_h|0xf0; //输出当前列线值170 cord_l=KeyPort&0xf0; //读入行线值171172while((KeyPort&0xf0)!=0xf0);//等待松开并输出173174return(cord_h+cord_l);//键盘最后组合码值175 } 176 }return(0xff); //返回该值177} 178/*------------------------------------------------ 179按键值处理函数,返回扫键值 180------------------------------------------------*/181 unsigned char KeyPro(void) 182{ 183switch(KeyScan()) 184 { 185case0x7e:return0;break;//0 按下相应的键显示相对应的码值186case0x7d:return1;break;//1187case0x7b:return2;break;//2188case0x77:return3;break;//3189case0xbe:return4;break;//4190case0xbd:return5;break;//5191case0xbb:return6;break;//6192case0xb7:return7;break;//7193case0xde:return8;break;//8194case0xdd:return9;break;//9195case0xdb:return10;break;//a196case0xd7:return11;break;//b197case0xee:return12;break;//c198case0xed:return13;break;//d199case0xeb:return14;break;//e200case0xe7:return15;break;//f201default:return0xff;break; 202 } 203} 204205/*------------------------------------------------ 206主函数 207------------------------------------------------*/208void main(void) 209{ 210 unsigned char i,j,num; 211212 LCD_Init(); 213 LCD_Write_Com(0x0F);//光标开,光标闪烁开214215 LCD_Write_String(0,0,"Press the key !"); 216217while (1) 218 { 219 num=KeyPro(); 220if(num!=0xff) 221 { 222if((i==0)&&(j==0))//回到第一个字符时清屏223 LCD_Clear();//清屏224 LCD_Write_Char(0+i,0+j,dofly_code[num]);//依次显示输入字符225 i++; 226if(i==16)//如果第一行显示满,转到第二行227 { 228 i=0;j++; 229if(j==2)//如果2行都显示满,清屏后重新从第一行显示230 { 231 j=0; 232 } 233 } 234 } 235 } 236 }
原文:http://www.cnblogs.com/zjutlitao/p/3641852.html
内容总结
以上是互联网集市为您收集整理的[51单片机] 1602液晶显示控制代码2全部内容,希望文章能够帮你解决[51单片机] 1602液晶显示控制代码2所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。