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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机红外遥控器解码实验 C语言和汇编2个版本的程序都有
: N  ^+ A( P, M+ V1 m1 M6 R

  w( l9 z- b/ g6 s% d
- m+ i% g9 Q2 \- b! Y$ \- a9 q  }! L- q
注:2 e$ |$ T. x! E" Z  ]2 t
每个EXP实验的文件夹下文件夹分别是P_ASM、P_EMULATOR_C,P_PROTEUS_C,P_EMULATOR_ASM。" D8 j5 D4 }9 U! \4 d. o6 F
P_PROTEUS_ASM        为PROTEUS汇编实例工程( X& g; w3 n5 ^& I" K& ?
P_PROTEUS_C        为PROTEUS C51仿真实例工程+ u3 d2 i/ a! k8 [7 h" D: u7 P
P_EMULATOR_C        为硬件仿真器(可选配件)C51实例工程
/ E" N) q  Z! y/ \P_EMULATOR_ASM        为硬件仿真器汇编实例工程2 a' i. h8 u* O" H' t$ w
一般情况下P_PROTEUS_ASM,P_PROTEUS_C和P_EMULATOR_C和P_EMULATOR_ASM都支持ISP下载脱机运行) w- X( i! Z8 `) I* x8 x! L
; R& v3 r  g5 e3 Z2 D+ H" q; @  S
P_ISP_C,P_ISP_ASM为ISP下载脱机运行实例。比如看门狗实验,仿真器不支持,因为复位信号被仿真器接管,所以就只能做硬件脱机实验,通过ISP下载程序。! z/ ?5 |4 N, B9 `2 Y
8 ?, J. W. x3 K( B, C, y9 m. H+ c
如果文件夹带有(缺省)说明暂时没有提供此程序,可根据需要再添加。. Y1 H5 j: d4 k. G  y) N  R
* F" `( [# j* b: }. Y

2 T7 t+ o6 M5 o汇编和c的代码都有很全面.
6 W8 C7 \) H: F1 I2 Q) H# [' M, X, b; g2 ]2 ?* I/ H) \; x
c语言程序:
1 S: I4 D* ^$ B& V* W
: s1 u) B3 Y. V0 g3 X/ m0 B
/*************************************************    U: F( m1 h4 Y3 G7 m
*文件名称: main.c 7 Z  ?# s) U: |1 B( W
*作 者:    . z0 m5 u9 O( m1 M5 p3 ~
*版 本:    V1.00' \  X7 m6 S  M" {
*说 明:    红外遥控器解码实验( p% c% c4 A+ d# ^
*修改记录:  * H' p) ^: a* M
--------------------------------------------------
& k( _3 K9 u- T! y*Descriptoon: " @7 F  H# k, ~8 n0 l) r
*接线说明:P32-红外接收,P25-RS,P26-RW,P27-EN,
6 x' |" d( z# _& w+ n6 ~0 w           P00~P07-DB0~DB7                 ' n& H% f1 N6 t& r
**************************************************/                        
) a8 W$ n+ f$ t+ k
* E' a9 H+ }0 t) f7 Y- l1 C0 ]#include <reg52.h>3 i7 X8 K$ E( C8 @* ]. o" N: k, I, Y
( k  {5 ^$ r) s/ g
#define uchar unsigned char; B* R/ R, j' u2 [2 `5 R9 @
#define uint unsigned int
5 W* d( O; M( _3 u//char code SST516[3] _at_ 0x003b;/ Q" Z3 U* V0 u/ D4 }
#define c(x)(x*110592/120000) //晶振11.05927 A  g- p/ n, e$ |5 h

2 J) {% @) t! n- p! N' puchar Lcd_Buf[4];             //显示数据缓冲区         
# s3 f3 {; @) c. [  \7 A7 @: j+ lunsigned char Ir_Buf[4];      //用于保存解码结果/ g; v, U  n& P* q
sbit Ir_Pin=P3^2;             //红外线数据接口- D0 L# J( S1 L: U0 n
sbit rs=P2^0;                     //LCD数据命令端3 F4 h  c' [9 s6 V- R+ Y9 w
sbit rw=P2^1;                          //读写接口2 m; O) Z: X5 u0 C9 ]
sbit lcde=P2^2;                          //使能接口
$ G) p# x  A% Auchar code table[]=" WWW#WINDWAY$CN ";//LCD显示数据
3 S1 r6 ~% x2 M+ Juchar code table1[]="Wait for IR in..";% W7 c' i3 ?, [8 q9 M7 ^
uchar code table2[]="  IR DATA...";+ C  [0 [, }( [+ j
' b& N5 T( K3 l+ ]$ g' x9 O8 G
           unsigned char code Led_Tab[]={. R5 g6 W% k$ u4 K! d7 o
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,) m+ V$ e* {1 f* k& n+ o
        0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};   //共阳极数码显示码0-F3 c2 }9 r- e/ M
unsigned char code Led_Sel[]={0xf,0xf,0xb,0x7}; //数码管位选,屏蔽前两位
  O* i& g) I4 b# sunsigned char Led_Buf[4]; //显示缓冲区$ N( U* X' E! `$ Z) [6 E. e
char Led_Index;           //定义位选         + P0 l6 h( j7 Q! b
unsigned char Ir_Buf[4];  //用于保存解码结果
/ ]" m. @) q: g2 \* ]) G* ?* d7 v9 @2 M- Z5 Z8 e
sbit LCD_E = P2^7;7 x$ d6 M1 g$ u: a" s3 X) C, r9 l- s
//========1MS延时====================================
' d1 h' d: }/ u6 @3 A( Rvoid delay(uint z)
" {- o: D/ ~/ o9 z{, E# ^7 ?1 ?* o" I
        uint x,y;
8 X- R6 x, p$ p6 j' {0 ]! o3 Y        for(x=z;x>0;x--), v& |2 s: @: q! J8 b
                for(y=113;y>0;y--);& h  P) }& ~4 r: x
}
1 b5 ?" |* ^( `2 s8 R//======LCD写命令=====
* N0 z; ^2 _- i) F( _& [void write_com(uchar com)- u; F! H" L' j+ G  w6 c! Q, }
{
( N6 @. _" |( N# z        rs=0;! g0 q2 t" s. O' v0 s* k5 p
        lcde=0;  N  v7 B& D. l
        P0=com;
8 g8 G/ |: E; q! u5 S        lcde=1;
4 i9 M4 E' G5 ]! G8 y* V& K: `. v        delay(1);//延时1MS跳过忙信号  y! M" B6 {9 _9 N7 @
        lcde=0;! W3 R# `% ^2 o! A. y
        delay(1);
# I5 N0 S$ e9 W2 j; d( m}
$ i4 Y8 p  D* x, g: i4 `4 M//======LCD写数据=====================================2 W  X1 q7 \1 L) \' C0 ]2 p
void write_date(uchar date): `2 U* h0 ]5 ~6 A$ i! H5 [$ n
{; w( S$ i0 Z* ~3 u' t- R
        rs=1;
% ^" [1 T5 q3 f+ w; Q        lcde=0;
* Q9 G6 P6 h4 w! \% v        P0=date;
' X- d* J$ o' D& H" g7 z8 ]        lcde=1;' j0 M9 @# J4 X) t
        delay(1);
8 N7 L7 U+ {5 s" X- G        lcde=0;3 X' {& ~% h; ]/ W; k& c4 Q
        delay(1);
* V+ u7 \" A  z1 d% Y4 `5 q}2 l2 d  W1 I1 x8 r* W
//=====初始化函数=====================================& u4 N4 F6 C0 U7 E& y
void init(). J2 ?+ D2 n& j/ G
{        9 U+ v8 R1 K1 u" m; y5 k
        uchar num;
; c6 w( L  ], P8 I        rw=0;                //允许LCD写9 B2 [' h+ ?/ k
        lcde=0;
1 E$ S0 o8 @# V3 d        write_com(0x38);//显示模式设置                                                          ! _: Z% j2 V) t1 u
        write_com(0x0c);//显示开及光标设置
; f) I4 E$ n. {+ ?+ @2 d        write_com(0x06);//显示光标移动设置
3 {2 b$ w7 t2 t( }  P. e' W        write_com(0x01);//清屏8 X: [% c2 X1 {4 T6 s: F
        write_com(0x80);//显示首地址
  [9 Y- \' z3 B        for(num=0;num<15;num++)//显示第一行
" C% M1 g7 k; X+ ^& A" s        {9 [& I8 h% X* D8 N1 W
                write_date(table[num]);( l, M0 A' v" {
                delay(1);. K2 Y: f7 Y' r" E4 p% S& B
        }/ ~! d3 H( v( o( D
        write_com(0x80+0x40);//显示第二行8 Z/ ]6 s3 R. G$ r. L( e( O( I! }
        for(num=0;num<16;num++)6 N2 a# T$ B) x8 N6 [; [* j& a, I
        {
! X" F0 B  V+ i! H                write_date(table1[num]);
& s& _, W1 x& t) n                delay(1);1 q, Z* T" E$ V3 c& m; M
        }. e& u$ X1 {3 s) u
        TMOD=0x10;                //设置定时器0、1工作模式为1
) B, T& s; q3 m8 Q  w" Q2 t* y! ^: k}3 S4 p' Q( C( K# P$ M6 f3 l$ k
//=====显示解码========================================' J6 ]" ?0 U( h
void write_ir(uchar date)' ?6 M% h% N1 W# \6 G; l
{
$ q5 I3 [* d6 N0 J6 [/ W( d        uchar tmp, num,ff;         
7 c. A; @* j" A( h, u
1 G- q+ P3 t0 l" ?$ M/ c        if(ff==0)1 \0 R. \  A0 J' Y! R- a
        {) o8 T( ?! C4 r. s
                ff++;
) f6 @' T" {4 J+ P1 U& x                write_com(0x01);
0 l' e+ H/ i. `                write_com(0x80);
. ^3 W8 D/ U/ g" ^) y7 c) i4 @                for(num=0;num<12;num++)$ M% F* F) c' ?% W- U
                {6 l! w9 m/ J! Q2 h; [4 ~0 f
                        write_date(table2[num]);
) z4 ?  O0 f0 W( L9 e* \                        delay(1);) E  H) L- i& Y( C
                }                 
$ A# Z! a1 W! L( r0 x        }
* Y' q3 ]( o. r5 c. O" o  S# n9 Q5 h4 b/ i& s! o2 N& }
        write_com(0xC0+6);//定位在第二行第六位: U, s) T9 Z7 Y/ c. W
        tmp = date>>4;                        // 高四位         1 i# O5 `) Q6 G+ o  D
        write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);
; s* x- y4 j% ?. e: R) [8 k# |        write_com(0xC0+7);//定位第二行第七位           ; a( w+ q* F6 q
        tmp = date&0x0F;                        // 低四位
9 Z6 i( \) r7 m        write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);         
8 S! L# ^2 {) b" {1 Y- a7 v
# T- Q$ h9 h$ ~) j( R- e}
' H# c6 z# a+ D3 @2 n+ ]7 I" E//======================================================+ }5 k, Q2 C, K: r! N) o
//解码取回低电平6 k6 f: W" E# J2 X3 q( i
unsigned int Ir_Get_Low()6 N6 T+ ~0 k. a/ k, _7 ?5 g- H& ~
{
" G$ m& W2 v8 b/ x; @6 r) t" N6 ^        TL1=0;
' G" F6 @8 I) s* T. [) S* C        TH1=0;) C# c- {$ u9 m, r0 h9 r
        TR1=1;
) t) Y3 F( x- V  e7 S        while(!Ir_Pin && (TH1&0x80)==0);   //等待低电平到来              
+ N9 x  n. [' U9 y4 w        TR1=0;           % e) t5 N) h$ X& Y, t  P
        return TH1*256+TL1;//提取低电平时间间隔时长9 j8 c: R; K8 s% M6 I# A7 `
}
6 |' {: L* o, b//======================================================6 t) K$ w" k+ c8 _
//解码取回高电平========================================' o  S, T, e& I( `" F
unsigned int Ir_Get_High()# j0 X! V% M; i7 {8 v' M
{
; D; }: ~$ z6 Q% i7 Z6 K$ D        TL1=0;, i* |" Z( {* K' u2 t: e" ?
        TH1=0;3 p5 Z+ ?# ]  s- y3 D, b) @5 x2 U  N  t3 q
        TR1=1;
5 t8 G" }# _3 [* U# e0 X7 G        while(Ir_Pin && (TH1&0x80)==0);//等待高电平到来
6 \3 Z$ e/ f4 v* U        TR1=0;
' H  c$ w4 N/ I7 c4 \        return TH1*256+TL1;//提取高电平时间间隔时长
4 U$ [& a5 l+ S}2 U' X1 M+ h5 u; y
//======================================================
# J- I7 G0 s) b//======================================================
! I% C4 {( z* l1 H8 ?
; c. I% T) r7 Ovoid main()* ]1 F, j2 O( k; R
{/ _$ i. i7 L1 H4 O! \$ v
        unsigned int temp;
  q0 J8 S' k3 p6 _8 {        char i,j;- i, a. G, o2 Z
        init();        //初始化1 u/ k' O1 p1 `% S) {
//=====用do做循环,等待遥控按键=========================
/ M/ M) M2 ~& Z/ K        do{( K& p% w1 _1 L! y5 a3 \4 l/ i
restart:
" g; F$ l/ C" B# c2 |                while(Ir_Pin) ;//等待低电平
; C0 z$ g, T/ `9 y2 k5 A3 u
0 a  D+ Z" d$ W' i                temp=Ir_Get_Low();//把低电平附给变量; d0 z: C. r' B; h8 f4 I0 ^0 h
                if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平等待9000us
; g9 t7 Q7 |/ ?) A- y9 W& q. p                temp=Ir_Get_High();//把高电平附给变量$ L8 b5 u! W+ e$ i0 Q0 z
                if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平等待4500us
- E; o9 {/ r$ H3 a3 ^  n                //连续读出32个字节8 P8 m5 Y7 J% X# L  `# i, W
                for(i=0;i<4;i++) //4个字节4 ?' M2 g/ j2 s$ s. }- G) q% n
                {
. w$ O5 @; s$ S! o; k1 ]4 }$ K                        for(j=0;j<8;j++) //每个字节8位
; d$ \8 }8 |" p8 V) W                        {
: S8 q6 e7 r7 M' y+ ?                                temp=Ir_Get_Low();
& M% O. S0 Y2 O6 r" ^& G4 S+ j' Q                                if(temp<c(200) || temp>c(800)) goto restart;//等待560us跳过低电平
) ]4 j! o$ a* a( N2 h                                temp=Ir_Get_High();, y5 f7 V0 K2 B& ~0 w
                                if(temp<c(200) || temp>c(2000)) goto restart;//等待1000us跳过高电平
9 K0 U9 O+ U# n( V                                Ir_Buf>>=1;//把电平移进数组
0 O+ A; {) T7 G: Q. }, R. x5 Q9 W* S8 r  K+ {8 ?/ M) y, E+ F

5 r4 b. ~! _" N…………限于本文篇幅 余下代码请从论坛下载附件…………6 n& ^( Z" {: x1 L# J1 ~6 `

( Y0 _: U3 {' W$ a7 @; c! Z汇编语言:; }6 Y. w/ {& H1 z- L; l
4 M: y: D8 k8 j# R" _3 B- f+ O

/ O8 M; A( ]4 r/ i;-----------------------------------------------
3 z# w8 n: u- I% R/ B9 X% y       IRCOM  EQU  20H       ;20H-23H IR使用
- e' l$ P: J) U& `        X     EQU  26H       ;LCD 地址变量( @- K% u0 d  \( x- N( u
- p& @0 K% ?( m6 p* p% d1 j
       IRIN   EQU  P3.2
" N5 X- K' h9 L" y, p8 X2 F; a;       BEEP   EQU  P3.7+ U* z2 |( O9 t( x+ x( F
;       RELAY  EQU  P1.0
' V! c0 h, H" w& r; Z% k2 f& _, H! V, \- L
        RS    EQU  P2.0
; y! x4 N& r* t1 i0 ?        RW    EQU  P2.1' k* c- p9 g% W- ~/ ]
        EN    EQU  P2.2
+ P! R! e; H0 m& N3 K: C. K8 t;------------------------------------------------; F& S' l# @1 C0 A- n) m2 i: g
         ORG 0000H. c% O: U: ^, |0 M& T
         JMP  MAIN1 ~7 D3 [" k+ C" N$ e
;------------------------------------------------  K- ^8 \% r! u) Q2 M
          ORG 0100H2 L& G# w# F  m4 j( T" ]; {
MAIN:
0 g* \4 \: V! B# b. j          MOV   SP,#40H
8 s; K0 C) R+ B: ^- j% U( {          MOV   A,#00H
; y4 \- x# @/ i3 c* q          MOV   R0,#20H
- |) I, L9 I. U5 {1 TLOOP0:    MOV   @R0,A          ;20H-26H清零
3 |, j0 {" L$ q& \: ?. D& }5 a: B          INC   R0
/ L; A3 ?4 H" V) B( H          CJNE  R0,#27H,LOOP0
2 d4 u. G2 Y, ]          SETB  IRIN
8 e; P3 i7 ?0 _2 I; n3 z3 S          CALL  SET_LCD
  M/ I$ y' O# ~3 q2 @          CALL  MENU17 t2 z+ G* \) ?  _1 _! x1 m
LOOP1:. m3 \0 I& V6 |; V1 v" A( V1 Q
          CALL  IR_IN9 R9 c& T8 d% C% H. g- k
          CALL  IR_SHOW7 R# `: D: \. ^/ Y2 a, z9 ]

0 |0 C6 Y* n$ P3 f, a% W& l;          MOV  A,22H3 d8 [% x% B) F- w
;          CJNE  A,#40H,LOOP2    ;K17键按下
3 ~: O# D% r8 P; F5 b;          CLR   RELAY           ;继电器吸合* f' V/ A( M3 |0 l- r+ k4 w# e; f
;LOOP2:    CJNE  A,#04H,LOOP3    ;K19键按下7 T) b7 S& i' B
;          SETB  RELAY           ;继电器关闭" F9 i; Q1 A8 Z+ b7 M
;LOOP3:   
' P7 J+ D* }' Z9 h, }           JMP   LOOP1
5 h; F) B$ d9 j* ]" Z: S
  f/ Q, G8 g, U7 r& v2 K/ U;-----------------------------------------------------
  N* F& R  \6 n/ a& @8 j; p;  LCD 初始化设置
, O2 r/ J1 i# g; p6 _; e- o;-----------------------------------------------------
- @0 Y: b- T7 Y' \+ @SET_LCD:
- ~# O6 t- X9 q+ Z1 B          CLR  EN& s5 s5 B$ O" X2 P# ~, U4 X
          CALL  INIT_LCD     ;初始化 LCD. i" K6 c( K/ x4 |
          CALL  DELAY1
# H7 I* ?  N0 b5 v8 t% e: N          MOV  DPTR,#INFO1   ;指针指到显示信息1
3 h0 v3 [9 S7 ], j          MOV  A,#1          ;显示在第一行
6 R' k7 ?1 @, A7 Q3 Y          CALL  LCD_SHOW
7 Z( l. a# P, I/ i  B2 V          MOV  DPTR,#INFO2   ;指针指到显示信息2' e) ]' K4 n& e0 p  S5 X  K: ?- @& A
          MOV  A,#2          ;显示在第二行
, n  b" T, s+ [4 u% \5 X! C          CALL  LCD_SHOW+ R% w5 {/ Q% |1 B' g
          RET
% Q" k. ~# `, i3 e3 l7 X;-----------------------------------------------------+ B2 t' r( |4 y# {& K
INIT_LCD:                 ;8位I/O控制 LCD 接口初始化
6 Y8 ?/ I5 p( }$ }; L! t. P          MOV  A,#38H     ;双列显示,字形5*7点阵
0 a5 t! K6 I& h' T1 Y          CALL  WCOM, m- M+ H- D: o. q% C
          CALL  DELAY1; O. w6 U; _1 u" s, M; w; W
          MOV  A,#38H     ;双列显示,字形5*7点阵
4 J% J1 _* Z: I$ N  q5 `( `$ V6 M          CALL  WCOM& [: H3 k) V: N% I7 T$ G
          CALL  DELAY1
6 O. ?+ H+ U7 X3 [) Z* `/ A  p          MOV  A,#38H     ;双列显示,字形5*7点阵
$ V( L/ L/ F: c" J+ R          CALL  WCOM' P/ c5 w& ?2 [
          CALL  DELAY1
8 e2 y6 E4 J9 k$ l" j7 w& w" p* A, V          MOV  A,#0CH     ;开显示,关光标,
: T. e( t& g3 o4 p% l. M# _          CALL  WCOM% P; W1 Y, g3 A: B
          CALL  DELAY1
/ {/ X. X3 m& @6 o% D9 v          MOV  A,#01H     ;清除 LCD 显示屏
: H' V2 _! e" a6 P. A: j+ l          CALL  WCOM) i& \1 f* p! T7 n
          CALL  DELAY1
* N) Q& q* r- s2 _          RET2 x0 J: g# g) y4 d) G  g
;----------------------------------------------------) U3 B6 Z) w4 R8 h+ X/ T7 u* E
LCD_SHOW:       ;在LCD的第一行或第二行显示信息字符6 x; ~6 l; u3 w4 _; A, O/ D$ ~

+ D1 S) O) e0 Q; T6 ^          CJNE  A,#1,LINE2  ;判断是否为第一行$ F5 \1 y: S3 C: V' _% A
  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址
6 `" w, m: }! C% k# {          CALL  WCOM        ;写入命令
; K- J# Z: E9 y$ v& c' H4 d6 B          CALL  CLR_LINE    ;清除该行字符数据
: Z2 |3 {( C# _          MOV  A,#80H       ;设置 LCD 的第一行地址
' c2 G: y" W  T4 t0 [- r. o          CALL  WCOM        ;写入命令
  F9 w% w7 Q2 k6 J, k          JMP  FILL
! k+ b' u; `- G/ Q9 D+ J. K9 G% P5 g' S+ r! M2 e
  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址5 i( l% s* W0 ^% R2 {, E
          CALL  WCOM        ;写入命令
9 I& f3 G5 d# O2 n; u          CALL  CLR_LINE    ;清除该行字符数据
( {: c2 J- o2 u# ?          MOV  A,#0C0H      ;设置 LCD 的第二行地址
& ~; k# a: e- L4 O          CALL  WCOM8 P  h9 e/ [7 B4 k* |& h
  FILL:   CLR  A            ;填入字符
  t: A" v# }  W/ d          MOVC  A,@A+DPTR   ;由消息区取出字符
; C2 b- s# h1 q& P          CJNE  A,#0,LC1    ;判断是否为结束码
) f2 m3 @' F3 \& U3 \          RET! |: e3 x. N& `$ i2 H% A0 P0 x' ?
  LC1:    CALL  WDATA       ;写入数据& k! B' V0 {. ^7 Q# E0 _- r
          INC  DPTR         ;指针加1( }/ Q9 G$ k" P* P
          JMP  FILL         ;继续填入字符7 J, T6 Z, S: W' ^. M
          RET
9 h5 R  m) D' S;---------------------------------------------------
5 B, W" N/ L* M7 xCLR_LINE:                  ;清除该行 LCD 的字符; j) P- M( |5 J, q6 q
          MOV  R0,#248 h5 @' [! |4 L$ `+ Q6 H7 U
   CL1:   MOV  A,#' '
. p+ u: y% w3 F5 |, Q+ |3 d2 T          CALL  WDATA* X% j: b" [% t, Q- q
          DJNZ  R0,CL1
# s+ y4 D- G; o. H          RET
+ @' l/ a4 `  ]! C/ K! E;----------------------------------------------------: ?- ~9 M, d0 q+ b" a6 D+ H- n
MENU1:                      ;LCD 显示工作菜单信息
3 c3 P5 M" Y7 Q& |         MOV   DPTR,#MENU2. Z& ]! ]5 `; V8 ]
         MOV   A,#1         ;在第一行显示信息
5 l6 M8 J6 \2 U/ s         CALL  LCD_SHOW1 F4 a. O; Q' n0 }
         RET
/ f: Q4 H% N' O1 f5 Y) }2 `/ IMENU2:  DB  " REMOTE CONTROL ",0: X9 T# B5 m% Y5 f' K. ?& U: F; P( Q/ E
;-----------------------------------------------------$ y- G+ o9 f7 ^3 J( ?* W  s
INFO1:  DB  "                ",0  ;LCD 第一行显示信息
* {2 Z- F" q) Q" UINFO2:  DB  "  IR-CODE: --H  ",0  ;LCD 第二行显示信息
- l0 ]0 ?1 q' w7 L( d. }2 ^;-----------------------------------------------------7 p% @5 w0 t* l3 r/ t; Z
" `$ t9 W7 G$ n0 L9 F9 `
;-----------------------------------------------------
7 `7 L" L4 a, L$ l& T, ^; 写指令、数据使能子程序& B9 D  q6 V! b% x9 }& y
;-----------------------------------------------------: @# \3 v1 c- e
WCOM:
0 O2 N8 R, G1 X) J. f/ A1 y( \          MOV  P0,A        ;写指令使能: ~0 ^5 Y& {1 `5 v2 w/ {$ ^
          CLR RS           ;RS=L,RW=L,D0-D7=指令码,E=高脉冲6 [6 A3 u  b# b/ I# Y
          CLR RW
) Y# Q0 p6 K/ T9 t5 T5 P& o          SETB EN
# s2 Z3 w8 K  y+ B* }          CALL  DELAY09 @0 W9 r2 Z1 b
          CLR EN0 m" w+ o7 s0 I% d: r' a1 Q
          RET
5 n3 v7 T/ O9 g
; g2 @  G- T: r( H9 v. MWDATA:+ X: p) w& E' ?/ n0 i
          MOV   P0,A      ;写数据使能
8 B! S5 \4 ^5 U2 u) ]          SETB  RS        ;RS=H,RW=L,D0-D7=数据,E=高脉冲
1 f* x& d9 l( J1 C5 ~. X9 Y          CLR   RW
! ]2 _/ d' O& H% k( h; \$ w! o          SETB  EN5 M9 B6 q8 H7 d
          CALL  DELAY0
0 K  l, I5 Z  j( I          CLR   EN
# B7 `9 O9 F* z5 U, t7 C2 a          RET; q8 T) Y( q0 `& v( E8 s

5 v+ |- ]5 _; N  d7 V' _DELAY0:   MOV  R7,#250      ;延时500微秒
" R. F! I: B& }# g          DJNZ  R7,$# d3 ?$ o$ V, z( b: w$ k* `8 h
          RET
  P3 j( s/ R* E6 {;---------------------------------------------------
3 M( G: v0 z# D4 `1 n;在 LCD 第二行显示字符
2 q" u. I0 ~9 P3 |0 [* v4 B;A=ASC DATA, B=LINE X POS
/ v' s* S) q3 `6 x7 d;---------------------------------------------------
% p! m8 u5 @- k0 F, _) BLCDP2:                    ;在LCD的第二行显示字符
/ u$ O) k: T0 ]" U) i         PUSH  ACC        ;
; q: k" k5 R! `! h         MOV  A,B         ;设置显示地址& z5 _: {) }- \2 _- e! W, n; [
         ADD  A,#0C0H     ;设置LCD的第二行地址
, @1 P) N# ~( H9 c3 p8 b         CALL  WCOM       ;写入命令; r8 I( V2 j4 c2 O9 `+ A1 i5 P- c
         POP  ACC         ;由堆栈取出A
- j! s( s0 ^: [+ A& C8 Y: ?         CALL  WDATA      ;写入数据) y  x' G4 M7 q7 v  k
         RET
( t! I  f$ `: X( b;---------------------------------------------------! Q$ u% P3 I& B* c
; IR 译码子程序
$ W, l7 l5 v6 `3 J2 J;---------------------------------------------------
$ N) {! @' \* }5 A3 y; f! m+ YIR_IN:              4 A/ I; y/ V- V( S) T
          MOV   R0,#IRCOM
8 b7 X8 p! H/ a; H- P# Z  }8 c I1:      JNB  IRIN,I2       ;等待 IR 信号出现
9 Q( X4 ?& n2 k  J# a          JMP  I1) X- p6 W. J5 c4 ]. Y: g* {3 I! F
I2:      MOV  R4,#20" B" O- }9 R3 I: F% U/ {7 O
I20:     CALL  DEL
8 C, A* l1 X' ~, K          DJNZ  R4,I20' m0 c; w7 g( K& }5 D) K
          JB  IRIN,I1        ;确认IR信号出现; y7 I. E4 D! N5 W+ ~/ d
I21:     JB  IRIN,I3        ;等 IR 变为高电平
, F7 D2 f2 n& e+ C. u! c          CALL  DEL5 \' {9 S" r8 N' t& H
          JMP  I21) @6 q2 ^3 q: m% j$ ^4 [6 E
I3:      MOV  R3,#0         ;8位数清为0. E& n, U. M) W: ?7 J9 H  {
LL:      JNB  IRIN,I4       ;等 IR 变为低电平
/ C' b- @. x+ ~& y. |6 f& n          CALL  DEL
9 v7 f) H# Q( s7 E3 ~7 e  Y          JMP  LL% n  h0 \3 u* u0 o! Y3 y' y6 k2 f
I4:      JB  IRIN,I5        ;等 IR 变为高电平* c! V3 T# I6 i
          CALL  DEL$ I0 @: q& M( |2 l+ s4 l7 Y4 E
          JMP  I4$ d+ x* r3 q; a, Z
I5:      MOV  R2,#0         ;0.14ms 计数$ V$ H% n# e/ ?* N
L1:      CALL  DEL9 R2 x( f1 ?* [6 B
          JB  IRIN, N1       ;等 IR 变为高电平. n+ ]" @* O3 z* N& T
                             ;IR=0,检查R2中的计数值 1 b+ |# b/ V4 V5 V
          MOV  A,#8
! i) I1 |! s2 M. H" W9 M* {( }          CLR  C
/ E* u# s0 b! @! k! @' K1 C          SUBB  A,R2         ;判断高低位
4 \8 J( r+ ?: n  m7 l# P                             ;IF C=0  BIT=0# A9 }+ ?+ j, L) e/ ~
          MOV  A,@R0
7 m3 G" V* F# X4 o0 J          RRC  A! D( U1 t! J* Z1 h+ r% |# {
          MOV  @R0,A         ;处理完一位
0 v" D7 A; ^' o3 L5 O; ]$ \1 v          INC  R3
2 Q" q7 B) p- _/ p$ ~4 Z8 d4 q          CJNE  R3,#8,LL     ;需处理完8位  
( r/ [1 I$ [* m- r# q+ E# Z6 o9 y          MOV  R3,#0
; ]) n) ~- z6 u1 x/ O/ _          INC  R0" D' b6 j0 y+ G. Z$ r$ v, z
          CJNE  R0,#24H,LL   ;收集到4字节了
4 @: H4 [3 y" }8 D# y5 r          JMP  OK% C: S8 {) F9 g# R6 m3 {6 T+ T: d
N1:      INC  R26 ]6 z1 G) @% O. U% b1 N+ F
          CJNE  R2,#30,L1    ;0.14ms 计数过长则时间到自动离开. ~' _% C1 V3 P3 J4 i' h
OK:      RET
3 I$ k8 M& z5 q8 o+ q# F' X;--------------------------------------------------------------------
/ l' r% T8 b$ k$ [2 CIR_SHOW:
5 S( U: Q; B, o          MOV A,22H
8 r& l( c7 B  y+ ?4 p( ?; U          CPL A                ;将22H取反后和23H比较1 V% U, S+ B3 d# r& ~
          CJNE A,23H,IR_SHOW1  ;如果不等表示接收数据发生错误,放弃。
6 o* Y; _: `: a          CALL   CONV
; X8 x6 G1 b4 N; V- Q7 l* H# Y;          CALL  BEEP_BL        ;蜂鸣器鸣响表示解码成功
- K% v) S+ D# Y) tIR_SHOW1: RET
# f) d/ R9 m$ e8 R# T;--------------------------------------------------------------------: v& x  b& L0 k8 z
;转换为 ASCII 码并显示( M! h# {+ x6 Q& t) c' S* _: U( E
;--------------------------------------------------------------------& Q4 w; z9 _# }( B  f. t  ~2 X
CONV:! X- T( Y' c' {8 O
          MOV   X,#11        ;设置显示起始位置* A0 T& L. W% I) `4 Q) h
          MOV   A,22H
- ?, c% _7 ]8 N: R" n! }4 L, l) C" g          ANL   A,#0F0H      ;取出高四位二进制数
$ Q& R0 D" N# }2 j0 q+ F          SWAP  A            ;高四位与低四位互换! |0 U1 s" m9 t% q% r1 k
          PUSH  ACC          ;压入堆栈% R" r' f5 O# r; P6 A8 d3 V
          CLR   C            ;C=0
6 C5 i" c6 U4 R$ I8 U          SUBB  A,#0AH       ;减10- K( `' G( U3 `) ]2 g+ ?8 ^) c
          POP   ACC          ;弹出堆栈) q1 a$ f% S$ A3 v& `" k
          JC    ASCII0       ;该数小于10,转ASCII0
+ S# R4 T: t4 m          ADD   A,#07H       ;大于10的数加上37H8 L3 u5 k  V, j0 c5 N$ z
ASCII0:   ADD   A,#30H       ;小于10的数加上30H$ m! @. D' l/ Z: B- ?( `
          MOV   B,X
5 O4 `/ T% h  x, ?! V1 A+ I0 d  I          CALL  LCDP2
% b, l, y$ l2 p$ Z8 m9 P7 n# S* M
          MOV   A,22H
4 W8 b5 s* C2 S  V$ S8 u          ANL   A,#0FH        ;取出低四位二进制数
, ^* ^2 N0 C( M% Z& k          PUSH  ACC  O9 ]* }6 [/ @. _- T3 Q
          CLR   C( k' P: v+ U6 e
          SUBB  A,#0AH        ;减10' P' a$ Z% r' e' t9 c! @
          POP   ACC) @6 l7 [7 r6 `* a" }. O/ G
          JC    ASCII1        ;该数小于10,转ASCII0$ F& o- M  R) B7 O/ N& Y5 [
          ADD   A,#07H        ;大于10的数加上37H1 U8 A0 C5 @' |7 M8 T3 ]% G1 x
ASCII1:   ADD   A,#30H        ;小于10的数加上30H
8 Z$ R2 B* [# u2 `          INC   X
# l) x0 C7 Y0 l/ r3 C6 X  ?          MOV   B,X$ ~) [- I9 v9 [1 Q  u; }4 i( l" ^
          CALL  LCDP2
4 e7 O8 x  o) p' T( L( K8 v' ~          RET2 U0 C+ w* `! b" J5 C& c
;--------------------------------------------------------" a: K+ b- S: {! d0 \
;蜂鸣器响一声子程序& V! Z/ t( _6 W. F8 ]
;--------------------------------------------------------' u" x, J; R1 \6 n8 h& w
BEEP_BL:
% r. b6 _. N+ ]8 e9 v         MOV  R6,#100
1 h- j7 B" q( k  BL1:   CALL  DEX1
) K1 v9 t  T4 ^+ i  U5 l0 y;         CPL  BEEP
" e( `/ |" i8 v- k3 l  U         DJNZ  R6,BL14 B/ Q. B1 G4 q, Y# B8 H( v# h
         MOV  R5,#25
0 e' S- }% a0 ^8 M; `         CALL  DELAY# [; H+ t' H/ ~3 q! k$ p' q. I2 c
         RET" u% g4 E- a0 e( P0 r4 m5 ^1 N
DEX1:   MOV  R7,#180$ y# S0 U0 a) W0 q; s4 K) U8 s) Y
DEX2:   NOP
7 W' l- `6 U( e: [5 c         DJNZ  R7,DEX2
+ k: T  s0 \) x5 C% A+ Z         RET) _# X3 v. e9 W
DELAY:                    ;延时R5×10MS
( \/ r; x5 ~5 a( t         MOV  R6,#502 G/ t3 t' x$ \) W# Q
  D1:    MOV  R7,#100: s5 g+ m. \/ V* z2 F% ]+ W7 r
         DJNZ  R7,$6 H2 a8 s9 U& [- T3 F  W0 o3 ^2 b
         DJNZ  R6,D1
2 f+ l6 x% T1 b/ w: h, }' r- a         DJNZ  R5,DELAY) C1 y' [$ [/ X0 b. C
! l7 s% C, P) m8 B" y
9 ~5 u, I- d# `6 y" c
…………限于本文篇幅 余下代码请从论坛下载附件…………
1 W! M5 O; O! V. v# @4 Y6 V
游客,如果您要查看本帖隐藏内容请回复
3 d  ]2 b' L) |3 f
, ?7 q. h' W: H
* G" L) h& u9 f
$ Z" k; J: |3 [6 x4 g

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 22:04 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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