lcd12864显示遥控键值读取程序

发布者:Serendipity66最新更新时间:2018-01-06 来源: eefocus关键字:lcd12864显示  遥控键值  读取程序 手机看文章 扫描二维码
随时随地手机看文章

LCD12864显示遥控键值读取程序

#include  
#include  
     
#define uchar unsigned char 
#define uint  unsigned int


/*TS12864A-3 端口定义*/ 
#define LCD_data  P0             //数据口 
sbit LCD_RS  =  P2^0;            //寄存器选择输入  
sbit LCD_RW  =  P2^1;            //液晶读/写控制 
sbit LCD_EN  =  P2^2;            //液晶使能控制 
sbit LCD_PSB =  P2^3;            //串/并方式控制 
sbit LCD_RST =  P2^5;            //液晶复位端口 

sbit  IRIN  = P3^2;                //红外遥控 
sbit  BEEP  = P3^7;                //蜂鸣器 
sbit  RELAY = P1^3;                //继电器 

uchar code dis1[] = {"红外遥控码读取器"}; 
uchar code dis2[] = {"----------------"}; 
uchar code dis3[] = {"键值编码:- - H "}; 
uchar code dis4[] = {"键值反码:- - H "}; 

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; 
uchar IRDIS[2]; 
uchar IRCOM[4]; 
void delay0(uchar x);  //x*0.14MS 
void beep(); 
void  dataconv(); 
void lcd_pos(uchar X,uchar Y);  //确定显示位置 
/*******************************************************************/ 
/*                                                                 */ 
/*  延时函数                                                       */ 
/*                                                                 */ 
/*******************************************************************/ 
void delay(int ms) 

    while(ms--) 
    { 
      uchar i; 
      for(i=0;i<250;i++)   
       { 
        _nop_();                
        _nop_(); 
        _nop_(); 
        _nop_(); 
       } 
    } 
}         
/*******************************************************************/ 
/*                                                                 */ 
/*检查LCD忙状态                                                    */ 
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */ 
/*                                                                 */ 
/*******************************************************************/ 
bit lcd_busy() 
 {                           
    bit result; 
    LCD_RS = 0; 
    LCD_RW = 1; 
    LCD_EN = 1; 
    delayNOP(); 
    result = (bit)(P0&0x80); 
    LCD_EN = 0; 
    return(result);  
 } 
