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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机红外遥控器解码实验 C语言和汇编2个版本的程序都有
4 e' l% g7 R" v. R% [
1 \% t6 ^* [$ @! S, @

& N) F1 t+ L2 A0 n& E, l: d2 C- D9 H
注:
# r- B9 B" p! A! o" t$ G) ]& [. n% o每个EXP实验的文件夹下文件夹分别是P_ASM、P_EMULATOR_C,P_PROTEUS_C,P_EMULATOR_ASM。1 T3 [+ I; ~0 N/ H
P_PROTEUS_ASM        为PROTEUS汇编实例工程
0 W9 h8 L' x0 B& p; B( RP_PROTEUS_C        为PROTEUS C51仿真实例工程
( y' `- M+ |, D! u" R1 JP_EMULATOR_C        为硬件仿真器(可选配件)C51实例工程" |" @& N! ?1 H
P_EMULATOR_ASM        为硬件仿真器汇编实例工程
: Y1 T) \* a, R2 N' K一般情况下P_PROTEUS_ASM,P_PROTEUS_C和P_EMULATOR_C和P_EMULATOR_ASM都支持ISP下载脱机运行
" g* L' ^% {& g; @
) L; ?5 A! I4 h2 |P_ISP_C,P_ISP_ASM为ISP下载脱机运行实例。比如看门狗实验,仿真器不支持,因为复位信号被仿真器接管,所以就只能做硬件脱机实验,通过ISP下载程序。; u1 [9 U) j: V/ a* F5 H5 n

& ?" y$ ]5 c$ j8 v如果文件夹带有(缺省)说明暂时没有提供此程序,可根据需要再添加。$ P, f$ S% d! F* P! c& T

2 y: P! F. V% L8 k

9 R3 F- h: G: R- A8 z6 w" e汇编和c的代码都有很全面.5 k* {4 e1 W8 n  }0 K
% L2 k" Q/ ?' l+ n  Q' x+ f) F
c语言程序:5 O2 Z/ N/ H4 p3 u7 i
3 L0 Z& q8 [4 S; I: f! P
/*************************************************  1 {/ t3 y4 G% m. Y6 s
*文件名称: main.c
9 l/ N8 V- o8 @( y; y. X# p1 w2 f*作 者:    ' i% r4 U1 a, ?, d* q1 |6 y
*版 本:    V1.00! ]! p. y( ]. {. c$ [
*说 明:    红外遥控器解码实验" F5 c# A' M9 l# n  t4 R
*修改记录:  
! }' `* o% i- K0 Q! N# z( o, d--------------------------------------------------- F; @+ A- e+ O' E
*Descriptoon: ; K" Q) ~8 P( e' J- H# K
*接线说明:P32-红外接收,P25-RS,P26-RW,P27-EN,2 F1 C6 u, I( ?( Q9 u
           P00~P07-DB0~DB7                 0 _2 ]/ V2 s5 m8 |5 R
**************************************************/                        
* e1 a/ r$ E9 j1 @$ _. ?7 O3 K7 ~
' k" R7 x' p% ^. P: p) N#include <reg52.h>
' A. \. v1 P! G: O4 ^2 S2 b9 a' e2 _- }) {4 i& C# O! B" Z5 b
#define uchar unsigned char
) ~3 a: l6 D/ l" Y0 Q) y8 K7 r#define uint unsigned int
# v' c. u5 d* q0 D+ K//char code SST516[3] _at_ 0x003b;
! d; F1 H; i0 G; v#define c(x)(x*110592/120000) //晶振11.0592
) E& m* w' x8 ?) k! Q  w9 V7 c
( Z' T, e- k$ y/ C; l- b) guchar Lcd_Buf[4];             //显示数据缓冲区         8 J* c6 v: T5 v2 q! ?
unsigned char Ir_Buf[4];      //用于保存解码结果
, l" R; x4 n- z9 g6 @sbit Ir_Pin=P3^2;             //红外线数据接口% G, [' E& X/ v! u
sbit rs=P2^0;                     //LCD数据命令端
. \. ]; B5 m" S4 p8 R. L; S, g. Asbit rw=P2^1;                          //读写接口7 a& d5 d% {  O5 [( I" r8 ]
sbit lcde=P2^2;                          //使能接口8 i/ I8 {- }5 t& l  [9 I7 E
uchar code table[]=" WWW#WINDWAY$CN ";//LCD显示数据
/ w+ A: Z5 i1 [  {% ^uchar code table1[]="Wait for IR in..";
2 M" G3 c, q) X! v, N8 |& Q7 O$ @, {6 a* U. muchar code table2[]="  IR DATA...";( q* E8 x0 P+ L3 B/ X' }
/ i' A6 l+ i/ t1 A( ?, p
           unsigned char code Led_Tab[]={( e6 D6 y! I' X5 L9 p) l
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,* V" [  P; M; m
        0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};   //共阳极数码显示码0-F
& N4 L+ Y. F4 k& c: [5 bunsigned char code Led_Sel[]={0xf,0xf,0xb,0x7}; //数码管位选,屏蔽前两位
9 J# Z6 l7 N: x9 B+ eunsigned char Led_Buf[4]; //显示缓冲区
" V! s  |# Q: W) E; w4 {9 @char Led_Index;           //定义位选         
! F& x: v, }% O, Gunsigned char Ir_Buf[4];  //用于保存解码结果+ ?8 J; f# ?& _( y% X

9 `5 R7 t8 C# i# J0 Y, @; h6 xsbit LCD_E = P2^7;
5 g0 k* v4 @4 M* R) s. f( T4 b//========1MS延时====================================
% r9 Z8 C3 e5 b0 E8 Evoid delay(uint z)) e3 Z, q2 ]4 q. u+ _+ g! c
{7 U  h! C9 ~7 h) ~6 Z6 y) E
        uint x,y;
: Q! a5 p6 }2 |% u! |' U        for(x=z;x>0;x--)
' u( g/ |# M  m- Y# N( Z                for(y=113;y>0;y--);+ b3 i" h0 [! l/ l! i
}8 e! S2 G2 G  c$ r, E* |8 k- o
//======LCD写命令=====
3 H% N' u  F* c7 wvoid write_com(uchar com)& ^7 G: x3 G2 f- E# l# }! X
{
* u% [) U+ |% T: z9 S; v5 z        rs=0;3 t/ C" r$ @$ D$ V5 Q# v/ p  R
        lcde=0;* |# @% c$ m  W5 o* \
        P0=com;  U% v* J: \' I2 g9 d
        lcde=1;0 t/ i: ?) R* d6 g
        delay(1);//延时1MS跳过忙信号+ k9 ?- r! }  K! J( n& K
        lcde=0;
$ g5 {: [  S- K/ r- [, u        delay(1);
5 m$ W9 R1 V" v2 s}
$ z8 Y- \1 w7 j6 r( V//======LCD写数据=====================================
  n  Z+ i& b6 c! i4 h# Gvoid write_date(uchar date)
  x* H9 `3 w$ F( b1 e1 y9 h{, p8 H' y( G$ U. o3 r, @
        rs=1;
$ S' n. l. q4 L  d        lcde=0;+ i1 G! A9 O) v) I1 v7 w7 N" m$ Q
        P0=date;
/ e0 L+ A, ]2 D; [+ Z        lcde=1;
1 X$ W. {1 M% i. s1 o4 e        delay(1);
6 @7 \$ E" q' m3 V2 q% R: m        lcde=0;- M. b/ ?8 N  Y) r# Q
        delay(1);7 o+ n: H) E3 l
}
3 b5 x, k$ f2 b//=====初始化函数=====================================
. j+ u* u8 S8 H6 b1 r' z* \, w) L* ivoid init()
, d9 i9 k  n: P+ I+ U{        
! z2 T% _' Z; b7 i        uchar num;5 g; j4 b1 N8 |( P% G" j* I; r
        rw=0;                //允许LCD写
/ m, U6 f" F( O/ x0 d& g& C2 k        lcde=0;* a) e) J$ e. v, w8 D, ?6 R+ |% p
        write_com(0x38);//显示模式设置                                                         
& O; S% O* j' \' G& I        write_com(0x0c);//显示开及光标设置
$ P* P7 m- M$ J+ N2 i: W        write_com(0x06);//显示光标移动设置% d! U! A- F2 k% l/ @
        write_com(0x01);//清屏! _4 J! ]' W) e
        write_com(0x80);//显示首地址7 n+ ~; c' U5 E7 L
        for(num=0;num<15;num++)//显示第一行* V) k0 R2 e0 J' j+ E! G
        {# x# f& e% Z1 h2 X
                write_date(table[num]);
) Z4 b3 E& s* h5 i                delay(1);$ P% u2 r) B# _. s6 j
        }
, [7 ?6 _' v- Y( s        write_com(0x80+0x40);//显示第二行
, ], U, Q% W# U) J. S$ ]9 B        for(num=0;num<16;num++)# F1 q/ P, O( i% n, _) ^- ?# q, r+ W
        {
; o3 t9 Y. ?; ?9 i: U                write_date(table1[num]);
+ R& J- R4 v  E- Y0 x                delay(1);
8 M" N3 O- [5 A6 y        }0 m( ^& [9 N/ }1 R, ?  I
        TMOD=0x10;                //设置定时器0、1工作模式为1
* B4 c# d4 J% D6 P# p: F: B}/ [5 {, |: V/ W( b% B2 Y( u
//=====显示解码========================================
& ?6 Y/ h! j2 Z7 p. svoid write_ir(uchar date)4 E5 S) t. F6 }0 a
{7 o1 h* m. n& {, R$ b5 p: v
        uchar tmp, num,ff;         
* y  E8 Y9 M, S$ R
3 d5 `3 ]) ?7 Q        if(ff==0)( x; ?, W  ?- e& I7 \' W
        {
2 q: _& r$ |3 c: a                ff++;, G! P' J9 M, d+ u# z. @, _- g
                write_com(0x01);& w1 i! @3 N! i$ V
                write_com(0x80);
/ z4 B0 ?" h* ~3 o7 K$ ^+ f                for(num=0;num<12;num++)" |) c  `( R" G
                {
  ^& P) Y1 U* [+ t3 @7 S9 H/ N                        write_date(table2[num]);
. R0 |- |0 F! K0 E, w                        delay(1);% L: H, Z, G: X" q9 n
                }                 2 Q$ v! k, \  ^
        }
( V3 T/ I8 i4 w' b9 \7 k
! P/ k% }3 M7 l) T4 s! B$ z, K, q, Y        write_com(0xC0+6);//定位在第二行第六位
( e6 T% p' V/ u% f( h        tmp = date>>4;                        // 高四位         
; z0 h! T' k. N$ E, H4 J        write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);
5 G  C9 [  M/ q2 W8 {        write_com(0xC0+7);//定位第二行第七位           
) r8 S3 l, N: V# `        tmp = date&0x0F;                        // 低四位
' W0 [9 r% N+ U6 G7 H        write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);         9 I! ?  m! d  N: x; P0 b

) N6 m% p' i- R- x}8 t2 n7 Y$ [5 O5 n& B
//======================================================
* ~' h& W7 ?" _/ P5 I" N//解码取回低电平
& v( X/ Z2 m9 b: s* u. }6 |unsigned int Ir_Get_Low()
! V, h0 C( H: x7 H5 X' z6 M6 b{
) O/ t6 N& w$ z" S$ s! c# W) B" L% ~        TL1=0;0 a% q0 D, x: |
        TH1=0;3 O0 ^1 L4 Q  b0 Y* X1 V
        TR1=1;
+ o' X/ Z8 C5 w! L, |        while(!Ir_Pin && (TH1&0x80)==0);   //等待低电平到来              
' X4 Y9 [% X6 a$ G( Q        TR1=0;           ; q2 [$ J  K7 l4 v  a+ F' V
        return TH1*256+TL1;//提取低电平时间间隔时长
% j1 v  E3 u2 x9 i9 \}
9 j6 V6 V( A0 d7 D/ t: O//======================================================( R3 ^9 f+ K2 |4 I/ {4 c" _
//解码取回高电平========================================0 U$ i7 S+ N0 u  p1 H: O
unsigned int Ir_Get_High()
* n! j/ F) W9 [- a; _% F2 W: r{
+ v( j  @* m0 i6 l9 e' Z8 x        TL1=0;
1 O, Q- @& g6 P1 u2 I        TH1=0;, _" P( N: X7 a; _% E% x
        TR1=1;
! {4 ^0 _" m/ h" e* z' g1 V7 @        while(Ir_Pin && (TH1&0x80)==0);//等待高电平到来
9 g  Q. R) V/ s6 ~, X9 C- a        TR1=0;1 K4 D4 X5 z; p: V
        return TH1*256+TL1;//提取高电平时间间隔时长3 d* l: x  `% N* {8 ~
}
$ q, B6 b) b% q8 X. p0 F; L# V//======================================================
5 j( B" I+ `* v/ x* L$ T//======================================================1 h9 K# w; k. I. v% J

6 h8 D6 q1 }7 H# ^) y" x. cvoid main()9 R2 o. k8 I. w" _9 C" K0 a
{
6 E" {5 M$ n4 E        unsigned int temp;
5 t5 |6 S* M8 }8 \+ |        char i,j;
  a; z0 m' W/ O3 n$ j- c        init();        //初始化+ J! j1 G7 Y" a0 |; E" D( @( s& Z
//=====用do做循环,等待遥控按键=========================  G7 V; Z/ v' d" U7 w. @- Q! J
        do{
% \! ?# S, V5 Z4 y! ]restart:
8 s- g: b2 g/ |( p& _                while(Ir_Pin) ;//等待低电平
! |# U' d5 s. W3 Z# }2 a3 g9 P- e
- z# H7 t: l& S& ^6 J" k; W* v7 K                temp=Ir_Get_Low();//把低电平附给变量
/ p, x+ L( s* J. Y                if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平等待9000us$ v; J: N4 y6 \* p) }7 `' D
                temp=Ir_Get_High();//把高电平附给变量( Q( Y7 d) j- x/ w
                if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平等待4500us
. u# I# a" h2 D" g! R1 \" z- _* F0 G                //连续读出32个字节
) q' [8 n) J* r# M4 Q9 N1 I                for(i=0;i<4;i++) //4个字节
9 h4 |5 \0 D8 M& H                {
, S8 ~1 I/ g. F3 }& U7 H                        for(j=0;j<8;j++) //每个字节8位+ s: M  ?/ u* }& r8 c- O! L
                        {7 V8 \8 X8 e! f( a5 M
                                temp=Ir_Get_Low();
: d! Y0 O$ V( k                                if(temp<c(200) || temp>c(800)) goto restart;//等待560us跳过低电平
( |# x* x; m( R- c                                temp=Ir_Get_High();( s7 N- x7 G" ~& V( r0 G2 d
                                if(temp<c(200) || temp>c(2000)) goto restart;//等待1000us跳过高电平
2 U* F8 T, W5 X, j) b                                Ir_Buf>>=1;//把电平移进数组
( D' P8 Z, A" i. J6 L/ f- R1 d8 A* B* z3 E3 q' W
' A: L# R" X) D8 A
…………限于本文篇幅 余下代码请从论坛下载附件…………
% O  U1 a- m+ G2 O# C
2 B& G# V, b9 r9 P  a9 t$ `# v汇编语言:# x& A- c+ [0 ?( i& i

* P/ q" k! }6 ?% c4 P% f/ v' z* Q8 K! z
;-----------------------------------------------: x0 m9 R" L; D( R3 s) u
       IRCOM  EQU  20H       ;20H-23H IR使用3 o# r3 L6 M$ I8 i% _: S( l
        X     EQU  26H       ;LCD 地址变量
% N8 b% m' T$ E4 W
" f7 `$ E0 }: v& }- {8 V& K       IRIN   EQU  P3.2
" E. J2 @$ N1 v; R9 _;       BEEP   EQU  P3.7
# S) e  I6 N# s& l- E( M; y;       RELAY  EQU  P1.02 d" q: k/ k( S: u/ F
% r* e# T  ?3 N4 K5 `5 \% P
        RS    EQU  P2.03 Y4 ~/ [8 }3 m( U7 R
        RW    EQU  P2.1
# V: v# T$ c2 i, h        EN    EQU  P2.2
+ w( z5 G( q, {& x. [  C;------------------------------------------------' k, ]. N3 U6 Q
         ORG 0000H
+ Z; Q& e4 W3 p6 B+ }, _         JMP  MAIN
& H4 U; `: r2 u7 ]6 }/ s# o;------------------------------------------------  z4 C% N5 o& }) Y8 h3 N
          ORG 0100H9 [8 U' [: ]% B1 j+ J- P
MAIN:: x7 ~# g4 c) W9 V5 G% F/ d- m
          MOV   SP,#40H, J) }! S4 Y( P  |1 {& c3 E8 s; z, [
          MOV   A,#00H
, H, o5 |: }* Z! M          MOV   R0,#20H$ {/ H9 P# o0 G: c: I8 ^
LOOP0:    MOV   @R0,A          ;20H-26H清零* H8 W* a( i! U
          INC   R0
; y: E8 K" _6 Y8 x0 V( z( J          CJNE  R0,#27H,LOOP0) G: u" s, F  d
          SETB  IRIN
* y3 e1 i) b4 o# q) _2 R7 n          CALL  SET_LCD% F# l7 B: J4 w
          CALL  MENU1
3 @! q' T- ^/ N/ }5 V* t# oLOOP1:4 X2 A  {' Z7 i" E  N4 o# [4 o) S3 Z
          CALL  IR_IN
; @$ b) _) p* O% t4 @          CALL  IR_SHOW
! _0 ^0 X2 ~" G* B+ r/ B- ~" j9 u( W: d
;          MOV  A,22H
7 g5 w# F7 n2 A. v. j9 F! X;          CJNE  A,#40H,LOOP2    ;K17键按下
% R4 N2 I6 i0 n2 W;          CLR   RELAY           ;继电器吸合
$ ^1 ]5 ?; Z, l" ]0 r;LOOP2:    CJNE  A,#04H,LOOP3    ;K19键按下( S* F# Q( \: b5 f8 v
;          SETB  RELAY           ;继电器关闭6 j7 D# Y  I6 B
;LOOP3:   
3 s: j; \, u3 m9 a0 A; @* i           JMP   LOOP1
# |/ k( V4 {+ s4 r! u/ p. @: Q8 [/ S, X/ d) r
;-----------------------------------------------------
2 t8 x  j7 g9 B) f2 {;  LCD 初始化设置( \: y8 u9 y' h: x4 J( f  i
;-----------------------------------------------------
& u6 ^2 d& c: d0 R# J. w) n7 USET_LCD:
0 W4 @% L" o, k! a- a. w" \          CLR  EN
% p4 t$ E7 v2 F8 I0 K3 K* W0 C' K          CALL  INIT_LCD     ;初始化 LCD- q$ `# v7 g$ [8 N+ m6 K+ x
          CALL  DELAY1
! T! G) p1 j5 `  L/ I& L* ?' f) F          MOV  DPTR,#INFO1   ;指针指到显示信息1
8 q' Z: b6 D% c/ @5 r4 U2 h  v7 y! o          MOV  A,#1          ;显示在第一行
1 T6 j! ^2 u" w. h3 ^          CALL  LCD_SHOW& c1 U/ r, Z) R
          MOV  DPTR,#INFO2   ;指针指到显示信息26 V* T+ Q; t8 ]8 Y  e1 E8 q
          MOV  A,#2          ;显示在第二行) A0 Z, P( k$ L
          CALL  LCD_SHOW
0 \7 B4 }2 U  e1 K          RET! B# F) _! T6 Z0 c5 h5 ?
;-----------------------------------------------------
0 d# L  i: \- l5 [, `. pINIT_LCD:                 ;8位I/O控制 LCD 接口初始化2 a. ]3 Z$ A, C/ F9 z8 n) n
          MOV  A,#38H     ;双列显示,字形5*7点阵
" a- \& Y' o8 V' @          CALL  WCOM
( O7 U% E" Z  F$ b          CALL  DELAY1: ^- B) X7 J( `" w. i, q' L5 x
          MOV  A,#38H     ;双列显示,字形5*7点阵# G! w" U" @2 A0 A8 O
          CALL  WCOM
6 h- p. b8 }, O, z) W- @          CALL  DELAY1! m  [3 q1 Q) j) Z2 s
          MOV  A,#38H     ;双列显示,字形5*7点阵
4 T! x: u7 K2 ~          CALL  WCOM8 g' u+ X7 s! u/ m4 h
          CALL  DELAY16 m3 k4 F2 [4 p# ~7 Q0 p
          MOV  A,#0CH     ;开显示,关光标,, Y+ ?+ k' z. T1 J) r- F- @6 A  u
          CALL  WCOM; S# `8 D: q' k& s. T- X% `
          CALL  DELAY1  d) u* ^& u8 H  e: o% ^  \. e: Y
          MOV  A,#01H     ;清除 LCD 显示屏
4 h0 e0 U0 a9 s, I, H$ J          CALL  WCOM) w( [% r3 T8 {$ ^9 c* M& o6 E; c
          CALL  DELAY15 H7 w' X# ]7 o5 G
          RET1 X# \7 C' l. N! s" n  v% e
;----------------------------------------------------. t6 A+ y4 u- Z4 q; z
LCD_SHOW:       ;在LCD的第一行或第二行显示信息字符
  M, {% E4 y% \8 X: m0 f. G
) A" C4 x& R: ]( E* e8 z) J' J& G          CJNE  A,#1,LINE2  ;判断是否为第一行  c* K# d4 ]# E1 _3 r
  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址
! `9 a6 ^, L- O* c' l5 A- g# e/ w0 i          CALL  WCOM        ;写入命令
' `+ x' L4 y. V          CALL  CLR_LINE    ;清除该行字符数据
8 i$ t. t& p% Z0 k3 S- @  v, c. z          MOV  A,#80H       ;设置 LCD 的第一行地址
" A& M0 @9 D$ F; o9 _; v          CALL  WCOM        ;写入命令- D3 V+ b7 R. L' `* A& {" k7 Q
          JMP  FILL
0 Z' J0 M9 T, ^$ }( j  l! j- p4 I- c. d2 x, I1 {
  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址
2 U" A- {% p& x6 r          CALL  WCOM        ;写入命令
& K' ~4 K7 v- \3 [$ h          CALL  CLR_LINE    ;清除该行字符数据
; Z4 W' f! q7 e8 E* I5 w          MOV  A,#0C0H      ;设置 LCD 的第二行地址
1 t$ Z, ~" v) n% K          CALL  WCOM
' T, A) ?" _, x7 K% i  FILL:   CLR  A            ;填入字符( q4 ^1 H6 @; f4 K
          MOVC  A,@A+DPTR   ;由消息区取出字符
' F8 _' W! ~5 c: c6 M          CJNE  A,#0,LC1    ;判断是否为结束码1 a* H, W3 N6 d, ~' G5 s0 U# w9 N/ w
          RET: {; E5 Z8 k  h$ d  ]. Y* e
  LC1:    CALL  WDATA       ;写入数据* L* y. O" ^" A5 `4 w# c. L
          INC  DPTR         ;指针加1; z% T0 M, m; j( d& {
          JMP  FILL         ;继续填入字符
4 P! X: h. S. t3 _) c# o8 S          RET7 j9 X; m! K4 N8 P/ V3 G, z
;---------------------------------------------------
7 n7 {# J$ i  w% {CLR_LINE:                  ;清除该行 LCD 的字符# h  j9 _  G# j3 N4 W
          MOV  R0,#24
5 y. H! k& x6 T: k9 n, D- s   CL1:   MOV  A,#' '. A4 h( b  Q5 F6 A4 }' c
          CALL  WDATA- k0 w, I+ I1 ^6 I
          DJNZ  R0,CL10 J' f% [7 G0 o' H$ h
          RET  C/ w) @' M  U. I/ M' m3 M0 Z# r
;----------------------------------------------------
- Y7 |" G) H3 n0 K. QMENU1:                      ;LCD 显示工作菜单信息- R  ~5 y! P; Z! s" E8 D
         MOV   DPTR,#MENU2
  v7 Q( N) v1 V/ G% M9 Q) `' v3 d, d5 w         MOV   A,#1         ;在第一行显示信息- X+ l, ?# S9 ?7 G" V
         CALL  LCD_SHOW! e) w1 g  v+ U* ^4 ~. `
         RET# `9 F$ s0 \# s. m- i' T# q" x
MENU2:  DB  " REMOTE CONTROL ",0
8 @& g5 k+ O; X  V) ]9 c;-----------------------------------------------------5 z  h/ A3 v  M( K' X. t: I7 @% N6 X1 L0 b
INFO1:  DB  "                ",0  ;LCD 第一行显示信息
4 l! o! [* T& |4 M# U& `INFO2:  DB  "  IR-CODE: --H  ",0  ;LCD 第二行显示信息
5 i$ U# ^* D5 W  l;-----------------------------------------------------
$ U% v9 u4 I' k1 X, @
4 |, |- B3 i; u, c3 C, P- a;-----------------------------------------------------. t1 _% L* e3 ]6 Y$ o; B: F: K
; 写指令、数据使能子程序
% g7 z! G# m5 c;-----------------------------------------------------
, Z0 W1 r0 k  n" p% gWCOM:
& f8 `9 x& {. u' a% |3 t          MOV  P0,A        ;写指令使能4 O; V: v1 l: H$ Z
          CLR RS           ;RS=L,RW=L,D0-D7=指令码,E=高脉冲) m( J7 q: x1 |7 ]8 o
          CLR RW% `2 |$ j2 N, c4 X0 h1 P. ]! j6 }
          SETB EN
. x4 |7 D0 M5 j3 H. ]$ ]2 |          CALL  DELAY0
8 Q* o' @3 M4 w' Y5 }6 l4 p          CLR EN
. t0 A! ^% n/ L3 e          RET& m+ T& ^" ?1 v; d6 h& r8 f, a' J* _

3 ~' Y) g6 h. S# f3 ?2 aWDATA:
, J! K$ e# I; T* `! V( r3 Z# `3 R          MOV   P0,A      ;写数据使能6 ]* D! l" C+ c: U  t1 [
          SETB  RS        ;RS=H,RW=L,D0-D7=数据,E=高脉冲2 i0 J  a5 V1 f" D2 e9 D
          CLR   RW, K4 N/ x, C5 k  y. x) ?
          SETB  EN& `. p! ~/ ~' i1 n; w
          CALL  DELAY01 b9 I2 {; s( V$ F
          CLR   EN1 L. ^9 ?% U" ~( u
          RET
8 r8 z; s+ g0 n  X
# O6 K! }. b9 @, t1 Y$ ?DELAY0:   MOV  R7,#250      ;延时500微秒
& H% F' h. A1 m          DJNZ  R7,$; z7 H( l( p! T# P) M& j' u% S- Q+ s
          RET
6 |! u) B) _; n3 U;---------------------------------------------------
" @" l. X* X# d) O1 d4 d1 v: f;在 LCD 第二行显示字符/ x1 y% q& _9 z6 A  e: t" ~  V
;A=ASC DATA, B=LINE X POS! b8 a  z' D2 e$ X& m# H- O
;---------------------------------------------------$ y7 Q" i" i; K; s" i$ n; M& N
LCDP2:                    ;在LCD的第二行显示字符4 f+ ~* G! {/ U1 g
         PUSH  ACC        ;
, `  s3 Q( G3 B% Y2 S4 X1 x         MOV  A,B         ;设置显示地址
2 d( {. T; H; h( A         ADD  A,#0C0H     ;设置LCD的第二行地址
1 g2 x3 s3 ]; y& u' g         CALL  WCOM       ;写入命令/ B* M# V( C+ j3 n) j: f  C, {
         POP  ACC         ;由堆栈取出A6 ~4 f9 W/ D7 i! T& @* ~
         CALL  WDATA      ;写入数据
  @/ i* N  h+ ^! A         RET
) J: C; l# }$ ]5 i# `;---------------------------------------------------
2 i0 v6 U: n5 Y+ L; IR 译码子程序" q' V1 r/ f$ ?( d: t
;---------------------------------------------------
. r- ^, ^* L8 h4 t0 \* w  sIR_IN:              
) V- ^. Q5 ?$ d, g, D; Y          MOV   R0,#IRCOM. E8 S5 ^9 P/ W# u
I1:      JNB  IRIN,I2       ;等待 IR 信号出现7 @, E: o  F+ l; L1 N: Z# P. O
          JMP  I1
. E& N: V3 n/ H( ~9 y1 H8 A) e I2:      MOV  R4,#20
" Y% u# F7 E+ L+ d. I I20:     CALL  DEL
# B6 H1 A8 L9 D3 K7 R9 V          DJNZ  R4,I20# H+ Q9 \; A+ K$ R) m  s
          JB  IRIN,I1        ;确认IR信号出现
& t5 s8 y* U0 O& ?0 V1 }" l/ O1 ~ I21:     JB  IRIN,I3        ;等 IR 变为高电平) z! U- j. x$ b; a$ S; b
          CALL  DEL
2 N6 Z6 ~  T. {          JMP  I21) e4 L  P' x+ J5 r
I3:      MOV  R3,#0         ;8位数清为0% {7 @  L: ?7 h# G3 e
LL:      JNB  IRIN,I4       ;等 IR 变为低电平7 t7 _! n* j" d+ q
          CALL  DEL5 B6 s: d9 D4 M6 ~1 @; v! N; m
          JMP  LL
6 e5 m4 }' i3 s: T I4:      JB  IRIN,I5        ;等 IR 变为高电平* M$ |* Q/ b! m3 s
          CALL  DEL$ u3 }* `9 Z2 ~( T6 J) x6 _2 i' a
          JMP  I44 J- W/ \5 E. T$ B) m1 T+ u
I5:      MOV  R2,#0         ;0.14ms 计数! T0 z% f9 B' E" W0 O+ b' X
L1:      CALL  DEL
3 q' H# \5 L: ^4 A1 J          JB  IRIN, N1       ;等 IR 变为高电平
" i- L$ }( O( r! H                             ;IR=0,检查R2中的计数值 2 w. W" G4 w- Y2 ~! n
          MOV  A,#8
, S& O" P2 |4 k  I: {6 l: T          CLR  C
* X7 `1 @$ W/ ]/ g          SUBB  A,R2         ;判断高低位
( d. S: I# M5 ^% a/ L& \                             ;IF C=0  BIT=0
$ |* `: t$ K) }/ ]+ z          MOV  A,@R04 l6 J: k6 R7 X( F: i) X
          RRC  A
" M2 V, Z; j1 n8 }          MOV  @R0,A         ;处理完一位
" y5 R0 z3 W9 t1 [1 H8 M          INC  R3# p* N5 D) I' M: D
          CJNE  R3,#8,LL     ;需处理完8位  
( c6 v2 t  P% n5 z) P          MOV  R3,#0
6 H. |* T1 Z5 P' J; w9 s          INC  R0
+ u6 P1 D9 k7 V! X          CJNE  R0,#24H,LL   ;收集到4字节了
$ r3 g4 B. H7 D0 k9 s          JMP  OK
! r+ f; i5 q8 m* C N1:      INC  R2! o" g6 A/ r9 z* x
          CJNE  R2,#30,L1    ;0.14ms 计数过长则时间到自动离开
# x# s! M* [1 Y, p3 t- s! d4 W. D5 g OK:      RET$ s" ^6 O4 Q" L8 z% K
;--------------------------------------------------------------------: c) L/ s* m  _* D5 o
IR_SHOW:* j. `9 a! m! }8 {
          MOV A,22H1 n' }, u% {1 _* f
          CPL A                ;将22H取反后和23H比较: ~3 D: n4 t6 i9 H  {
          CJNE A,23H,IR_SHOW1  ;如果不等表示接收数据发生错误,放弃。
7 @5 Z  G% O, y2 i          CALL   CONV
/ |: `% S0 y& X;          CALL  BEEP_BL        ;蜂鸣器鸣响表示解码成功, a0 w! b' ~* Z! i7 P
IR_SHOW1: RET
% |7 Y# C. ^" H- s;--------------------------------------------------------------------
; ]8 e% _+ m3 N( N& ^4 _3 \;转换为 ASCII 码并显示
  l$ b) Y& C8 c6 a. z- Y7 i;--------------------------------------------------------------------0 m( b2 n2 d3 s9 r- I$ j
CONV:+ n4 f3 y- E) C, V4 O' U4 T4 G1 s
          MOV   X,#11        ;设置显示起始位置4 a2 i1 @, P4 c3 e
          MOV   A,22H9 Z8 V: I% G& U% U0 v
          ANL   A,#0F0H      ;取出高四位二进制数9 {2 D8 E# ~+ c  K
          SWAP  A            ;高四位与低四位互换
: h6 T& A2 O$ G5 w% I          PUSH  ACC          ;压入堆栈
" b" Z- n4 Z% y  ^: ~8 J          CLR   C            ;C=0
) @7 t: `) O& I6 S# _          SUBB  A,#0AH       ;减10
0 f. g5 F7 j/ i; ]8 W& r; P' }          POP   ACC          ;弹出堆栈
8 l" a: E  x' l" j/ q          JC    ASCII0       ;该数小于10,转ASCII0
: Q3 z2 D( o2 v          ADD   A,#07H       ;大于10的数加上37H& d+ z+ F1 W2 c) B) H4 a: {4 @# |
ASCII0:   ADD   A,#30H       ;小于10的数加上30H/ m) P+ G+ Y7 t
          MOV   B,X- _2 j. C7 G4 p% g! ?
          CALL  LCDP23 a  p1 W; \" O9 J

/ i" P% {  j7 N" _4 o+ v: q          MOV   A,22H
4 m) w: I! R( }/ z: ]; B) x          ANL   A,#0FH        ;取出低四位二进制数4 \& g) n8 w4 E3 l  o& s- s
          PUSH  ACC
