找回密码
 注册
关于网站域名变更的通知
查看: 772|回复: 2
打印 上一主题 下一主题

单片机红外遥控器解码实验 C语言和汇编2个版本的程序都有

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-27 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机红外遥控器解码实验 C语言和汇编2个版本的程序都有

4 d- }0 z6 j* M9 H8 B; h1 d
9 v* B0 t) r3 t

; F8 t" Y  X9 L
注:- V7 E+ c& U4 u/ v
每个EXP实验的文件夹下文件夹分别是P_ASM、P_EMULATOR_C,P_PROTEUS_C,P_EMULATOR_ASM。9 S- E# n1 ?/ t
P_PROTEUS_ASM        为PROTEUS汇编实例工程
  [- Q1 N2 F3 r" _' @P_PROTEUS_C        为PROTEUS C51仿真实例工程
1 E& b! O9 R% p( o+ _, CP_EMULATOR_C        为硬件仿真器(可选配件)C51实例工程9 w7 Q/ m* u7 w* a! N9 W
P_EMULATOR_ASM        为硬件仿真器汇编实例工程; W' M# w! e* _" o
一般情况下P_PROTEUS_ASM,P_PROTEUS_C和P_EMULATOR_C和P_EMULATOR_ASM都支持ISP下载脱机运行# Q( u* H+ W; u" }& e$ A

2 }2 ~- S. p* V& s3 MP_ISP_C,P_ISP_ASM为ISP下载脱机运行实例。比如看门狗实验,仿真器不支持,因为复位信号被仿真器接管,所以就只能做硬件脱机实验,通过ISP下载程序。" y4 W/ Z/ H$ ?3 f3 T( k: _' ]

. s7 j$ M# p9 }! j3 h- |如果文件夹带有(缺省)说明暂时没有提供此程序,可根据需要再添加。
- q' |6 l. K  ^% r4 [: f 7 z7 B6 o: e, W4 a

& L3 S# t! A8 X% S; P% ]汇编和c的代码都有很全面.
$ k7 e, W$ u' v: ~& L1 V( ~8 s6 I' F" i0 l& N2 |
c语言程序:: ^9 k; ~. {, g+ E& @' f

5 s, E$ _1 {/ E' r
/*************************************************  
! B+ p: A4 g+ c6 ~: W: _: L1 C, p*文件名称: main.c
: {9 z% L4 R5 X1 J8 l*作 者:   
9 |+ q' M2 A2 f$ [0 ^! [8 x*版 本:    V1.004 q0 X7 m" G/ J! P0 H3 A. _5 a3 L
*说 明:    红外遥控器解码实验1 h, O& q  E; v8 x$ Y% n0 j
*修改记录:  
' I/ S$ r. C6 r' p1 y) S--------------------------------------------------/ S0 Q- [# N, `  q3 q2 N7 G
*Descriptoon:
! F7 k( |; A8 t. [' a8 }% A*接线说明:P32-红外接收,P25-RS,P26-RW,P27-EN,+ u6 t$ _* I5 R& J5 t: Y& \
           P00~P07-DB0~DB7                 0 H/ m. w+ N. ?. u2 u+ r6 _
**************************************************/                        
6 c; j5 V2 j1 q  W/ ~9 o, Y" U; ?7 D7 W/ e) Z$ h
#include <reg52.h>6 X( n) h5 s  ^' t2 @: ^
1 X0 }% H" U& @/ H$ q+ o4 y$ O
#define uchar unsigned char4 ?+ @) a& m8 y5 ^
#define uint unsigned int# k9 [/ k. ]5 g4 M# X
//char code SST516[3] _at_ 0x003b;
% x* q3 _2 ?; g# k* @9 l+ ?#define c(x)(x*110592/120000) //晶振11.05922 ^3 r# T) L! w$ C
, }" T5 ]+ G2 `% s) R
uchar Lcd_Buf[4];             //显示数据缓冲区         . }; m+ W" P# f* K. k
unsigned char Ir_Buf[4];      //用于保存解码结果
+ H3 Q" I2 I1 L% z0 xsbit Ir_Pin=P3^2;             //红外线数据接口5 a; r4 l: [3 M  D7 U" M" b" y
sbit rs=P2^0;                     //LCD数据命令端( c6 @/ R/ [7 i9 |
sbit rw=P2^1;                          //读写接口
0 n, k* z# A+ C$ j! Zsbit lcde=P2^2;                          //使能接口
1 H1 x# S" X4 n0 S, X3 [7 u% fuchar code table[]=" WWW#WINDWAY$CN ";//LCD显示数据" R- P" T$ B  }2 i( Q
uchar code table1[]="Wait for IR in..";
; \% d1 a( K' T1 [4 }uchar code table2[]="  IR DATA...";, U/ n3 `$ a9 \, Q9 P: @
* w4 C/ f3 \  S
           unsigned char code Led_Tab[]={, ^5 s9 s& F& f' z1 g) O
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,6 W! U- I$ W8 r% k, f
        0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};   //共阳极数码显示码0-F
1 Y! d$ H0 `# B. ]: Eunsigned char code Led_Sel[]={0xf,0xf,0xb,0x7}; //数码管位选,屏蔽前两位/ ?0 e9 W/ L/ V% [% k2 A' T
unsigned char Led_Buf[4]; //显示缓冲区$ {# v' ?9 ~# V, f0 B
char Led_Index;           //定义位选         : l! ]5 V( B' ]- ^/ Y
unsigned char Ir_Buf[4];  //用于保存解码结果, B* [5 g8 [) s) b; `
' P+ i. ?  R1 u; n; C5 E
sbit LCD_E = P2^7;" d" N" Y- p- [* A( v
//========1MS延时====================================4 j2 E+ e7 d& c* ?0 Q
void delay(uint z)% D/ f; N, x1 W- o
{, X/ z8 s$ J' |" I
        uint x,y;0 U3 \4 h( K( K
        for(x=z;x>0;x--)
, A( g, O6 s* M" ]% \0 z4 Y% r* j                for(y=113;y>0;y--);- {- H' I1 R) |3 e8 n) K7 a
}, U& s# z0 S+ ]# O- v* u9 |
//======LCD写命令=====
: t, \% N! z! l9 d6 Xvoid write_com(uchar com)$ R  p: N! J9 D; d0 [; |) L: Y7 Y
{
0 k( T  L$ _/ b/ ]( K* h9 t        rs=0;
$ i( }! Y+ ]. E, W$ W* @        lcde=0;
& r7 [0 z9 Y$ \( d2 ?2 _, h2 t' R        P0=com;
1 g# F8 `: u& p1 I: s4 e; n0 Z9 G        lcde=1;
9 P% \5 f6 u, j' i4 c2 s        delay(1);//延时1MS跳过忙信号9 b5 w' L3 A$ M
        lcde=0;' C& [% O0 {5 E( j
        delay(1);# w. R1 s0 m9 C
}. p8 |" r/ i" [- L
//======LCD写数据=====================================
+ C5 T8 M4 l0 F0 j0 Ivoid write_date(uchar date). r( U3 p! n' O/ N
{
; a4 u/ S' d% s0 X7 g        rs=1;
0 c6 C! G7 k" u        lcde=0;
0 @, s; I6 Z2 F1 G        P0=date;' A9 C; r! w. u/ a
        lcde=1;
; i; X! S4 K5 Y1 w& }        delay(1);: y! t8 f0 [: @& E: K; ?( w0 f" m
        lcde=0;
. g; Q+ d( B( m- W  S7 U        delay(1);4 ~( T* r$ v& M! Q, s
}" U! h' ~( E' q" v( `4 F6 o" z
//=====初始化函数=====================================4 Y0 F- ~2 D1 u/ b3 w5 O/ Q
void init()
/ i5 A4 d& p) S8 {; u4 ^{        
$ q0 Z8 d) r6 r: c' c0 t; b6 f        uchar num;
2 s/ U7 J( k/ @4 L+ E! ~        rw=0;                //允许LCD写' k* }4 O8 F7 ?* O/ ^; ~
        lcde=0;7 p" h4 J* ]2 F) ~# h  G' _
        write_com(0x38);//显示模式设置                                                         
5 q/ y- i5 U* X) S5 ]+ P        write_com(0x0c);//显示开及光标设置
; D  G. R3 A+ z  v) v        write_com(0x06);//显示光标移动设置: r- I3 l: L  a3 {
        write_com(0x01);//清屏
7 k7 f/ i  H3 [( I, G2 l        write_com(0x80);//显示首地址
3 W4 w- }+ G" M5 M) W# c        for(num=0;num<15;num++)//显示第一行
2 A' F" T+ `, J4 a4 T        {$ v9 D1 M. L% |
                write_date(table[num]);+ R' a; {6 F6 R0 N: X. E6 ~2 d
                delay(1);: X  c" }* Q% w/ C3 i- n" [
        }
- R* r6 J- C- `: }1 B% S8 s        write_com(0x80+0x40);//显示第二行; h2 ^! @$ @  i: S! D1 A
        for(num=0;num<16;num++)" p$ z  q2 p1 f
        {/ K9 ]% \8 b5 ]: q
                write_date(table1[num]);
; T' U/ X. q& I6 ?2 X2 C                delay(1);
- a& \# \6 c9 x9 U. l, E        }$ n) v& |5 r5 D' m4 z( k
        TMOD=0x10;                //设置定时器0、1工作模式为1; a: R7 Q# Y) M: s; F
}* T. @1 h# t2 {
//=====显示解码========================================
% u( y1 \7 k* Bvoid write_ir(uchar date)# a0 o3 F1 P* ^
{
, z1 @) V6 K; ^9 N6 Z# T2 T2 S        uchar tmp, num,ff;          5 s) P- ~' \8 p$ R& h# i, U

& g- l2 }& T7 p" F* t$ T        if(ff==0)8 ?  `- v$ m3 c% g6 P0 G/ u: i, W
        {/ Y% [  s$ Z. x: ^! x
                ff++;
8 g8 W/ L. d: i3 P. k2 g% @. c                write_com(0x01);
- f: {" {4 h2 a' z0 w! N                write_com(0x80);
  v7 `0 J& m# x3 k: E2 s                for(num=0;num<12;num++)
; c1 t, k6 L, k7 z                {; I  w, i* b: s% H
                        write_date(table2[num]);
5 \  v+ }) s. `% f6 k                        delay(1);2 M9 Q5 Q$ O! p7 S4 I; h/ ?
                }                 - C. ?  K9 K: x1 Y
        }
5 y5 W9 [& e3 F) y% D
, x' h  H+ J) J$ s$ C) H7 Q        write_com(0xC0+6);//定位在第二行第六位" J6 d% }% `" m$ S- r
        tmp = date>>4;                        // 高四位         
0 ?# Q* m$ L, R        write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);
! q' t2 c7 h, c$ B1 i# d- c* i        write_com(0xC0+7);//定位第二行第七位           
' ^+ B6 s- ~+ N2 A2 T3 {        tmp = date&0x0F;                        // 低四位
5 X" e: ^* S. i, u        write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);         3 Q: v9 i. u" n+ o7 ^9 ^$ T/ m0 M
- W) t1 T8 V* F" b7 G
}
1 o' v- H8 I3 M8 z//======================================================
) g' D4 I1 w1 y* n0 V: f7 ^7 \//解码取回低电平
6 j3 G% `# Y; tunsigned int Ir_Get_Low()1 R: z8 R" F8 H8 x
{% h4 _' H3 k/ N' d% w
        TL1=0;
! W& K, S, M( P8 t8 W        TH1=0;
1 w0 I: f. M" B7 m: B' W% S        TR1=1;
# ^7 Y! V' c& ~; A* \* n- D7 [        while(!Ir_Pin && (TH1&0x80)==0);   //等待低电平到来              
! M& ?' c) z& a& F        TR1=0;           ' A' @7 i7 Q, p( p! O: ]" T) H5 Q
        return TH1*256+TL1;//提取低电平时间间隔时长6 Z/ c& Z4 ?  t% i1 c0 r$ ]3 l# r, `
}
/ I; h, l- k1 Q! o//======================================================
8 L& O% O! Y: L. ]) u1 C//解码取回高电平========================================: o+ }. x# i7 q) a! }, e. H0 f4 O
unsigned int Ir_Get_High()
) D8 J  q- ?9 k5 g- H4 O{
. i* C4 R3 i# I! i9 @# I( `        TL1=0;5 |7 V  }) D) O* k: Z
        TH1=0;
: o; o9 T! T# p        TR1=1;
  ~4 `0 s' v/ \2 i! R2 j2 P5 V        while(Ir_Pin && (TH1&0x80)==0);//等待高电平到来
8 ?( h3 s: V6 F: n9 E2 }9 g: I; i' S6 U        TR1=0;- l  k* E: j6 ]( H. @2 j
        return TH1*256+TL1;//提取高电平时间间隔时长
. l$ T3 y; q6 G  i8 m/ U9 [$ [}
5 O1 I5 G' n* E//======================================================
5 [/ v, u; g# g' k' r1 Z//======================================================4 U3 r5 |. F6 z: w! Q1 N
; ]+ s% F2 e) ^4 o) |
void main()8 e8 h) I5 m9 F# K$ z
{" {$ @  _: N3 n, ]( Q* {
        unsigned int temp;" o( x1 k0 e1 Z! ?: ^5 n- Q8 N$ V8 T
        char i,j;# ?' X! ?8 p! q& X1 f" |+ }+ u
        init();        //初始化: ?3 q  x  G! ^4 y# q# _) `* B* j
//=====用do做循环,等待遥控按键=========================) U- Q2 y9 C1 E; y
        do{
! w9 I3 Z" y( ~( |* `restart:) \& K  ?* ]/ @) a0 W
                while(Ir_Pin) ;//等待低电平
! G( \2 ^$ k5 }/ ~9 l' Z1 e5 I, H) S. [
                temp=Ir_Get_Low();//把低电平附给变量  e6 @5 e; B" f+ L2 a
                if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平等待9000us
! Q0 a; f& O2 l. d; M                temp=Ir_Get_High();//把高电平附给变量
8 v. a5 T/ F  k, V. ^% S& R3 W                if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平等待4500us6 S- X& |$ V: m
                //连续读出32个字节
% ?4 o* Z2 x; ?2 |# N                for(i=0;i<4;i++) //4个字节6 [( B  B! j1 w
                {) {) U( m" Z( ^$ l. c# x) W' B5 Q
                        for(j=0;j<8;j++) //每个字节8位" B, u6 G  _& Z
                        {
' n& D# N% Z. k6 z                                temp=Ir_Get_Low();7 ^+ W$ g* x( g5 U5 X* n! }" f
                                if(temp<c(200) || temp>c(800)) goto restart;//等待560us跳过低电平
4 i1 }* o& ]) \+ |3 x& F                                temp=Ir_Get_High();$ C. U  o# E6 }& R% ^$ p8 C! P4 N
                                if(temp<c(200) || temp>c(2000)) goto restart;//等待1000us跳过高电平
. O8 Y: q/ v/ |/ b' e                                Ir_Buf>>=1;//把电平移进数组
- q4 j4 |0 z0 D% O+ W; M4 v, G+ x7 |; u. o$ T1 d

) _5 Y, D1 `" [: _7 Z…………限于本文篇幅 余下代码请从论坛下载附件…………: W) {$ g* j9 u

$ S, u, R. ^' `1 N" q1 e汇编语言:& c  W4 L* |- d6 D5 E5 i' a: l
& B, z5 X* i9 d8 @' [8 \
; ?4 \% n- B% j# z) P. j) t1 Y
;-----------------------------------------------5 Q2 \0 ?4 t, T% Z, K9 H# x
       IRCOM  EQU  20H       ;20H-23H IR使用0 Y! B* r; k7 M, Y4 V9 [# |" ?
        X     EQU  26H       ;LCD 地址变量/ F, N3 g; o+ K

3 C, [4 p2 B) S- U! C& P% o: d4 I       IRIN   EQU  P3.23 S6 J" A0 q0 l+ L" h3 a5 @
;       BEEP   EQU  P3.73 w" _' s- `' i# [) A# q' R9 @" c
;       RELAY  EQU  P1.0
' {) c: o: I( T' z/ T) h8 G2 O" Y* P8 j
        RS    EQU  P2.0
2 [( Q1 p. k0 M) w. R        RW    EQU  P2.1" \" Z4 P9 H4 N1 D* h$ Y
        EN    EQU  P2.2
/ l8 B, B& X9 L7 v9 U& _5 P;------------------------------------------------9 D$ k- s4 C& e4 Z
         ORG 0000H: |3 T% S; p& l2 Z
         JMP  MAIN
/ K3 s9 t) x' J$ O! r( M;------------------------------------------------5 w0 Y/ V2 j2 l
          ORG 0100H4 y; N$ t5 B  j8 Z1 `1 e- [5 [
MAIN:
; w; v5 m+ U# y, _" B' K( Q6 F8 H# z          MOV   SP,#40H
# f/ X; Q4 Z) n! C9 W; _          MOV   A,#00H
) x! w$ j5 h4 j& B          MOV   R0,#20H& v' k2 z2 l: ]$ h) J6 A: k
LOOP0:    MOV   @R0,A          ;20H-26H清零
  L/ K$ K0 d1 E5 ?' U* Z' E* q          INC   R0
5 t, l5 V' Y* h' _0 n# I3 D          CJNE  R0,#27H,LOOP0% N3 M" {& ^# p! {
          SETB  IRIN# O- _9 v; @  i: ^) W5 {
          CALL  SET_LCD
5 R4 m3 t4 N4 g6 b; E) A7 M          CALL  MENU1" u4 p" j, [! f& s+ L7 ^1 Q. {
LOOP1:
, F2 J) h; T. F9 y; p          CALL  IR_IN7 e0 d* @. Y0 E; ^* [
          CALL  IR_SHOW
7 j6 H( Q& u( `0 o8 j" C8 y2 \. u4 W0 m+ e! c  m; s5 \( Z
;          MOV  A,22H
' B. V3 K4 V' @; _- }7 ]/ Z;          CJNE  A,#40H,LOOP2    ;K17键按下4 g' n( Z: S1 _6 ]; d
;          CLR   RELAY           ;继电器吸合
* A2 R! X- k: S+ i0 V;LOOP2:    CJNE  A,#04H,LOOP3    ;K19键按下( G+ z% h8 {* L* Q/ Z" U. W
;          SETB  RELAY           ;继电器关闭
+ E; i; H. b- d% P- {;LOOP3:   
. w" I+ h+ g7 S6 j- P           JMP   LOOP1
% V2 s% Y' S. S3 z7 e* s' d. r# g( ]; C8 c6 V5 d' f
;-----------------------------------------------------
2 \8 T$ M1 c, c# ~' u1 I7 Y. w;  LCD 初始化设置
' d, |) a+ f  Y* x, H! m( D+ d" E;-----------------------------------------------------* H4 d1 K  J8 C7 ?% ^$ M" @; f) n
SET_LCD:
  C5 {* t2 y% N3 J          CLR  EN
9 j, R0 b$ W' s+ V  m' J          CALL  INIT_LCD     ;初始化 LCD8 {* _! U8 ?: b/ T1 z+ k. _
          CALL  DELAY1
! O4 L4 H& U6 G# }; k' T- ?6 L* U          MOV  DPTR,#INFO1   ;指针指到显示信息1. ]) B+ |! I, F; d/ D% s
          MOV  A,#1          ;显示在第一行
5 D8 B) v/ h. _8 Z" A          CALL  LCD_SHOW- {( R6 Z' k& Z$ A, t4 n
          MOV  DPTR,#INFO2   ;指针指到显示信息2
" b3 b6 o( n( X7 M          MOV  A,#2          ;显示在第二行9 d" L: ]2 e! Y3 d0 }+ p  t/ T8 E
          CALL  LCD_SHOW2 k4 N5 y1 _, C" O
          RET& W2 A% d! U* P" s2 o
;-----------------------------------------------------' Y' O6 ]/ B% v
INIT_LCD:                 ;8位I/O控制 LCD 接口初始化
) p0 ~) e/ v* l3 V7 J          MOV  A,#38H     ;双列显示,字形5*7点阵) g! \8 l, b. M
          CALL  WCOM( |/ c5 V( F0 T8 U
          CALL  DELAY1( Y+ p  I# T9 n+ E
          MOV  A,#38H     ;双列显示,字形5*7点阵, n/ ]& N. A7 R& A, _
          CALL  WCOM2 {8 p) G& x& [5 }* ^& l, r
          CALL  DELAY1
" v, p* `* d; |9 i" t& V1 @% R          MOV  A,#38H     ;双列显示,字形5*7点阵: g& w* e$ s9 C9 {1 I2 W
          CALL  WCOM
6 D4 V; B% z& @" k          CALL  DELAY1
: D- F4 v7 ]# }8 D1 v5 ^, }; Z! h2 f          MOV  A,#0CH     ;开显示,关光标,$ W6 e3 @+ `9 P- \1 z
          CALL  WCOM
! C! I: L. _6 l# C; I' a& P          CALL  DELAY13 \4 J/ k+ g. F0 j6 q
          MOV  A,#01H     ;清除 LCD 显示屏
, h7 c1 U( @; T" X$ M" Y          CALL  WCOM+ n% Y% c9 M( U0 m
          CALL  DELAY1
1 F! w$ _. x7 A9 ^8 c4 ^4 U, e          RET
1 v) X! i6 }( s0 ?8 P0 B4 ?3 y  n;----------------------------------------------------
& l  x" n4 j0 J* D9 [- O: yLCD_SHOW:       ;在LCD的第一行或第二行显示信息字符
1 R$ N, X+ Z, }- r% G# A
7 ~. R" `( v7 f          CJNE  A,#1,LINE2  ;判断是否为第一行
- `, d" A9 j4 t1 |1 l3 C+ S$ E  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址7 w$ R! x) Z9 ]7 x7 M* N1 V
          CALL  WCOM        ;写入命令7 A/ Y) V. o4 G0 G5 L1 s: J" Y
          CALL  CLR_LINE    ;清除该行字符数据/ U5 q( `5 d8 z' `- A7 S0 ]
          MOV  A,#80H       ;设置 LCD 的第一行地址
: v1 j; J% d& u8 P" F) D          CALL  WCOM        ;写入命令
( Z2 W& D4 c, K( i4 W8 E          JMP  FILL
! ?8 P  b& w) a- w6 w% v0 |5 a9 J* c8 p; R0 e( t% m* H
  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址
0 V. a* P" m5 S" y. u9 m          CALL  WCOM        ;写入命令/ b4 g( i# S+ V( ^  E
          CALL  CLR_LINE    ;清除该行字符数据
" K* Y0 z+ s& p. j& Y" f          MOV  A,#0C0H      ;设置 LCD 的第二行地址
4 B9 j2 N9 m8 I$ y1 G8 |" Q! ]          CALL  WCOM) ~/ e8 d( u$ h% D, o9 F8 I
  FILL:   CLR  A            ;填入字符
& O0 ~0 K& f% J' b          MOVC  A,@A+DPTR   ;由消息区取出字符
0 u/ @  k8 k/ Q          CJNE  A,#0,LC1    ;判断是否为结束码( s8 I7 f- D5 A' K/ c
          RET1 R; f) X4 h* b" S9 x
  LC1:    CALL  WDATA       ;写入数据
9 s3 }$ z$ M0 v, A          INC  DPTR         ;指针加19 l# B6 }/ b0 n) v4 C- }& W: _
          JMP  FILL         ;继续填入字符
* ~( o1 k& L: S* O+ r          RET
" _# p8 h# h: G; B3 _;---------------------------------------------------
( g& w. x" o5 D4 {7 ]. U4 jCLR_LINE:                  ;清除该行 LCD 的字符
5 ?3 ?" d) g2 P! E1 J          MOV  R0,#240 E0 Y0 }8 K/ b* R$ z5 v) `* j, C
   CL1:   MOV  A,#' '5 H" c# O1 i* I$ l
          CALL  WDATA3 x* p3 q* m0 u1 t0 Z
          DJNZ  R0,CL1
3 ]) }- B4 L# s& X5 E          RET
2 i  L1 G4 k' d5 Z0 Z. r" z;----------------------------------------------------
' [5 o: Y0 M/ k! IMENU1:                      ;LCD 显示工作菜单信息2 T: A- u2 `7 z8 r) d' c3 x5 Y2 }, }
         MOV   DPTR,#MENU2% q: v/ V& d1 a/ G& ?9 [* p  e
         MOV   A,#1         ;在第一行显示信息
8 B* L1 q' Q/ Y9 I# |2 u6 S, K         CALL  LCD_SHOW; K* _! ~. k; z# W" }; a, o6 g
         RET
, ?% N! W. n. [0 S$ Z# EMENU2:  DB  " REMOTE CONTROL ",05 p2 g* w6 T  D; \3 o
;-----------------------------------------------------: `5 {, l0 B$ s8 m, A
INFO1:  DB  "                ",0  ;LCD 第一行显示信息
2 j9 L! {' ?+ AINFO2:  DB  "  IR-CODE: --H  ",0  ;LCD 第二行显示信息" c3 P) |" b& F; c
;-----------------------------------------------------
5 e# I! l4 z" ^) R
, m# h! z  ~( ^  E* L7 h4 ]$ I" s! Z;-----------------------------------------------------3 R$ L& W! i$ \" y; }1 S
; 写指令、数据使能子程序
) O& r5 D, ]: u7 h' {/ _) p+ w;-----------------------------------------------------; M5 ?: L& L1 S; p$ d/ v' G" ^
WCOM:( L( [4 Y( }, N' W4 C2 x$ @( |( j9 w) c
          MOV  P0,A        ;写指令使能' z5 E9 r. A% G6 N: X! R- C
          CLR RS           ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
$ b* `- s$ X( l, P9 ?! L7 _          CLR RW/ M* O( Z" x/ k! F; P6 |7 B
          SETB EN7 [& q6 p% Y- M8 D
          CALL  DELAY0
3 e: \) n* }" \3 ~0 U. p" U          CLR EN
- I/ U7 c7 B% x* ?          RET: D+ o5 L, O- R; a$ L$ O; ]+ T  E
* k# ^/ |' T4 h
WDATA:
  v0 o4 t7 f4 Z; F          MOV   P0,A      ;写数据使能( m  \2 ^6 X3 o2 |& V+ S3 w6 J
          SETB  RS        ;RS=H,RW=L,D0-D7=数据,E=高脉冲
' U; E) a- n" ^% U0 I          CLR   RW. k" q7 \3 O% a6 L: A, }
          SETB  EN
1 R# }/ _$ H. t1 i          CALL  DELAY0
+ C! L7 g5 m# d7 V          CLR   EN' u! f( b$ P; Z' ]4 M1 a9 d4 L
          RET: X! A/ E7 V8 {. U; \

* _6 X7 ~  w) u. P. J% n7 Z$ hDELAY0:   MOV  R7,#250      ;延时500微秒5 O  \! c; H! W. G
          DJNZ  R7,$8 e5 a, D; F, g6 U& ]" {9 G- C
          RET. k  |8 x. H2 t0 v' {% N6 o2 z
;---------------------------------------------------
. ]; X+ y4 i; W) @/ y/ K;在 LCD 第二行显示字符
7 h+ y  S3 O1 e$ B! };A=ASC DATA, B=LINE X POS
+ h/ k8 W! U7 ?# G0 F% u6 I' W;---------------------------------------------------
# g2 Z: x) K! F$ wLCDP2:                    ;在LCD的第二行显示字符
$ S: Y' \8 e3 f2 b) L8 u         PUSH  ACC        ;
4 r% Y3 j6 t. d0 T         MOV  A,B         ;设置显示地址
# S' L: [1 n* }* g  B) [         ADD  A,#0C0H     ;设置LCD的第二行地址' y" I2 ~4 `+ o& {
         CALL  WCOM       ;写入命令3 V0 h2 l8 q% C1 V( ]- F6 u
         POP  ACC         ;由堆栈取出A
+ m4 i+ A0 p- B* \5 d0 k         CALL  WDATA      ;写入数据
$ V; C  m2 C: e; b$ a4 X5 V& \" x         RET
- q' Y/ Y8 m6 s1 i+ c;---------------------------------------------------
* J5 |9 G7 \1 j( B1 [0 N$ v; IR 译码子程序1 F$ F8 V. R9 C% \3 F8 K
;---------------------------------------------------+ ~( f& e2 x/ }# A' E5 Q3 ]! v* L
IR_IN:              
" F4 ?3 ~6 c9 l0 V1 [          MOV   R0,#IRCOM7 B# C9 c1 ^4 M9 A/ H
I1:      JNB  IRIN,I2       ;等待 IR 信号出现& I4 v  t& F' p( j5 d
          JMP  I12 l  n6 U% p) R0 [
I2:      MOV  R4,#20- w5 r$ `8 n& Y; i4 g: G7 }& z
I20:     CALL  DEL
5 s- m& J" r1 p* |3 T; g" \          DJNZ  R4,I20- t/ k% r9 n! N% _
          JB  IRIN,I1        ;确认IR信号出现
3 p* B7 A# V" e  x5 R0 ^ I21:     JB  IRIN,I3        ;等 IR 变为高电平# Q8 z' @% H3 M' K2 D3 i3 s
          CALL  DEL
/ }7 V! j1 q1 d2 V4 |5 j          JMP  I211 \. C( B' y+ n. P! x; E; y# K! `
I3:      MOV  R3,#0         ;8位数清为0
8 [- I2 ~" j4 J7 t6 Z LL:      JNB  IRIN,I4       ;等 IR 变为低电平
2 ]# {3 y  k  ]) \+ q* `. e          CALL  DEL
2 L1 u" q! |3 y% u; j1 @; j6 E: U          JMP  LL+ _; G: b7 F8 S  Q( a" K% D2 [
I4:      JB  IRIN,I5        ;等 IR 变为高电平" t' O7 B4 R% p  [$ j9 d' V5 i! T
          CALL  DEL3 w! x7 F/ Q0 q' J* \
          JMP  I4& O- k( [6 ?' I2 l% e' K' f. R# O
I5:      MOV  R2,#0         ;0.14ms 计数
7 m; y. i# d4 Z7 [6 j* O4 v L1:      CALL  DEL
0 F' m! c0 j# {) |' U          JB  IRIN, N1       ;等 IR 变为高电平+ ]8 A" l, G( h$ c. G* F
                             ;IR=0,检查R2中的计数值 ( D2 h3 Y& k$ i( F3 S- g
          MOV  A,#8" Y% [0 L/ b: f' p5 O: ~
          CLR  C
: n. f$ z' [0 M! g6 v: Y; ]          SUBB  A,R2         ;判断高低位
8 n2 Y( {" g6 n; W3 Q  H8 O- f                             ;IF C=0  BIT=0
) D" J: \1 k# O5 E6 B) z. U          MOV  A,@R0
  O- y2 P1 M, l5 c4 Q          RRC  A
6 M: G& X# k2 B0 ]/ B7 g0 ~          MOV  @R0,A         ;处理完一位' R3 M1 ^4 x: `
          INC  R3/ b! {0 y: U9 J' F1 h
          CJNE  R3,#8,LL     ;需处理完8位  
1 a1 R  x, F; U* `' [6 ]  m          MOV  R3,#0  a& G; r# W( a& U! z, r5 ~
          INC  R02 g, n8 T' I. a0 S; f; x
          CJNE  R0,#24H,LL   ;收集到4字节了- Y# O) O" Y* `5 K, Y
          JMP  OK
! M! k4 h2 d) `) v N1:      INC  R2
7 U9 L2 M4 @2 ^4 ]2 f6 f          CJNE  R2,#30,L1    ;0.14ms 计数过长则时间到自动离开3 Y+ g7 {8 a5 d( E, m+ I9 o
OK:      RET
/ T; c9 c* a( g3 E5 A. ~! }2 Q# _# d;--------------------------------------------------------------------, ~5 J  T8 x. u, z3 b
IR_SHOW:
7 h4 v+ W& N- M/ p, X          MOV A,22H
$ M8 J; S9 R9 }8 |, Y( g; k          CPL A                ;将22H取反后和23H比较
+ c. W# X1 {+ ?* L/ J5 o: S2 q          CJNE A,23H,IR_SHOW1  ;如果不等表示接收数据发生错误,放弃。
( u& W6 J5 @7 B5 c          CALL   CONV
; |2 L  l# p& ~6 {;          CALL  BEEP_BL        ;蜂鸣器鸣响表示解码成功! y) s& a1 X- ?5 w. q
IR_SHOW1: RET
7 h0 t8 e% N9 w; ^;--------------------------------------------------------------------8 l! Y. {5 _7 K9 R* [- Z
;转换为 ASCII 码并显示
1 A3 i0 A6 s6 I" q0 G;--------------------------------------------------------------------1 v+ ^5 r/ m& J1 M
CONV:( G- x$ J. \+ I1 j3 N6 T' {4 d
          MOV   X,#11        ;设置显示起始位置
# e$ V0 W& i- i- U: M5 M          MOV   A,22H2 k3 D* ~7 }$ S# d( g1 l
          ANL   A,#0F0H      ;取出高四位二进制数% x7 C# }  F; x# W7 Y
          SWAP  A            ;高四位与低四位互换
9 u* C- @/ \$ a          PUSH  ACC          ;压入堆栈
" L% u* v8 S; }          CLR   C            ;C=0
7 l" j3 ~1 K% C, v4 y          SUBB  A,#0AH       ;减10( s; e  o( M  K8 D, I2 i
          POP   ACC          ;弹出堆栈
. u2 m! p2 B( i          JC    ASCII0       ;该数小于10,转ASCII0
+ a+ \% {: {( Q; j& N          ADD   A,#07H       ;大于10的数加上37H
/ a4 O7 [8 I- LASCII0:   ADD   A,#30H       ;小于10的数加上30H8 T; D8 g+ h+ c; @2 T
          MOV   B,X
- |2 _: f4 c" C, B  p          CALL  LCDP2
( o/ [1 [% [" D. _/ W8 {0 ^; l+ v  d: {- V
          MOV   A,22H
2 X. H1 p5 @, e! }3 S          ANL   A,#0FH        ;取出低四位二进制数4 m2 u- O; v: U# J4 i* x- I
          PUSH  ACC9 K. i6 o( E5 n. X/ e4 P% a2 S
          CLR   C9 l# H$ \7 l" y/ \' U, [2 \0 x
          SUBB  A,#0AH        ;减10# d" y6 x( q5 m7 K
          POP   ACC+ ]1 [" m$ b6 T& U. A4 R
          JC    ASCII1        ;该数小于10,转ASCII00 ?1 i- @  @: u. [' i& x* `
          ADD   A,#07H        ;大于10的数加上37H) w- G/ k+ Y" v+ s2 w5 y8 T
ASCII1:   ADD   A,#30H        ;小于10的数加上30H
, |( v# P0 ^- y" |- K" Y% G7 ]" n          INC   X3 h6 W5 N$ |3 L
          MOV   B,X
7 k& k4 ~' b) w' `* L" r& W% }          CALL  LCDP2
4 M7 _, Z" f& R% i) K& H2 A          RET# r) H  n3 ?- v4 h; W5 ?  E
;--------------------------------------------------------
0 k7 {5 M: g2 J9 r  Z;蜂鸣器响一声子程序
  j/ p( ~. W7 m0 {) P* ~( e7 F;--------------------------------------------------------# t( t8 D2 `. j1 G) y/ `5 T- K
BEEP_BL:$ C# u" g' p; z# U
         MOV  R6,#100
* e, G) ]9 }9 r  BL1:   CALL  DEX12 K- h7 {* a$ f% H! Z0 `
;         CPL  BEEP
' i0 ^2 x% j; P& S8 y( j         DJNZ  R6,BL1
9 h# s& e" H$ k3 ~2 `  e         MOV  R5,#25. f' n1 w: U& w- W  E
         CALL  DELAY
  v! |5 m  z! O  B' f! n/ E         RET# i; X0 c# }% {6 m# p. R
DEX1:   MOV  R7,#180
, Q* e( b: F" {9 l0 c# O DEX2:   NOP
0 u9 }: L  Z4 M7 y         DJNZ  R7,DEX2
' f) A: M, L8 y+ B: W         RET# q( Z7 p% i. I" p& E+ K9 {
DELAY:                    ;延时R5×10MS
1 K7 D) ^5 L4 v. p         MOV  R6,#50
! b- m( k3 u8 K- B; L  i. C# K6 j  D1:    MOV  R7,#1003 ~( f  M) B* T6 J
         DJNZ  R7,$  `( _( s' o$ D/ l5 A$ I$ q3 i
         DJNZ  R6,D1
7 j% E- ^; [; k/ Z2 J' u         DJNZ  R5,DELAY
9 z% ?" U' T6 `/ T: D5 d/ R( \$ ~$ ?* h0 R7 y0 l, ^
' e7 F  V" k  u$ w' `
…………限于本文篇幅 余下代码请从论坛下载附件…………
* G- s0 e+ y! m, i5 [% c% ~
游客,如果您要查看本帖隐藏内容请回复
3 i( D0 x! Z! L* t( Z$ H1 ?8 ~

# ]# [; C$ V! H# j( [
( \, P# X$ `) r
. Z0 n3 i) W3 g" {9 M

该用户从未签到

2#
发表于 2018-11-27 10:10 | 只看该作者
厉害了 学习一下

该用户从未签到

3#
发表于 2019-1-24 15:54 | 只看该作者
看看楼主的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-29 07:32 , Processed in 0.093750 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表