/*******************************************************************/ 
/*                                                                 */ 
/*写指令数据到LCD                                                  */ 
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */ 
/*                                                                 */ 
/*******************************************************************/ 
void lcd_wcmd(uchar cmd) 
{                           
   while(lcd_busy()); 
    LCD_RS = 0; 
    LCD_RW = 0; 
    LCD_EN = 0; 
    _nop_(); 
    _nop_();  
    P0 = cmd; 
    delayNOP(); 
    LCD_EN = 1; 
    delayNOP(); 
    LCD_EN = 0;   

/*******************************************************************/ 
/*                                                                 */ 
/*写显示数据到LCD                                                  */ 
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */ 
/*                                                                 */ 
/*******************************************************************/ 
void lcd_wdat(uchar dat) 
{                           
   while(lcd_busy()); 
    LCD_RS = 1; 
    LCD_RW = 0; 
    LCD_EN = 0; 
    P0 = dat; 
    delayNOP(); 
    LCD_EN = 1; 
    delayNOP(); 
    LCD_EN = 0;  

/*******************************************************************/ 
/*                                                                 */ 
/*  LCD初始化设定                                                  */ 
/*                                                                 */ 
/*******************************************************************/ 
void lcd_init() 
{  
    LCD_RST = 0;         //液晶复位 
    delay(30);                    
    LCD_RST = 1;       
    delay(5); 
    LCD_PSB = 1;         //并口方式 
     
    lcd_wcmd(0x34);      //扩充指令操作 
    delay(5); 
    lcd_wcmd(0x30);      //基本指令操作 
    delay(5); 
    lcd_wcmd(0x0C);      //显示开,关光标 
    delay(5); 
    lcd_wcmd(0x01);      //清除LCD的显示内容 
    delay(5); 

/*********************************************************/ 
/*                                                         */ 
/* 主程序                                                */ 
/*                                                       */ 
/*********************************************************/ 
  main() 
 { 
    uchar i; 
    IE = 0x81;                 //允许总中断中断,使能 INT0 外部中断 
    TCON = 0x01;               //触发方式为脉冲负边沿触发 
    IRIN=1;                    //I/O口初始化 
    BEEP=1; 
    RELAY=1; 

    delay(10);                 //延时 
    lcd_init();                //初始化LCD              
         
    lcd_pos(0,0);             //设置显示位置为第一行的第1个字符 
     i = 0; 
    while(dis1[i] != ’\0’) 
     {                         //显示字符 
       lcd_wdat(dis1[i]); 
       i++; 
     } 
    lcd_pos(1,0);             //设置显示位置为第二行的第1个字符 
     i = 0; 
    while(dis2[i] != ’\0’) 
     { 
       lcd_wdat(dis2[i]);      //显示字符 
       i++; 
     } 
      lcd_pos(2,0);             //设置显示位置为第三行的第1个字符 
     i = 0; 
    while(dis3[i] != ’\0’) 
     { 
       lcd_wdat(dis3[i]);      //显示字符 
       i++; 
     } 
     lcd_pos(3,0);             //设置显示位置为第四行的第1个字符 
     i = 0; 
    while(dis4[i] != ’\0’) 
     { 
       lcd_wdat(dis4[i]);      //显示字符 
       i++; 
     } 
     while(1); 

/*********************************************************/ 
/*                                                         */ 
/* INT0外部中断子程序                                     */ 
/*                                                       */ 
/*********************************************************/ 
void IR_IN() interrupt 0 using 0    

  uchar j,k,N=0; 
     EX0 = 0;    
     delay0(15); 
     if (IRIN==1)  
     { EX0 =1; 
       return; 
      }  
                         //确认IR信号出现 
  while (!IRIN)           //等IR变为高电平,跳过9ms的前导低电平信号。 
    {delay0(1);} 

 for (j=0;j<4;j++)         //收集四组数据 
 {  
  for (k=0;k<8;k++)        //每组数据有8位 
  { 
    while (IRIN);       //等IR变为低电平,跳过4.5ms的前导高电平信号。 
    while (!IRIN);      //等IR变为高电平 
    while (IRIN)        //计算IR高电平时长 
      { 
        delay0(1); 
        N++;            
       if (N>=30) 
        { EX0=1; 
          return;}            //0.14ms计数过长自动离开。 
      }                       //高电平计数完毕                 
     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0” 
     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1” 
     N=0; 
   }//end for k 
 }//end for j 
     if (IRCOM[2]!=~IRCOM[3]) 
   { EX0=1; 
     return; } 

     IRDIS[0]=IRCOM[2]&0x0F;     //取键码的低四位 
     IRDIS[1]=IRCOM[2]>>4;  //取键码的高四位,右移4次,高四位变为低四位 
     dataconv(); 
     lcd_pos(2,5);              
     lcd_wdat(IRDIS[1]);        //第一位数显示  
     lcd_pos(2,6);              
     lcd_wdat(IRDIS[0]);        //第二位数显示 

     IRDIS[0]=IRCOM[3]&0x0F;     //取键码的低四位 
     IRDIS[1]=IRCOM[3]>>4;  //取键码的高四位,右移4次,高四位变为低四位 
     dataconv(); 
     lcd_pos(3,5);              
     lcd_wdat(IRDIS[1]);        //第一位数显示  
     lcd_pos(3,6);              
     lcd_wdat(IRDIS[0]);        //第二位数显示 
     beep(); 
     EX0 = 1;  

/*********************************************************/ 
/*                                                         */ 
/* 转换为ASCII码                                         */ 
/*                                                       */ 
/*********************************************************/ 
void  dataconv()      
  { 
     uchar  t;  
     for (t=0;t<2;t++)    
     if(IRDIS[t]>9) 
      IRDIS[t]=IRDIS[t]+0x37; 
     else 
      IRDIS[t]=IRDIS[t]+0x30; 
  } 
/*********************************************************/ 
/*                                                         */ 
/* 蜂鸣器响一声子程序                                     */ 
/*                                                       */ 
/*********************************************************/ 
void beep() 

  uchar i; 
  for (i=0;i<100;i++) 
   { 
   delay0(4); 
   BEEP=!BEEP;                 //BEEP取反 
   }  
  BEEP=1;                      //关闭蜂鸣器 

/*********************************************************/ 
/*                                                         */ 
/* 延时x*0.14ms子程序                                     */ 
/*                                                       */ 
/*********************************************************/ 

void delay0(uchar x)    //x*0.14MS 

  uchar i; 
  while(x--) 
 { 
  for (i = 0; i<13; i++) {} 
 } 

/*********************************************************/ 
/*                                                       */ 
/* 设定显示位置                                          */ 
/*                                                       */ 
/*********************************************************/ 
void lcd_pos(uchar X,uchar Y) 
{                           
   uchar  pos; 
   if (X==0) 
     {X=0x80;} 
   else if (X==1) 
     {X=0x90;} 
   else if (X==2) 
     {X=0x88;} 
   else if (X==3) 
     {X=0x98;} 
   pos = X+Y ;   
   lcd_wcmd(pos);     //显示地址 


关键字:lcd12864显示  遥控键值  读取程序 引用地址:lcd12864显示遥控键值读取程序

上一篇:数字温度计程序
下一篇:利用ds18b20检测当前温度isd1420语音芯片的温度报警程序

推荐阅读最新更新时间:2024-03-16 15:51

AVR 单个DS18B20温度读取程序(可测负温度)
使用方法: 把两个文件放入工程,需要温度时调用DS18B20_ReadTemperature,返回值就是温度. DS18B20.h /****** AVR 单个DS18B20温度读取程序 ****** * 版本.........: 1.0 * 目标.........: AVR * 文件名.......: DS18B20.h * 编译器.......: IAR for AVR V5.5 *****************************************/ #ifndef __DS18B20_H__ #define __DS18B20_H__ #include #include delay.h #define
[单片机]
MSP430 单片机 HX711重量传感器接线 程序读取
#define SCK_L P4OUT &= ~BIT0 #define SCK_H P4OUT |= BIT0 #define SDA_IN (P4IN & BIT1) #define GapValue 116.18 /* 读取出的HX711为一个寄存器数值单位并不是g,除以这个GapValue值就是换算成g单位 */ unsigned long Weight_Maopi; /* 毛皮重,上电后就读取出这个变量 */ /* * 初始化HX711端口 * 3.3V供电 * 4.0接SCK * 4.1接DT * */ void init_hx711port(void) { P4DIR |=
[单片机]
MSP430 单片机 HX711重量传感器接线 <font color='red'>程序</font><font color='red'>读取</font>
用51单片机控制LCD12864显示屏源程序
12864液晶在出厂时其对比度已经调好,所以用户在使用的时候第三管脚可不用接任何东西,本实验板上为了兼容多家12864液晶所以加了液晶对比度调节电位器,若用户使用我们配套的12864液晶可不用管它,液晶的第三管脚悬空就可以。有些液晶功耗比较大,用户在使用的时候可将液晶的第19、20引脚的背光不接,这样字体会很清楚。 单片机源程序如下: /**********************BST-V51实验开发板例程************************ * 平台:BST-V51 + Keil U3 + STC89C52 * 名称: * 晶振:11.0592MHZ * 说明:免费开源,不提供源代码分析. ********
[单片机]
用51单片机控制<font color='red'>LCD12864</font><font color='red'>显示</font>屏源<font color='red'>程序</font>
单片机与控制实验(5)——重量测量并在LCD12864显示
一、实验目的和要求   掌握点阵式液晶显示屏的原理和控制方法,掌握点阵字符的显示方法。 掌握模拟/数字(A/D)转换方式, 进一步掌握使用C51语言编写程序的方法,使用C51语言编写实现重量测量的功能。 二、实验设备 单片机测控实验系统 重量测量实验板/砝码 Keil开发环境 STC-ISP程序下载工具 三、实验内容 编写C51程序,使用重量测量实验板测量标准砝码的重量,将结果(以克计)显示到液晶屏上。误差可允许的范围之间。 四、实验步骤 1. 阅读实验原理,掌握YM12864C的控制方式,编写出基本的输出命令和数据的子程序; 2. 掌握点阵字模的构成方式。使用字模软件PCtoLCD2002,设定正确的输出模式,生
[单片机]
单片机与控制实验(5)——重量测量并在<font color='red'>LCD12864</font><font color='red'>显示</font>
热门资源推荐
热门放大器推荐
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved