历史上的今天
返回首页

历史上的今天

今天是:2025年01月06日(星期一)

正在发生

2018年01月06日 | lcd12864显示遥控键值读取程序

2018-01-06 来源:eefocus

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);     //显示地址 


推荐阅读

史海拾趣

安信可(Ai)公司的发展小趣事

在不断创新和突破的过程中,安信可不断推出具有创新性的产品。例如,公司推出的WiFi+BLE蓝牙二合一的Ai-WB1系列模组,凭借其高可靠度、高集成度、应用灵活、高性价比等特点,深受市场欢迎。这款产品不仅为智能设备提供了无线通信连接能力,还广泛应用于工业、商业、消费等各类市场,进一步拓展了安信可的应用领域。

蜂鸟无线公司的发展小趣事
在PWM调速电路中,需要加入过流保护、过压保护等保护措施,以防止电动机因过载而损坏。
Elpac公司的发展小趣事

Elpac公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。公司建立了完善的人才培训体系,为员工提供多样化的培训和发展机会。同时,公司还鼓励员工积极参与各种创新活动和竞赛,激发员工的创新精神和创造力。这种积极向上的企业文化吸引了大量优秀人才加入Elpac公司,为公司的持续发展提供了有力保障。

Baneasa SA公司的发展小趣事

随着国内市场的逐渐饱和,Baneasa SA开始将目光投向海外市场。公司制定了国际化的发展战略,通过在欧美等发达国家设立分支机构、参加国际展会等方式积极开拓国际市场。这些努力使得Baneasa SA的产品逐渐在国际市场上占据了一席之地,公司的业务范围也得到了进一步扩大。

Dialog Semiconductor(戴乐格半导体)公司的发展小趣事

为了进一步增强市场影响力,Dialog Semiconductor通过一系列的收购策略来扩大其业务范围。例如,在2020年,公司收购了Adesto Technologies,这是一家专注于非易失性存储器(NVM)解决方案的公司。此次收购为Dialog Semiconductor带来了近5,000家新客户,并补充了其在无线连接产品之外的有线连接解决方案。同年,Dialog Semiconductor还收购了另一家公司,获得了强大的核心IC产品组合和经验丰富的工程师团队,进一步巩固了其在IoT市场的地位。

ATC [American Technical Ceramics]公司的发展小趣事

在当今社会,绿色环保已经成为各行各业发展的重要趋势。假设ATC积极响应这一趋势,投入大量资源进行环保型陶瓷材料的研发和生产。这些材料在生产过程中产生的污染较少,同时在使用过程中也能有效降低能耗和减少废弃物排放。因此,ATC的产品在绿色环保领域获得了良好的声誉,也赢得了越来越多客户的青睐。

问答坊 | AI 解惑

对PLD进行边界扫描(JTAG)故障诊断

摘要: 结合自适应算法、CX-TB导通测试算法以及二进制计数测试序列,给出了用软件控制EPM9320LC84边界扫描链路,以输出图形并采集引脚对图形的响应,然后通过比较输出测试图形与采集测试图形的差异实现芯片I/O引脚印刷电路板故障的诊断方法。该测 ...…

查看全部问答>

(转)usb开发软件篇

文字太多,用附件发…

查看全部问答>

分享一个非常不错的上电复位欠压复位电路

这款电路我找了很久,来自最新的IEEE,其最大的特点就是复位可靠的同时静态电流为0,拿出来分享一下.希望能给大家有点帮助…

查看全部问答>

【关注】独家推出性能卓越 接口丰富的OK6410开发板

   OK6410开发板立足全面、稳定的应用需求,是专为企业级客户设计的高效、安全型产品开发平台。实 用性强是它的最大特点。OK6410可以对核心板、底板、内存、FLASH、扩展卡等部件进行灵活特配。凭借 高品质、低价格、易扩展三大顶尖特 ...…

查看全部问答>

疑问ing。。。

在自己电脑上运行debug,会对自己的电脑有影响吗?…

查看全部问答>

关于s3c2440触摸屏驱动的疑问

下面是触摸屏驱动程序(S3c2410_ts.c)中的函数stylus_action,它是IRQ_ADC的中断处理函数,但count=4时,将调用touch_timer_fire完成采样,为什么这里要用定时器来调用它?不能直接调用吗? jiffies+1的意思是下一个时钟周期执行函数吗? 采样完 ...…

查看全部问答>

谁帮我看看这个串口的部分程序 谢谢

这是串口通信程序 在书抄下来的 其中一部分是这样的  发送请求信号0xaa 等待响应0xbb          do         {                 SBUF=Send ...…

查看全部问答>

MAX813L的WDI脉冲宽度问题

在程序中的喂狗部分,对脉冲宽度由要求吗?我查的技术资料上都没有提到,所以请教一下大家…

查看全部问答>

stm32事件输出的用处是什么呢?

唤醒另一个mcu?还有就是事件到底是个什么概念呢.新手求教谢谢…

查看全部问答>

USBCustom_HID例程有Bug?LED控制部分

USB Custom_HID例程有Bug? USB库是V3.0.1的, LED控制部分反复测试一段时间,程序就无法控制LED了,仿真发现不能进入 EP1_OUT_Callback(),大家帮忙分析一下吧。 下面是进入回调函数前的中断处理代码: /*********************************** ...…

查看全部问答>