历史上的今天
返回首页

历史上的今天

今天是:2025年01月10日(星期五)

正在发生

2018年01月10日 | 12864显示屏4*4键盘实验

2018-01-10 来源:eefocus

12864显示屏4*4键盘实验输出结果:获得键值通过发光二极管显示             
#include  

unsigned char code IC_DAT[];


sbit RS=P3^6;     //RS="H",表示DB7--DB0为显示数据, 
                  //RS="L",表示DB7--DB0为显示指令数据 

sbit WRD = P2^5;  //R/W="H",E="H",数据被读到DB7--DB0 
                   //R/W="L",E="H→L", DB7--DB0的数据被写到IR或DR 

sbit E = P2^6;    //使能信号 

sbit PSB = P2^3;  //H:并口方式 L:串口方式 


void    TransferData(char data1,bit DI); //传送数据或者地址命令(data), 
                                         //当DI=0是,传送命令,当DI=1,传送数据. 
void    display(void); 
void    display_grapic(void); 

void    delay1(unsigned int t); 
void    delay(unsigned int m); 
void    delayms(unsigned int n); 

void    DisplayLine(unsigned char line1,unsigned char line2); 
void    DisplayGraphic(unsigned char code *adder); 

void    LCD_mesg(unsigned char code *adder1); 
Key_return(char keyvalue); 
keysCAN(); 
/***************屏幕显示结果*********************/ 
unsigned char code IC_DAT[]={ 
"天华杯老师培训班" 
"******    ******" 
"    按键键值    " 
"地点:35号楼 505" 
}; 
unsigned char data1[]={"0123456789ABCDEF "}; 
/***************LCD字库初始化程序*********************/ 
void initinal(void)          
          { 
           delay(40);               //大于40MS的延时程序 
           PSB=1;                   //设置为8BIT并口工作模式 
           delay(1);                //延时 
          // RES=0;                 //复位 
          // delay(1);              //延时 
          // RES=1;                 //复位置高 
           delay(10); 
           TransferData(0x30,0);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF 
           delay(100);            //大于100uS的延时程序 
           TransferData(0x30,0);  //Function Set 
           delay(37);             ////大于37uS的延时程序 
           TransferData(0x08,0);  //Display on Control 
           delay(100);            //大于100uS的延时程序 
           TransferData(0x10,0);  //Cursor Display Control光标设置 
           delay(100);            //大于100uS的延时程序 
           TransferData(0x0C,0);  //Display Control,D=1,显示开 
           delay(100);            //大于100uS的延时程序 
           TransferData(0x01,0);  //Display Clear    清屏 
           delay(10);             //大于10mS的延时程序 
           TransferData(0x06,0);  //Enry Mode Set,光标从右向左加1位移动 
           delay(100);            //大于100uS的延时程序 
          } 


//*************显示函数****************************** 

void lcd_mesg(unsigned char code *adder1) 

    unsigned char i; 
        TransferData(0x80,0);    //Set Graphic Display RAM Address 传地址指令 
        delay(100); 
    for(i=0;i<32;i++) 
        { 
              TransferData(*adder1,1); 
               adder1++; 
        } 

        TransferData(0x90,0);    //Set Graphic Display RAM Address 
        delay(100); 

    for(i=0;i<32;i++) 
        { 
              TransferData(*adder1,1); 
               adder1++; 
        } 

//*************位置显示函数****************************** 
void lcd_wxs1(unsigned int adder2) 

        TransferData(0x8C,0);    //Set Graphic Display RAM Address 传地址指令 
        delay(100);     
          TransferData(adder2,1); 
        TransferData(data1[16],1); 