; e/ L0 E$ B- x$ X          CLR   C/ l: a; |2 J' q
          SUBB  A,#0AH        ;减104 b- Q: J3 n# b" c4 x# R
          POP   ACC
$ r' }7 i/ P  t+ K/ t          JC    ASCII1        ;该数小于10,转ASCII0$ E& P0 J0 K# ]1 x( r
          ADD   A,#07H        ;大于10的数加上37H
. H- U# P: r+ P( {ASCII1:   ADD   A,#30H        ;小于10的数加上30H
1 g4 j# n4 |- b' M1 d" p% e5 R          INC   X
& ^  ^$ U8 I" d$ K5 R          MOV   B,X# t# ?! V' q& l2 G. {  L7 h0 E
          CALL  LCDP2
# e- \- s: d7 E* I          RET
4 u  I2 y% u- C) _- ?/ a5 o  O/ i- m# Z& y;--------------------------------------------------------- [6 n- z# @8 U( A) b$ t
;蜂鸣器响一声子程序4 q; X7 f2 H3 b. k4 t" L7 o
;--------------------------------------------------------5 _4 z$ q! g3 \# D* ]7 C' s/ D/ _
BEEP_BL:5 F  x9 ?' B! J
         MOV  R6,#100+ U  m) Q6 n; Y/ e$ p: V
  BL1:   CALL  DEX1
