zoukankan      html  css  js  c++  java
  • [51单片机] 1602液晶显示控制代码2

    这是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 /*------------------------------------------------
     29 uS延时函数,含有输入参数 unsigned char t,无返回值
     30 unsigned char 是定义无符号字符变量,其值的范围是
     31 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
     32 长度如下 T=tx2+5 uS 
     33 ------------------------------------------------*/
     34 void DelayUs2x(unsigned char t)
     35 {   
     36     while(--t);
     37 }
     38 /*------------------------------------------------
     39 mS延时函数,含有输入参数 unsigned char t,无返回值
     40 unsigned char 是定义无符号字符变量,其值的范围是
     41 0~255 这里使用晶振12M,精确延时请使用汇编
     42 ------------------------------------------------*/
     43 void DelayMs(unsigned char t)
     44 {
     45     
     46     while(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;
     64     return (bit)(DataPort & 0x80);
     65 }
     66 /*------------------------------------------------
     67 写入命令函数
     68 ------------------------------------------------*/
     69 void 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 ------------------------------------------------*/
     83 void 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 ------------------------------------------------*/
     97 void LCD_Clear(void) 
     98 { 
     99     LCD_Write_Com(0x01); 
    100     DelayMs(5);
    101 }
    102 /*------------------------------------------------
    103 写入字符串函数
    104 ------------------------------------------------*/
    105 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
    106 {     
    107     if (y == 0) 
    108     {     
    109         LCD_Write_Com(0x80 + x);     
    110     }
    111     else 
    112     {     
    113         LCD_Write_Com(0xC0 + x);     
    114     }        
    115     while (*s) 
    116     {     
    117         LCD_Write_Data( *s);     
    118         s ++;     
    119     }
    120 }
    121 /*------------------------------------------------
    122 写入字符函数
    123 ------------------------------------------------*/
    124 void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
    125 {     
    126     if (y == 0) 
    127     {     
    128         LCD_Write_Com(0x80 + x);     
    129     }    
    130     else 
    131     {     
    132         LCD_Write_Com(0xC0 + x);     
    133     }        
    134     LCD_Write_Data( Data);  
    135 }
    136 /*------------------------------------------------
    137 初始化函数
    138 ------------------------------------------------*/
    139 void 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 }
    154 
    155 /*------------------------------------------------
    156 按键扫描函数,返回扫描键值
    157 ------------------------------------------------*/
    158 unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
    159 {
    160     unsigned char cord_h,cord_l;//行列值中间变量
    161     KeyPort=0x0f;            //行线输出全为0
    162     cord_h=KeyPort&0x0f;     //读入列线值
    163     if(cord_h!=0x0f)    //先检测有无按键按下
    164     {                                                                                                              
    165         DelayMs(10);        //去抖
    166         if((KeyPort&0x0f)!=0x0f)
    167         {
    168             cord_h=KeyPort&0x0f;  //读入列线值
    169             KeyPort=cord_h|0xf0;  //输出当前列线值
    170             cord_l=KeyPort&0xf0;  //读入行线值
    171             
    172             while((KeyPort&0xf0)!=0xf0);//等待松开并输出
    173             
    174             return(cord_h+cord_l);//键盘最后组合码值
    175         }
    176     }return(0xff);     //返回该值
    177 }
    178 /*------------------------------------------------
    179 按键值处理函数,返回扫键值
    180 ------------------------------------------------*/
    181 unsigned char KeyPro(void)
    182 {
    183     switch(KeyScan())
    184     {
    185     case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
    186     case 0x7d:return 1;break;//1
    187     case 0x7b:return 2;break;//2
    188     case 0x77:return 3;break;//3
    189     case 0xbe:return 4;break;//4
    190     case 0xbd:return 5;break;//5
    191     case 0xbb:return 6;break;//6
    192     case 0xb7:return 7;break;//7
    193     case 0xde:return 8;break;//8
    194     case 0xdd:return 9;break;//9
    195     case 0xdb:return 10;break;//a
    196     case 0xd7:return 11;break;//b
    197     case 0xee:return 12;break;//c
    198     case 0xed:return 13;break;//d
    199     case 0xeb:return 14;break;//e
    200     case 0xe7:return 15;break;//f
    201     default:return 0xff;break;
    202     }
    203 }
    204 
    205 /*------------------------------------------------
    206 主函数
    207 ------------------------------------------------*/ 
    208 void main(void) 
    209 { 
    210     unsigned char i,j,num; 
    211     
    212     LCD_Init(); 
    213     LCD_Write_Com(0x0F);//光标开,光标闪烁开
    214     
    215     LCD_Write_String(0,0,"Press the key !");
    216     
    217     while (1) 
    218     {  
    219         num=KeyPro();
    220         if(num!=0xff)
    221         {
    222             if((i==0)&&(j==0))//回到第一个字符时清屏
    223                 LCD_Clear();//清屏
    224             LCD_Write_Char(0+i,0+j,dofly_code[num]);//依次显示输入字符
    225             i++;
    226             if(i==16)//如果第一行显示满,转到第二行
    227             {
    228                 i=0;j++;
    229                 if(j==2)//如果2行都显示满,清屏后重新从第一行显示
    230                 {
    231                     j=0;
    232                 }
    233             }
    234         }
    235     }
    236 }
  • 相关阅读:
    OAuth2.0介绍
    C#集成FastDFS断点续传
    ABP集成WIF实现单点登录
    CentOS7下搭建FastDfs(V5.11)+Keepalived分布式集群部署
    【算法】之常见的排序算法
    【开发工具
    【C/C++】之C/C++快速入门
    【数据结构】之二叉树(Java语言描述)
    【数据结构】之散列链表(Java语言描述)
    【数据结构】之队列(Java语言描述)
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3641852.html
Copyright © 2011-2022 走看看