/***************键盘扫描子程序*************/ 
keyscan()   
{     
    char sCCode,recode,tcode,i,keyvalue,temp; 
    P1=0xf0;  //发全“0”行扫描,列线输入 
    if((P1&0xf0)!=0xf0) //有键按下 
        {  
            delay1(10);   //延时去抖动 
            tcode=0x01; 
           if((P1&0xf0)!=0xf0) 
                { 
                    for(i=0;i<4;i++) 
                      { 
                        sccode=~tcode;  //扫描初始值 
                       P1=sccode;     //输出行扫描码 
                       if((P1&0XF0)!=0XF0)  //本行有键按下 
                            { 
                              recode=P1&0xf0; 
                              //recode=recode>>4; 
                              recode=recode+0x0f; 
                              temp=((~sccode)+(~recode)); 
                              keyvalue=Key_return(temp);  //返回特征码 
                              return keyvalue; 
                            } 
                         else 
                        tcode=tcode<<1;  //行扫描码左移一位 
                         } 
                } 

            } 
    else 
    return keyvalue;  //无键按下,返回0 


/***************查键值子程序*************/ 
Key_return(char keyvalue) 

    unsigned int Key_num; 
  //keyword=keyvalue; 
     switch(keyvalue) 
           { 
           case(0x11): 
                      { 
                      Key_num=0x00; 
                      }break; 
           case(0x12): 
                      { 
                      Key_num=0x04; 
                      }break; 
           case(0x14): 
                      { 
                      Key_num=0x08; 
                      }break; 
           case(0x18): 
                      { 
                      Key_num=0x0c; 
                      }break; 
           case(0x21): 
                      { 
                      Key_num=0x01; 
                      }break; 
           case(0x22): 
                      { 
                      Key_num=0x05; 
                      }break; 
           case(0x24): 
                      { 
                      Key_num=0x09; 
                      }break; 
           case(0x28): 
                      { 
                      Key_num=0x0d; 
                      }break; 
           case(0x41): 
                      { 
                      Key_num=0x02; 
                      }break; 
           case(0x42): 
                      { 
                      Key_num=0x06; 
                      }break; 
           case(0x44): 
                      { 
                      Key_num=0x0a; 
                      }break; 
           case(0x48): 
                      { 
                      Key_num=0x0e; 
                      }break; 
           case(0x81): 
                      { 
                      Key_num=0x03; 
                      }break; 
           case(0x82): 
                       { 
                       Key_num=0x07; 
                       }break; 
           case(0x84): 
                       { 
                       Key_num=0x0b; 
                       }break; 
           case(0x88): 
                      { 
                      Key_num=0x0f; 
                      }break; 
           default:break; 
           } 
           return Key_num; 


//********写命令/数据******************************* 

void    TransferData(char data1,bit DI)  //传送数据或者命令,当DI=0是,传送命令, 
          {                                 //当DI=1,传送数据. 
            WRD=0;    //R/W="H",E="H",数据被读到DB7--DB0,R/W="L",E="H→L", DB7--DB0的数据被写到IR或DR 
            RS=DI;    //RS="H",表示DB7--DB0为显示数据, RS="L",表示DB7--DB0为显示指令数据 
            delay(1); 
            P0=data1; 
            E=1; 
            delay(1); 
            E=0; 
           } 
//************延 时******************************************* 
void  delayms(unsigned int n)            //延时10×n毫秒程序 
                   { 
                      unsigned int i,j; 
                      for(i=0;i                         for(j=0;j<2000;j++); 
                   } 

void  delay(unsigned int m)              //延时程序 
                   { 
                      unsigned int i,j; 
                      for(i=0;i                         for(j=0;j<10;j++); 
                   } 

void delay1(unsigned int t) 

unsigned int i; 
for(i=0;i//for(j=0;j<10;j++) 


//************主函数************************************** 
void main(void) 
     { 
     unsigned int e;  
     initinal(); //调用LCD字库初始化程序  
     delay(10);            //大于100uS的延时程序 
     lcd_mesg(IC_DAT);      //显示中文汉字1     
         while(1) 
        { 
          e=keyscan();   //键盘扫描值 
          lcd_wxs1(data1[e]); 
        } 
      } 

//************结 束****************************************** 


推荐阅读

史海拾趣

G24 Innovations公司的发展小趣事

远阳(FLYOUNG)公司创立于21世纪初,正值中国电子行业快速发展的黄金时期。公司创始人李先生,凭借在电子行业多年的技术积累和敏锐的市场洞察力,决定创立一家专注于数据工程电缆研发与生产的公司。初期,远阳面临着资金短缺和技术瓶颈的双重挑战。但李先生带领团队夜以继日地研发,终于成功推出了首款高性能HDMI线,其卓越的品质迅速赢得了市场的认可。这一技术创新不仅为公司赢得了第一批忠实客户,也为远阳后续的技术发展奠定了坚实基础。

ATP [ATP Electronics]公司的发展小趣事

ATP Electronics自创立之初,便以技术创新为核心竞争力。公司特有的SIP(Systems-In-Package:系统级封装)技术,在闪存卡制造领域引起了革命性的变革。通过SIP技术,ATP成功研发出超大容量的闪存卡,不仅满足了市场对于高性能存储的需求,也确立了公司在闪存卡市场的领先地位。这一技术的突破,为ATP带来了大量的订单和市场份额,奠定了公司持续发展的基础。

EUDYNA公司的发展小趣事

在光通信领域,EUDYNA凭借其10Gb/s速率的光调制集成DFB激光器模块,取得了重要突破。这款模块采用了先进的封装技术和内置光学隔离器,确保了信号的稳定性和可靠性。EUDYNA的这一创新,不仅提高了光通信的传输速度和效率,也为整个行业树立了新的标杆。

ACEINNA公司的发展小趣事

在电子行业,产品质量是企业生存和发展的基石。EUDYNA深知这一点,因此对每一件产品都进行严格的测试和检验。公司建立了完善的质量管理体系,从原材料采购到生产过程中的每一个环节都进行严格把控。这种对质量的坚守不仅赢得了客户的信赖和好评,也为EUDYNA赢得了良好的口碑和声誉。

Aerovox Corporation公司的发展小趣事

在2004年,电子行业的两大巨头FUJITSU富士通与SUMITOMO住友电气工业宣布合并,成立了EUDYNA半导体有限公司。这一合并不仅是两家公司资源的整合,更是技术力量的融合。EUDYNA自诞生之日起,就承载着推动半导体行业创新的重任。通过不断研发,EUDYNA在光波、微波器件领域逐渐崭露头角,成为全球客户的信赖之选。

Electro-Films Inc Semi-Films Div公司的发展小趣事

在20世纪80年代初,Electro-Films Inc. 的创始人意识到了电子行业中对高性能薄膜材料的需求日益增加。因此,公司决定成立一个专门负责薄膜材料研发的部门,即Semi-Films Division。这个部门在成立之初就面临着巨大的挑战,但团队凭借对技术的执着追求和不懈努力,成功开发出了具有优良电气性能和机械性能的薄膜产品,为公司赢得了首批客户。

问答坊 | AI 解惑

手机发射功率

手机发射功率 手机发射功率的两个方面 手机发射功率在PHS、GSM、cdma2000 1x、wcdma等协议中,被设计得越来越复杂,它的重要性已不言而喻,哪手机发射功率是大些好哪,还是小些好哪?事实上单纯的说大些好或者小些好,都实在不是一个明智的 ...…

查看全部问答>

弱问,插入u盘后再开机无法识别u盘的问题

开机后插入u盘能够识别,但是先插u盘再开机在“我的设备”里看不见u盘。我用的是arm 系统是wince5.0 应该怎么解决? 刚查了下但没什么头绪,麻烦大家赐教,详细说下,谢谢!!…

查看全部问答>

怎样识别串口

我在做一个PDA识别蓝牙串口,EVC编译 和VC差不多的 我用了个CSerialPortEx类 用InitPort(this, i )可以识别出蓝牙串口(PDA是串口8)但是同时也识别出了几个不可用串口, 这我就不明白了 怎么分辨出那个就是蓝牙串口呢?谢谢啦 CSerialPortEx ...…

查看全部问答>

想买块 ARM9 开发板,请给点建议

如题,要求稳定,带屏,最好有技术支持…… 谢谢各位了,请踊跃建言!…

查看全部问答>

CC2520+MSP430和CC2530

设计无线传感器网络,CC2520+MSP430和CC2530这两种方案的对比?各个的优缺点?求坛里的大神指点指点…

查看全部问答>

linux-arm开发环境简单配置

关于linux-arm开发环境简单配置是ARM学习的第一步,很多初学者会在这问题上纠结很久都不能配置好开发环境。推荐大家看一下韦东山视频,讲得很详细,代码基本上都会给你解释(很多视频都不会给你解释),适合初学者。 fedora8开发环境简单配置 lin ...…

查看全部问答>

新手的Altera的PLL及工程问题

各位大侠,小弟刚入手FPGA,请大家多多指教。我想使能Altera cyclone II的PLL,但根据官方的文档,只找到用原理图方式实现,做了测试,也没问题,现在的问题有两个:1- Altera cyclone II能否用VHDL方式来实现PLL功能?2- 如何在Quartus里, ...…

查看全部问答>

摸索MSP430FR5739+TMP275

最近用MSP430FR5739来读TMP275直接用MSP430FR573x, MSP430FR572x C Code Examples (IAR and CCS) (Rev. B)\\slac491b\\MSP430FR57xx Code Examples\\C下面的MSP430FR57xx_uscib0_i2c_10.c,可以直接读出温度值不过,是没有对TMP275配置的等完成了再 ...…

查看全部问答>

RT-Thread 1.1.0 RC 版本发布

原计划在2012年9月30日发布的 RT-Thread 1.1.0 Beta2 版本变更为 RT-Thread 1.1.0 RC 现在发布了。 RC 版本的发布意味着离 RT-Thread 1.1.0 正式版的发布已经不远了,在RC版本之后,将不再有新功能加入。欢迎大家测试,让我们一起迎接 RT-Thread 1 ...…

查看全部问答>