; m0 b/ ~- h+ `7 Z) e; B7 g* k;         CPL  BEEP
0 `$ U" q4 ?2 a3 Y& r% |; `) O         DJNZ  R6,BL1% H- b. b% A. Y' x: T
         MOV  R5,#25' v2 u" L' q2 h
         CALL  DELAY
/ [: Q+ Q( Z; {9 B. `& S: G0 }' C         RET' C  p- m% B" w  ^' s
DEX1:   MOV  R7,#180+ S7 f# `$ G% [' b% c
DEX2:   NOP5 _2 H9 q9 w6 ?( M! K  H
         DJNZ  R7,DEX2
/ O5 F# I8 A$ y$ S, C' k+ P- u         RET* X+ {! k3 G: Q7 n; Q# ?
DELAY:                    ;延时R5×10MS4 X! j. ~) A# l+ w( w
         MOV  R6,#502 `8 U3 G9 L2 m. `, B
  D1:    MOV  R7,#100
4 y8 T1 A- x2 {+ r         DJNZ  R7,$
# A9 Q0 r* E, U4 j5 v5 `) E9 L$ ]1 \! \         DJNZ  R6,D12 X" a: i( p, f# f4 q. o, Q
         DJNZ  R5,DELAY5 X. @: `5 F7 N$ x: |% B* X9 Q
2 _' s; ^. j3 D! l- ^4 N

& R; q) }# R- Q5 B. L+ D6 T…………限于本文篇幅 余下代码请从论坛下载附件…………
+ H/ _4 C8 w8 z6 J8 a, f3 g$ s* W
游客,如果您要查看本帖隐藏内容请回复
8 J5 @3 d2 G/ C$ K" X$ F. o

1 R0 p/ |  H/ \  p  Y7 i: t
6 y* f4 W% O& ]7 D, x, [7 I
; \3 S' d8 v, q9 u, g6 Z

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-30 08:12 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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