|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机红外遥控器解码实验 C语言和汇编2个版本的程序都有
* m7 `' j3 }. e% n5 i: M' F
1 d% o8 k% l! J# Z( v . f2 i! ?) z, r+ f) k
注:4 W5 S0 i8 K" D. N6 g
每个EXP实验的文件夹下文件夹分别是P_ASM、P_EMULATOR_C,P_PROTEUS_C,P_EMULATOR_ASM。
0 ^( C! a6 I$ Z$ C- ]+ ?" jP_PROTEUS_ASM 为PROTEUS汇编实例工程- P F% r$ v4 x( y- y2 K5 h
P_PROTEUS_C 为PROTEUS C51仿真实例工程
4 J4 ?' s4 Y* MP_EMULATOR_C 为硬件仿真器(可选配件)C51实例工程$ O4 e' P7 _$ m4 }/ f) w* `
P_EMULATOR_ASM 为硬件仿真器汇编实例工程
9 e1 d* ?: |, u. l2 U1 o/ t, L一般情况下P_PROTEUS_ASM,P_PROTEUS_C和P_EMULATOR_C和P_EMULATOR_ASM都支持ISP下载脱机运行2 Q7 G w" c* ^1 m7 E5 Q
, } u3 T% D+ B1 _7 Q
P_ISP_C,P_ISP_ASM为ISP下载脱机运行实例。比如看门狗实验,仿真器不支持,因为复位信号被仿真器接管,所以就只能做硬件脱机实验,通过ISP下载程序。 Z2 T9 y0 J% `0 o* L( ]% ^1 w
/ V+ {. E- x( [2 H; E/ b1 Z& l
如果文件夹带有(缺省)说明暂时没有提供此程序,可根据需要再添加。
! |2 y8 H0 z) ~& {9 H6 A1 g
) w' e: ? G% W" ^
! Z# {5 _" B8 Q1 n" e1 v汇编和c的代码都有很全面.
5 C5 K0 j ^4 M! D3 h
9 a4 i6 F+ g3 ]+ nc语言程序:
5 K. v8 J \' Q# R0 ^ ; n" s6 y5 P! `5 I4 t8 ?
/*************************************************
2 n+ `! j8 \, `7 s) U p, d% e*文件名称: main.c
5 w) K Y) F' ?$ M5 L*作 者:
/ @: Y+ Q5 N$ _6 V*版 本: V1.00
. s) K+ e6 c* o, r: A*说 明: 红外遥控器解码实验3 V+ b; g6 G! h+ m
*修改记录: % X1 A. g8 I& j/ W ]+ C
--------------------------------------------------
7 o4 N6 Z. |" P$ N- B/ _*Descriptoon: + }3 s0 x: N& q5 A6 |1 Y# r1 A! h/ B
*接线说明:P32-红外接收,P25-RS,P26-RW,P27-EN,: g `5 _7 k' _: }- H9 | |
P00~P07-DB0~DB7 ( _3 ]6 @" \8 ~4 A, v
**************************************************/ * |: J" r+ n& g; e3 c! J' o3 s5 |
( ~2 f+ R7 Z, v( B, y
#include <reg52.h>
( D5 ^4 R0 n/ y4 Q( }- N5 @
0 M6 F3 I8 m# |% o* Y#define uchar unsigned char3 l2 r# ?7 e1 K: W, m5 R. o
#define uint unsigned int
. Y$ H$ _, l7 H8 |9 Y. Y2 q//char code SST516[3] _at_ 0x003b;
) N+ }7 b0 J# X: G' q1 E#define c(x)(x*110592/120000) //晶振11.0592
7 ]* z, ]) j7 b$ u
5 a! A6 p, }+ ? }0 Zuchar Lcd_Buf[4]; //显示数据缓冲区
% }9 j3 D$ M; ]( Z6 c; ` X; z6 iunsigned char Ir_Buf[4]; //用于保存解码结果
# K3 {( n9 a' U3 s, b/ L0 t) zsbit Ir_Pin=P3^2; //红外线数据接口 u7 Z7 F2 j9 V' e9 l% h
sbit rs=P2^0; //LCD数据命令端
" x/ j# Y- X) \; Dsbit rw=P2^1; //读写接口
, t$ d: V0 J e: |0 osbit lcde=P2^2; //使能接口
' I# B1 M$ s+ O( V% K0 N" duchar code table[]=" WWW#WINDWAY$CN ";//LCD显示数据
" A9 r2 P" a2 l* P/ a, M1 e- J$ o* zuchar code table1[]="Wait for IR in..";, K* D" [: O; L% N" c* w. M+ m ^
uchar code table2[]=" IR DATA...";
! \& u+ S% w% T4 G( N9 l' v1 H, V2 L3 x9 r& U
unsigned char code Led_Tab[]={
' f7 G4 ~/ U3 A s0 N/ T: ]; | 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,' A( h+ |, {* {) j
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F
, t. y, J. ~4 Gunsigned char code Led_Sel[]={0xf,0xf,0xb,0x7}; //数码管位选,屏蔽前两位
5 U$ B* \5 T! E) Funsigned char Led_Buf[4]; //显示缓冲区
- [% v X2 N* ]0 d$ p/ `char Led_Index; //定义位选 . u. i; `/ E$ g k
unsigned char Ir_Buf[4]; //用于保存解码结果
. D. v3 |% Q* ^$ b7 a6 f- \; U7 P- f+ y4 X" |, E6 w
sbit LCD_E = P2^7;
+ U" w9 p8 u8 ]//========1MS延时====================================
0 {2 I; |" Y8 d2 v& F% p9 N& e) kvoid delay(uint z), i3 K# B4 w5 l2 Z3 p2 I
{
/ d) A4 O% Q2 k: t) {4 v, _ uint x,y;
2 A9 N* C: `7 P! w E! D! o for(x=z;x>0;x--)8 W4 }$ X: v- t) H9 ~* G
for(y=113;y>0;y--);
0 R0 T4 v f u. N: U$ m9 i}1 c$ j. Q1 F6 S+ Z
//======LCD写命令=====
( a1 K, }- x+ R& E$ p0 H/ ]9 Dvoid write_com(uchar com)+ r/ c+ [; d1 T, |) S
{
) ]: j5 H- A- n, r: N Q! a rs=0;
6 i" J& K! O6 U7 ~ lcde=0;
( G. O3 j, B& Y; K4 T1 n P0=com;
( y, e3 c _9 {2 L lcde=1;
" M+ Z% m8 @) |, ? delay(1);//延时1MS跳过忙信号& Z$ u" B/ B9 w: Q" Y* C2 }
lcde=0;
3 X# b& z) ^ E* h9 S delay(1);
% i$ d f: V8 D" u3 \: H4 U1 d}
2 J" k) g% k, |: c% P7 b//======LCD写数据=====================================
* U/ _3 {, h# ~% C* k! t: d; s) Rvoid write_date(uchar date)& U0 w; f0 E- x: f# x; @
{7 B) U8 G: _9 S% r& |7 \0 J: P
rs=1;2 K$ V( M, }, H' v
lcde=0;
; d8 I1 p$ r" C2 }8 G7 J5 L) t2 p9 K P0=date;0 Z$ @9 c. B( d2 r. `' f7 d$ B
lcde=1;/ J% @% B- _2 D/ _9 M4 ~
delay(1);
6 Z/ n- y# Y. z, ? lcde=0;% `7 W6 |/ j& z3 _
delay(1);
- X; l) e9 |. ?}
4 B8 |2 T6 ^& l7 g8 L! p; z//=====初始化函数=====================================
6 b' ]7 z5 j2 a- R. Y: pvoid init()
* S0 ~5 t) b! j2 W& W3 b1 k' m* B; V: h( A{
( A. F) c% ]& j# m7 G' o uchar num;% [; Z7 [2 b( W/ y ~
rw=0; //允许LCD写
# A C& T" c0 d, ] H3 ^! y lcde=0;* A3 D. R8 O$ f- S
write_com(0x38);//显示模式设置
Z0 N" l( I8 S, G write_com(0x0c);//显示开及光标设置
) s3 J; _" P# y& | F$ A write_com(0x06);//显示光标移动设置+ |4 I5 a: B O, W5 Y0 N5 @+ }
write_com(0x01);//清屏9 r: H- T* O* i9 {5 x! p6 `& `6 D
write_com(0x80);//显示首地址
1 z! B! u- @2 G( Q7 I/ g5 x for(num=0;num<15;num++)//显示第一行) O, C% A6 E5 o- W* [% m
{ @# o' R* O( z2 d
write_date(table[num]);
. D! S3 _. d5 b* P delay(1);; d: E9 |" ^$ | a8 D
}3 A7 i/ O/ h" w6 B! k) k! J( m
write_com(0x80+0x40);//显示第二行
" O% s' K: j L* m) Q) J for(num=0;num<16;num++)
- p7 b* W8 U0 m {
1 `1 t0 A6 J! @5 K0 ?3 ~ write_date(table1[num]);/ t4 Q& S* x5 Z) E7 M2 y
delay(1);$ [; z K; m: h6 B: s
}
* s& y% V9 B) c& H TMOD=0x10; //设置定时器0、1工作模式为1
7 d5 u; e) ?9 u3 m$ O0 q}
$ Z+ C" N; d7 o9 w& q, q* J//=====显示解码========================================* q+ B5 t/ l1 @5 F& ~
void write_ir(uchar date)
$ O3 V! c, c& q* J{
7 Q' p, H4 v4 M' {5 { uchar tmp, num,ff; ) I8 \# m. e- i* _) x
+ `$ l4 U; @- P
if(ff==0)
( a( V0 H+ v, n6 B2 s { c4 w& B5 {9 X1 m3 h4 \
ff++;+ {- ~+ f- u* {, ?" V" y/ T
write_com(0x01);
) h1 ^/ P) v% D/ R write_com(0x80);
' _# _5 h& Q0 k, ]+ H+ J& V for(num=0;num<12;num++)9 a2 R7 P( h4 Y: l
{
2 |0 }6 D$ T) F$ [3 p' ] write_date(table2[num]);
- j& i) x7 Q' h6 s+ t, H/ J delay(1);" N' T/ b* q$ B; V. P
} 8 p8 z% c% g! v3 \8 I, b( q
}
3 W, x$ e- Y( M9 w+ Z3 T) v# e) q1 G% i; l
write_com(0xC0+6);//定位在第二行第六位
: v8 s# d" K. a' `* N tmp = date>>4; // 高四位 0 o, q3 |& }9 y8 Q4 F
write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);
* L" l" e( y7 X. n write_com(0xC0+7);//定位第二行第七位 . c5 P. X9 G8 k7 i! m$ Y Z
tmp = date&0x0F; // 低四位
% @" @5 ~5 Z0 N: s9 n6 I- ] write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);
* W: E( ?) M& r" B: Q3 `# B! ]: [8 h' @- I1 T8 k' S
}. [0 g* K5 E1 s( O( ?1 J4 V# T
//======================================================
* p- I: Z! w) a2 F$ @4 e6 R//解码取回低电平
; E* A$ T2 t9 e4 Q# K. yunsigned int Ir_Get_Low()
" I, g* M* R% I9 {0 `' ]; [{
b, q1 w0 y$ c, X% x TL1=0;- k2 p5 N) H4 m
TH1=0;
# [! Z0 e* W8 S TR1=1;
+ H: ^7 c+ x( g while(!Ir_Pin && (TH1&0x80)==0); //等待低电平到来 0 e" y0 U b3 ~" P
TR1=0;
% T- q) l; ?0 _4 A+ r return TH1*256+TL1;//提取低电平时间间隔时长
y* O3 M% i4 t# W6 u* H. y! u+ h4 E; g# n}
" h4 }1 v# e+ B2 i//======================================================
6 s+ @) T5 ^6 @* q; [5 M, o8 {, F$ e//解码取回高电平========================================
! F2 L: q$ P; dunsigned int Ir_Get_High()3 V0 Y2 _/ |4 i8 ]- {; E
{
. J% w' z) w& S. R' m" ^ TL1=0;) a$ y1 K9 \, h$ d
TH1=0;
* p; X: b, O3 a* V5 E: y! ? TR1=1;
; @8 W0 f+ M* B9 Q! N4 T while(Ir_Pin && (TH1&0x80)==0);//等待高电平到来0 P9 Z* [! C- ^- g
TR1=0;
1 ?- R' F) k: h4 n. ] return TH1*256+TL1;//提取高电平时间间隔时长- m( N* F. Q6 C T B6 S7 O
}3 u! p5 a7 s! R& M
//======================================================
9 l! Y1 h" T; x, G5 v; q//======================================================) h: e1 A, k# {% }( A( [' U
- e2 z0 u% O8 Q& P" @- Cvoid main()! W/ s9 G, M; v H2 {# s7 u
{
- V+ q% D X) X3 A- W) k" B unsigned int temp;( L; Y: P) [5 R, F) b
char i,j;
3 ^9 l% P8 ^8 W F* y% s/ N; ^$ j init(); //初始化4 q6 Q* _1 m! t. @& P' f9 p
//=====用do做循环,等待遥控按键=========================
7 V, O) M7 d" W. d, H7 W' D* r do{2 i2 Y. r) l- n- V( U8 t% `
restart:
: T; ~) B' K: Y V while(Ir_Pin) ;//等待低电平7 W1 l6 @6 O. `! {! \! D+ V( d
( p) j' F- Q- J. o3 s) c8 R& h
temp=Ir_Get_Low();//把低电平附给变量
! R0 g& m: f5 ? if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平等待9000us
5 |; r/ n1 U) C/ f) w2 p temp=Ir_Get_High();//把高电平附给变量( X- P! J/ f# g& `
if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平等待4500us- @& H& f: a1 k! X8 G. w2 r, p# q
//连续读出32个字节
' l1 `) D& L1 G( A1 M( W for(i=0;i<4;i++) //4个字节
; N9 U7 `8 u7 Y; s7 n8 M2 n1 _3 Z5 H {# a2 @4 [3 r1 d( {1 c
for(j=0;j<8;j++) //每个字节8位! ^4 e) q& D. X& }% g" T2 K
{& N2 B9 @: K. f1 A: u
temp=Ir_Get_Low();
/ X7 K4 o o9 G7 q3 r, M; ]- s2 u% ] if(temp<c(200) || temp>c(800)) goto restart;//等待560us跳过低电平
, g: Y3 Y+ U& F1 z: R { temp=Ir_Get_High();
- D% f. j2 }/ l( p( r; d* F B/ ] if(temp<c(200) || temp>c(2000)) goto restart;//等待1000us跳过高电平# I- u/ K' C* F6 N! F6 d" y
Ir_Buf>>=1;//把电平移进数组2 W7 g9 ^5 Q% W* a( }
# J& W0 x. h; K, o0 l4 D
* \* N4 W$ J0 {! O1 ^
…………限于本文篇幅 余下代码请从论坛下载附件…………
* f5 B+ J5 {& J; y" S
v* K0 Q j8 n; x汇编语言:
5 A ?3 R; J& Z% P+ O, S( s' c' D) n7 s \
+ |/ h7 V& v) f; x7 _;-----------------------------------------------3 x0 R+ p2 C8 x8 F" u
IRCOM EQU 20H ;20H-23H IR使用
, w. U0 c a! N1 [5 _ X EQU 26H ;LCD 地址变量" C5 L; O" r; g J) {
2 S! R; S) S/ |, i, m0 b6 a
IRIN EQU P3.2# V& A- P6 W9 N6 C
; BEEP EQU P3.7
( z% S) o& h1 Q1 Y8 l; Y/ @; RELAY EQU P1.0# V0 N1 I% M& W W
/ [- m& T/ w( o+ i8 I { RS EQU P2.09 G8 A# K/ S7 s
RW EQU P2.1) Z, B- R+ D2 I# l; }& R3 W `
EN EQU P2.2; Z3 c. n2 u6 R0 y* L: C
;------------------------------------------------- V2 k7 s- v8 \! `
ORG 0000H* T$ I+ @, `" A! b; p0 z
JMP MAIN& t: G( `3 y: _( L v! z& J
;------------------------------------------------# H- e9 k; I- L( F' r" O* k
ORG 0100H
$ r/ I/ [5 ]6 u9 R/ ^5 x PMAIN:5 U, R$ k0 `% E7 g4 o5 s# S2 Z
MOV SP,#40H4 a" e: B5 D2 \7 n7 N
MOV A,#00H
& J# k/ c X3 M+ g0 K: C MOV R0,#20H
: \9 k/ ^. C) M3 q5 F* N; E; CLOOP0: MOV @R0,A ;20H-26H清零
2 ?6 w& u! K0 m7 ~! p INC R0
7 d, T) X [- \ f% u4 } CJNE R0,#27H,LOOP0 s; q1 g8 u- `! g* M
SETB IRIN) r7 z- }; q8 K
CALL SET_LCD! }' ^6 H! J. j
CALL MENU1
5 C g" S9 ~7 r. o. Z4 k7 `LOOP1:1 }: v; |2 m2 g! w
CALL IR_IN4 x3 a6 O2 m5 T& ?
CALL IR_SHOW3 t1 h! i, ~$ ~# m: E5 f7 N9 U
( |+ l+ u. |9 s; MOV A,22H' {+ \- O, y0 C
; CJNE A,#40H,LOOP2 ;K17键按下$ k( ?& I% z" L: s6 H9 a
; CLR RELAY ;继电器吸合
$ r& t6 D. u5 r;LOOP2: CJNE A,#04H,LOOP3 ;K19键按下
$ a. k: p1 x7 l. ~$ Z, Q; SETB RELAY ;继电器关闭
$ v0 s- s- P, V3 @5 d h;LOOP3: ! r2 J4 p+ V5 R# [6 s: H) s: O
JMP LOOP1
& S" G( ^7 F% S2 J0 w$ k% j5 K
/ g+ o4 V2 y9 f# f9 d;-----------------------------------------------------
% R. M$ }, r/ V6 V! v7 j0 Q6 W; LCD 初始化设置/ a+ V; x4 g! b) i2 o* E
;-----------------------------------------------------$ `8 d* A( E! d& V
SET_LCD:
' B$ U" _/ v/ a CLR EN1 g* b: y$ x" m- v6 P, w
CALL INIT_LCD ;初始化 LCD1 A5 a3 {8 t: i3 f3 M
CALL DELAY14 `# e6 W/ l* v
MOV DPTR,#INFO1 ;指针指到显示信息1
. K7 ]: \) }1 m MOV A,#1 ;显示在第一行' w: c: _- {- ^1 l
CALL LCD_SHOW
$ B$ U p" E6 B9 q& o3 P MOV DPTR,#INFO2 ;指针指到显示信息2) \# @2 H$ S) v+ i$ P7 e: p
MOV A,#2 ;显示在第二行, U% S0 l8 g# w) M! _3 ~
CALL LCD_SHOW3 `5 |( m% L! K, j
RET
% t/ W# d$ Q" G- ^2 \1 E, Q;-----------------------------------------------------! h8 C9 e2 @* `4 n7 c& v2 M2 A; {% I
INIT_LCD: ;8位I/O控制 LCD 接口初始化0 _7 N8 W$ ~% A
MOV A,#38H ;双列显示,字形5*7点阵, s4 M* s! ?% m3 E8 F. z# f$ y
CALL WCOM: h4 u8 l8 i$ x/ q& ^ B, C
CALL DELAY1" Y. @: P C* I, N* s
MOV A,#38H ;双列显示,字形5*7点阵
6 o9 v9 G$ |7 d% @$ w4 f CALL WCOM
! |9 n5 U1 @& H0 L CALL DELAY1
4 B! y( r8 \9 _, q5 O MOV A,#38H ;双列显示,字形5*7点阵# D% u% ]5 S7 S, F N8 e f- t
CALL WCOM3 b9 U M9 X/ B3 S4 w$ W
CALL DELAY1
2 D& ~2 P# L! K# y1 ^0 a MOV A,#0CH ;开显示,关光标,. ?9 j' m j) w0 k1 i3 r
CALL WCOM! j' V( V* X9 L$ p! H3 Y
CALL DELAY1
* L4 W9 B ?* o MOV A,#01H ;清除 LCD 显示屏2 C% L$ ?1 E. R9 i9 u3 y$ L
CALL WCOM' t( m$ R, u5 x$ p8 H5 e: u2 E
CALL DELAY1
, @; H+ X: [: x7 Q" m! ^ RET
5 O" q6 p7 I- n- B, L0 h;----------------------------------------------------
, H2 H( k/ ~3 Q' NLCD_SHOW: ;在LCD的第一行或第二行显示信息字符4 j* Z) I* {! `* Y
# f3 q/ D8 {2 d# |! c6 `8 C* _4 N CJNE A,#1,LINE2 ;判断是否为第一行
: ]; ? q2 m2 K4 d7 t { LINE1: MOV A,#80H ;设置 LCD 的第一行地址5 h- }9 }1 e; J" }
CALL WCOM ;写入命令
( o X$ I" _! i/ q! x) C, D& K9 P' u CALL CLR_LINE ;清除该行字符数据
/ u S# [* R" C1 O MOV A,#80H ;设置 LCD 的第一行地址
/ g" u; k. T, {0 x CALL WCOM ;写入命令8 W5 O* M% C* G4 b! n6 d
JMP FILL
& w! b( L9 l# q9 o) p7 ^0 r4 r2 y8 o
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
3 e% e' N9 P. p CALL WCOM ;写入命令
: ?% \$ x# l i+ p1 I4 Y1 M1 p CALL CLR_LINE ;清除该行字符数据
* M0 I* Q& {& N1 W MOV A,#0C0H ;设置 LCD 的第二行地址
7 A: v# N; t" {. N" w CALL WCOM
3 N+ v M( x$ N) e9 A6 Y6 R FILL: CLR A ;填入字符
3 H* E5 o$ A4 `. f" c! T1 I4 @6 @ MOVC A,@A+DPTR ;由消息区取出字符! X$ ]% R" m# J% v
CJNE A,#0,LC1 ;判断是否为结束码
/ ? M& M) g' Z RET
/ C9 E+ k Y9 M LC1: CALL WDATA ;写入数据7 W1 u4 e1 H9 ?
INC DPTR ;指针加11 F% C' l, N) J% k
JMP FILL ;继续填入字符
" ~' L* t: _( t$ o; r! Q5 B RET" T/ T- _. P1 P: D# w+ I
;---------------------------------------------------
0 R. k( f( o, iCLR_LINE: ;清除该行 LCD 的字符2 T0 }, T# w8 ]$ M! l* B
MOV R0,#245 ?$ n! K/ f: T7 h3 F7 T( V
CL1: MOV A,#' '* ]+ y D" i/ ~) c! z) p7 h
CALL WDATA5 a6 ]0 E5 R# a
DJNZ R0,CL1
6 J9 p0 `0 b) S- b! L) f; s RET5 I" u1 E8 n; x7 p, X
;----------------------------------------------------
- |% }6 t9 e; D5 t: z: S; Z4 mMENU1: ;LCD 显示工作菜单信息5 F! D6 z+ ?- B7 Z7 }
MOV DPTR,#MENU2
4 N. g9 p% J* f0 {- w) j MOV A,#1 ;在第一行显示信息( y5 }* b/ I4 j/ j6 \
CALL LCD_SHOW
0 \! S! J5 w1 B+ S( g2 h RET: ^# |% V1 |4 q% u5 y" r
MENU2: DB " REMOTE CONTROL ",0
U8 |' i% _. L* a q0 K;-----------------------------------------------------$ G6 x+ C/ w$ _; U4 @9 m) _( p7 w
INFO1: DB " ",0 ;LCD 第一行显示信息2 [" G5 u, G0 n7 T- T. M8 o
INFO2: DB " IR-CODE: --H ",0 ;LCD 第二行显示信息
) g& `. Q/ E- d: _! i+ @2 z;-----------------------------------------------------
" W/ G* Q. B1 j. F5 \! m3 e& O# F4 J8 L: C, X
;------------------------------------------------------ Y* z6 k5 k$ U
; 写指令、数据使能子程序; X7 s: T# E# z% J+ |
;-----------------------------------------------------
' C" {6 H8 T. I! rWCOM:
7 s" S* |3 ^2 p6 @& l8 U- n MOV P0,A ;写指令使能) l! p& Q7 S7 }! N/ m% n, H- H
CLR RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
5 u5 a2 d- J& s9 P+ [ CLR RW
, D0 p9 d' i/ U& T( E SETB EN; X9 h/ p, c4 M; ]: m2 k; g
CALL DELAY0; Q4 v+ Y. M; l5 _! U7 `
CLR EN
7 Z8 J! g9 I% ?, r4 u4 K, o RET
9 @' `0 R& ]1 N7 ^1 C/ W: S5 K; U( ^+ D' c) Y4 A3 R( q5 d
WDATA:) {9 T7 K5 A# |7 p' S2 J0 ~
MOV P0,A ;写数据使能
9 y0 e. X! B, l v SETB RS ;RS=H,RW=L,D0-D7=数据,E=高脉冲
) V0 X1 ^6 P J( V4 b' } CLR RW
1 _% |& E0 k( |2 I8 q. F9 ^ SETB EN
9 Z5 @0 Q# z3 _& X5 k CALL DELAY0
/ O7 b( p! _; |/ |( x: K, i# D! S CLR EN b1 R& V: m3 K
RET
+ {, g- S1 ?, ~* \' z {) e' C4 o! ~$ m
DELAY0: MOV R7,#250 ;延时500微秒
- i+ @, Q: Q* a' ^, e3 _+ G DJNZ R7,$4 w& ^" g# O1 V& y( Q: r
RET; Z# C* I" c6 F5 i/ z9 \
;---------------------------------------------------- {4 R# X" f# E5 f
;在 LCD 第二行显示字符
6 A% [5 D2 R, t- `8 i- g# w. a8 y0 H;A=ASC DATA, B=LINE X POS. K! ] { V# s( U4 o" w) {
;---------------------------------------------------
& n- V! M5 Q7 C+ A& T+ F9 GLCDP2: ;在LCD的第二行显示字符
1 W6 W; }; ?' e r$ Q( \! z PUSH ACC ;
) s' x3 w3 t" l+ `3 K7 K MOV A,B ;设置显示地址3 B3 }, }0 g& y: C: V
ADD A,#0C0H ;设置LCD的第二行地址& g( x- X( h1 c* S7 i7 V8 K
CALL WCOM ;写入命令
3 l& a# }$ W% _! x! h! z POP ACC ;由堆栈取出A
" ^" b8 a2 H" h) d2 _& B CALL WDATA ;写入数据
1 H8 E- |1 P/ p/ T2 j6 N8 n/ K* v RET7 d3 f7 D5 b& Z: T5 l0 B
;---------------------------------------------------
$ v8 ]* }; A$ f) x0 c8 g0 Q' t2 b; IR 译码子程序
- u( d3 ^4 d4 Q) O7 d& s;---------------------------------------------------
. x) ]; B" L) eIR_IN: / m; T' N7 }, s7 f7 t% t+ g. F
MOV R0,#IRCOM
1 m7 z2 [/ M6 z E, N I1: JNB IRIN,I2 ;等待 IR 信号出现
3 a( P% {1 j8 H% ?4 K JMP I13 \& D4 `* A, c5 ?; D+ s$ Q) L
I2: MOV R4,#20
- D) q; f, G& Z7 C I20: CALL DEL4 ~1 f' m7 o/ J
DJNZ R4,I20
: t" ] @! g$ k) J/ T8 S JB IRIN,I1 ;确认IR信号出现
# L; u$ u$ Q, v4 O2 M I21: JB IRIN,I3 ;等 IR 变为高电平
, n2 p- w2 ^& g! M& E/ c CALL DEL8 N/ ?) `* e- j% l
JMP I213 n7 `+ O. _8 x l: P4 }2 [
I3: MOV R3,#0 ;8位数清为0. t: P7 K, J9 v1 }
LL: JNB IRIN,I4 ;等 IR 变为低电平
A c0 v1 j* v7 S CALL DEL- J, |7 N& L$ i: Q* A+ }& R
JMP LL: Z4 c+ r1 ]- K Z& {
I4: JB IRIN,I5 ;等 IR 变为高电平
* y+ y8 c% h& v8 H) h$ R0 V# ?( A CALL DEL
/ @' V5 a, x% n4 V$ H7 i: c* a3 j" T JMP I4, \6 f& U6 ~+ X( Q7 `! _0 g' x% r
I5: MOV R2,#0 ;0.14ms 计数7 r3 I+ Q" ^8 ]: {+ \
L1: CALL DEL
) O9 a6 q9 v5 @. o6 u; \) i) r4 Z JB IRIN, N1 ;等 IR 变为高电平, K) V( x" |6 U1 X% o
;IR=0,检查R2中的计数值 - g; f0 T( l9 U. e: j$ C
MOV A,#8& Z: u, r) b9 C
CLR C& N; s2 A: a- k
SUBB A,R2 ;判断高低位
8 p2 K- K4 m( b4 n/ T% j) X; Y- H0 b ;IF C=0 BIT=0
$ O6 `- ], j& ^! Z0 r MOV A,@R0! m8 E& M6 b2 n. k
RRC A
1 j/ a* ?; P' b9 J MOV @R0,A ;处理完一位/ Q2 `# V; w: [1 ~/ t
INC R33 G& `' V8 b" \6 H4 Q, f% C
CJNE R3,#8,LL ;需处理完8位 # c8 A* [/ M0 k& `3 d7 l; p& v r
MOV R3,#0! y- {% E$ _' ^+ I
INC R0
F3 c V& I2 m1 c+ j6 H' L' f CJNE R0,#24H,LL ;收集到4字节了' C+ R* I' I" z5 L: e6 f; A
JMP OK" n7 f; z1 l; j- E: e
N1: INC R2$ [1 I- ]% c* |* d2 w0 J9 K
CJNE R2,#30,L1 ;0.14ms 计数过长则时间到自动离开3 Q; q; s9 i0 E" O
OK: RET; H9 c4 z. Y- ^. w4 `5 O0 Y; {
;--------------------------------------------------------------------. P7 e5 m! ^' l, f% q1 I2 J, w
IR_SHOW:6 j( b& N4 u7 |
MOV A,22H( o8 W- g5 x/ b4 m" q$ G
CPL A ;将22H取反后和23H比较/ |4 l4 u3 b1 g) l
CJNE A,23H,IR_SHOW1 ;如果不等表示接收数据发生错误,放弃。) q R) T0 l, A' v- z% y( I, l
CALL CONV
6 M% u; Y# @" F, E; CALL BEEP_BL ;蜂鸣器鸣响表示解码成功
! w4 _1 j3 U) e# eIR_SHOW1: RET
4 P& z4 z2 K1 Z& l0 N. t;--------------------------------------------------------------------
- g2 ?3 X# m. J' _9 v x$ r4 I;转换为 ASCII 码并显示
: h- P7 y6 J# I9 V, }8 T;--------------------------------------------------------------------
" ]+ s" G* j5 M" Y# e [; f& T6 q1 q# [9 L* qCONV:
) e" C/ m. Z6 U" w! ~+ }$ O MOV X,#11 ;设置显示起始位置
; k" u& O4 g; |0 R* \2 Z6 |2 R5 i MOV A,22H
8 @" r+ ?& O4 X ANL A,#0F0H ;取出高四位二进制数
* b9 j& L( { T7 i% o. L' | SWAP A ;高四位与低四位互换
. r/ h! s) a: [( g! \: Z; r2 O PUSH ACC ;压入堆栈, E4 c6 H7 ^0 j5 ^2 E5 E
CLR C ;C=0
: c8 t+ M0 }9 g( S; N SUBB A,#0AH ;减10
" e, J6 j, h* s) [- o- L# t POP ACC ;弹出堆栈
0 v2 { d/ a$ E JC ASCII0 ;该数小于10,转ASCII0
4 q$ @' I3 ~$ i" Q. T ADD A,#07H ;大于10的数加上37H- w# H/ n; T) e/ R' m3 F" R0 V
ASCII0: ADD A,#30H ;小于10的数加上30H) |3 j2 Z- M; o* ~& W
MOV B,X
0 O2 l, D) g6 v# Y3 x5 b% Q7 G CALL LCDP2
: [2 U" D7 E7 M% `1 h, F4 r3 A
# G# f8 i. G8 E# s) X1 r7 \* t MOV A,22H$ u! ?" N8 {3 x
ANL A,#0FH ;取出低四位二进制数5 u7 n; X, r( f: `5 Q; s# S; f! c
PUSH ACC) M: {: n& E& A( y
CLR C* G4 D1 P9 m. }" K u7 m7 x2 U
SUBB A,#0AH ;减10, o$ y6 z. O1 v4 V
POP ACC
& b% x9 M9 { l1 g6 ]' x+ | JC ASCII1 ;该数小于10,转ASCII0
5 {6 q: ?5 o3 ]% o& z ADD A,#07H ;大于10的数加上37H
; q' n# P0 ^. \- [) Z% gASCII1: ADD A,#30H ;小于10的数加上30H# l5 L- E- q5 C' f* [
INC X% c1 D! O& b4 H' t9 M
MOV B,X
; x0 K$ d" @! _5 z7 n5 O9 z CALL LCDP2
5 Y! j d, j- H' E% U3 J2 r RET( l" e1 p" \7 R* K) e. x% x
;--------------------------------------------------------
6 Z& M' Q* N! ~' F;蜂鸣器响一声子程序) w1 {# X7 n' ~; F: a
;--------------------------------------------------------2 F7 e7 d, U$ V T
BEEP_BL:* J1 ~ u; p- F/ B$ R
MOV R6,#100$ }0 j0 ?& Q* P
BL1: CALL DEX1
% |) L! \: `; j; CPL BEEP: b0 W5 d- `) l! Y
DJNZ R6,BL1, a. t$ x/ `1 `) A( U- F1 V
MOV R5,#25
8 r- R* O5 g# m+ r6 |7 u CALL DELAY
# {; m, F6 m9 b. @" @- L RET
2 T/ F9 a0 M# M! p* E" x DEX1: MOV R7,#180+ \$ ]$ l; E8 {7 h$ \" y" R' |0 `# w
DEX2: NOP% h0 O/ @0 C4 c* m3 B
DJNZ R7,DEX2
: V9 n M0 g f7 e C1 k RET2 F" o2 e( M" p) u: d8 \* D
DELAY: ;延时R5×10MS
# r# s) U( J) z2 S4 G* u" w2 \$ E) D5 _ MOV R6,#50
: v5 ]% g: j9 l; @ V D1: MOV R7,#100
9 r9 f+ k, z6 k% N" _/ c0 I8 G+ { DJNZ R7,$
1 S6 f0 Q0 B* b DJNZ R6,D1
5 [5 }0 s% X C1 C, J2 L DJNZ R5,DELAY
; t* l3 l% R- n8 r
# A+ V+ a' V, O3 x
' V& w2 F/ E$ v6 q…………限于本文篇幅 余下代码请从论坛下载附件…………) p' R3 L7 `6 @5 x. Z; z
0 o. q- L. m# C! r" M
- [; x; H1 J& {- o* w
! E/ |) B" s; n5 w- J5 @' C8 m* G! {4 H' D
|
|