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

51单片机的红外计算器程序源码

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机的红外计算器程序源码& j- V2 u" S+ N! N: Q3 K9 ^
lcd1602和单片机接口自己在程序中看5 V# B6 [' F- ?, S& c
单片机源程序如下:4 g/ {0 e# Q: |' `4 a3 o

9 P( O5 p( z; V$ P+ h

( _' ?( o9 [$ `( W, K% N) E# w#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
9 w7 \8 i4 ^! k' ]" c#include<intrins.h>
( ]& p* v8 k' c& R/ esbit RS = P1^7;   //定义端口  L- X0 z, ]) s3 {. h
sbit RW = P1^6;$ }5 B- u; g' o6 S  \6 I
sbit EN = P1^5;
3 ^' E+ J8 d5 `4 j1 `8 U% f1 \9 ysbit datk=P1^2;$ b7 d' t' h! W) ]1 j( p/ B
sbit rest=P1^3;' c. \: y, D! a3 `
sbit IR=P3^2;//中断0,红外接口                                                                                                                                                                                                                                                                                     //红外接口标志8 |* [! J; ]8 b- y0 R
#define RS_CLR RS=0          //选择指令寄存器
9 @* a& A8 b* {: D8 i9 [: W  ^#define RS_SET RS=1          //选择数据寄存器
* v+ _2 s, m- W( C9 k#define RW_CLR RW=0          //把单片机数据写入lcd- m8 r) o3 m. ?$ F# r& g
#define RW_SET RW=1          // 把lcm的数据读出到单片机5 z2 k+ n1 Q* G$ a
#define EN_CLR EN=0          // 允许对lcm进行读写操作
, ]4 J5 I6 a7 @/ }- ]8 U! W#define EN_SET EN=1          // 禁止对lcm进行读写操作% R# J; W! B. a
#define DataPort P2 //定义数据端口 程序中遇到DataPort 则用P2 替换* K! w, n2 g; ~! M- p0 B
/*------------------------------------------------) {' Z9 y+ L3 g' s' E
                全局变量声明" B. E7 J8 k* H8 F+ N* g* y
------------------------------------------------*/: a6 v$ N# x3 g9 m8 d( \
unsigned int p=0,flag1,qingchu;0 F7 d% `& G/ w6 g% o
static int a; //静态变量a
# q& y! `/ L) x5 h* k4 c5 y/ Uunsigned char table1[4];3 L$ o) L0 ~8 s5 A" ?  Y) j  j2 V2 h
unsigned char  irtime;//红外用全局变量% _  a$ u5 r. i9 E  i  n2 `' x
) b0 P: P  P: O* I0 n$ r
bit irpro_ok,irok;
7 o# H, _8 P$ p) n0 Aunsigned char IRcord[4];     //四组数据,
# x# C% a. j/ b+ T5 i) U  munsigned char irdata[33];        //前导码加32位数据5 i* C2 h" R1 |
unsigned char dat[] ={'0','1','2','3','4','5','6','7','8','9'};! s6 P0 [) e8 N# c$ c# B2 }
/*------------------------------------------------
' R2 U0 Q5 `( t+ V3 Z" U' J& T                  函数声明1 k4 q$ ^- w+ L5 ~$ e8 N
------------------------------------------------*/
1 T4 ]# F) @6 N) q
; T( `/ I, o: O: i5 u3 Evoid Ir_work(void);          //红外键值散转函数
/ o! c1 s8 Q0 Wvoid Ircordpro(void);  //红外码值处理( j' o0 _. N/ X; Z
void Delay10ms();                //延时函数7 i" X( a$ R& e6 \8 ?# O
void delay1ms(void);           //延时函数9 e9 j4 Q% Y2 S- e
void music(z);                        //语音函数3 J3 l& _, `* o9 ?& q( o5 t
/*------------------------------------------------
# j5 h3 o9 m* {2 ~4 @ uS延时函数,含有输入参数 unsigned char t,无返回值, J: }1 [- _/ t0 z8 L* Q3 p
unsigned char 是定义无符号字符变量,其值的范围是' {4 N" y* \8 s9 M( L
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时4 F4 ?0 m" a& D8 o
长度如下 T=tx2+5 uS
7 }# H! ~  ~3 K$ W, I------------------------------------------------*/+ M+ a( [9 V& h6 Y" F4 ]+ }# ^
void DelayUs2x(unsigned char t)7 i* H4 `; j& b6 V& Z! {: D
{
  c$ ?3 a+ N0 ?2 G; i while(--t);0 q/ s- V4 ]; a0 B: `  |: c
}) t2 W6 }4 `7 A  _6 ~0 F6 ^2 y
/*------------------------------------------------
- w% |; ?" n1 v) x: s7 h mS延时函数,含有输入参数 unsigned char t,无返回值
5 h9 j; Z6 U0 @* n  {3 e8 w unsigned char 是定义无符号字符变量,其值的范围是
. t, U8 e0 f% w4 o6 V" X" Y2 y0 D 0~255 这里使用晶振12M,精确延时请使用汇编
7 U; z  l% e9 _4 s------------------------------------------------*/
! t7 {' E' u1 z0 |; @void DelayMs(unsigned char t)/ V4 _' O( D( j1 R' R0 M
{7 |/ g! `/ x) O& L) a8 c
! E# t2 O! A0 A! P" h* {4 r% y7 f
while(t--)
* R7 g2 {; S: w+ c {
' l8 L( w* d0 d' a     //大致延时1mS& b5 [8 h, t6 {7 s; d4 P
     DelayUs2x(245);4 ?' t5 i' ?& ~' C
         DelayUs2x(245);7 x& W' v' ~! a. Z
}5 J( Y4 I. m4 x4 |: D* b6 {
}% U- b2 @: X8 u4 y* j9 T" ~
/*------------------------------------------------% X) }0 b  V5 C! c
              判忙函数
: S+ n- X: [* l7 ~7 Z3 d7 R------------------------------------------------*/
7 i3 V" m" g& _* N) D0 @) U: p- h bit LCD_Check_Busy(void). R( A( l5 X( L1 h1 o; P7 D& a
{
7 d" H6 U. u) S' y% ^% K DataPort= 0xFF;6 l# W0 [( Q9 T
RS_CLR;     //选择指令寄存器, U- t+ _$ ]0 ~7 D2 f" o1 D
RW_SET;         //把lcm的数据读出到单片机
! o+ ]1 |, q3 m% z EN_CLR;         //禁止对lcm进行读写操作
3 D/ S  s" Q" J8 r) j: y _nop_();
  R$ c/ m0 b1 q EN_SET;
4 ]+ L! \5 e6 U9 V2 O return (bit)(DataPort & 0x80);
) p$ H/ r- l% ~5 U) y2 _ }. e, d$ d( v( }' M9 F
/*------------------------------------------------- I$ Z5 w+ ?1 g* [) k% q7 G
              写入命令函数( P5 X& T- e) I+ O2 k% ^
------------------------------------------------*/
! X# c2 X$ _+ o/ Q- E/ j5 }4 C! K void LCD_Write_Com(unsigned char com)
' [- I6 J& ~' z8 V9 u. w8 v4 H, C7 V {. @- J0 B, S0 X$ x$ Y. Z0 k9 |
while(LCD_Check_Busy()); //忙则等待7 K) k' W( S' t/ u* x2 o) k
RS_CLR;; I7 ^% b# b5 g. Z
RW_CLR;
( t% f; ?" y+ x* i6 { EN_SET;
2 U& I; M+ q& K1 {5 u9 T  G DataPort= com;' v- E; o# v6 H: K2 e- U6 j
_nop_();( }7 s# ~: t7 k, a# N9 ^
EN_CLR;  T# {4 q! R, n: ~( L
}
3 s. r! J) Z. K* X* B/*------------------------------------------------/ m! f, l6 \% y) i. {# n7 g
              写入数据函数7 Y  r% S; [- P2 J- h' o' C
------------------------------------------------*/3 @! H9 [& S+ P' S9 Q" o
void LCD_Write_Data(unsigned char Data)% k) `* a' y0 l; o6 S8 S& P5 `
{' M2 j" j. S2 @* Z$ ^) k
while(LCD_Check_Busy()); //忙则等待
% L6 w/ x+ {3 Z! M. b: G- N4 Y RS_SET;
( X! x  |8 j- u: j0 ` RW_CLR;( y, p2 M* G0 m) {5 {
EN_SET;
( D0 f, ^; }% S. P0 ^# ^ DataPort= Data;2 _, ~6 _. g9 W) w! v
_nop_();6 x" b3 d9 _& q1 @. \4 u2 i
EN_CLR;! k7 Q4 A) n5 b+ W
}
5 e0 x7 L  x, q+ f5 f* f5 [1 x' Z& l( z/ k3 ?- t6 _
/*------------------------------------------------
3 o4 C( C7 Z+ B                清屏函数- X0 b* k' ~' C0 y+ N
------------------------------------------------*/2 e& a+ k9 ^" s- e- Z% t; d
void LCD_Clear(void)
; \2 m* G2 h5 U" {7 Q; O8 q1 ? {/ z( ?; k: v- g$ @( I# W
LCD_Write_Com(0x01);' R8 D; X# V4 R. k
DelayMs(5);- b% P" H; c, p4 ?
}0 D1 W- d" Z- n- ?- `' ?

2 _% ]' @  Y# @/ T6 N/*------------------------------------------------7 d2 U; D% k7 M7 j7 x
              初始化函数/ T$ c" u9 B$ w# g1 C$ x' M
------------------------------------------------*/) [2 L# @9 H7 L$ R) ]$ u5 r
void LCD_Init(void)
) f9 M; l5 f" z {
  ?" v( n& f, t% d! R" w   LCD_Write_Com(0x38);    /*显示模式设置*/
" g1 q% S: z% |/ Y2 D: s   DelayMs(5);+ X$ U/ B9 {6 c7 {
   LCD_Write_Com(0x38);
9 C' P) `8 Y, M: y   DelayMs(5);
* I* ~9 m$ J* L0 ]% T) R3 C   LCD_Write_Com(0x38);
4 A; G  f1 J( [( X& |   DelayMs(5);3 F. o7 P) [1 a* w
   LCD_Write_Com(0x38);
: R& `8 A$ H, S1 L* c/ N4 ]2 B   LCD_Write_Com(0x08);    /*显示关闭*/
( X0 s0 G' n" J# p   LCD_Write_Com(0x01);    /*显示清屏*/& Z8 p# e# ~7 x2 R
   LCD_Write_Com(0x06);    /*显示光标移动设置*/% e/ I/ V% ]' [  J: Q
   DelayMs(5);
+ Y- Y5 n/ E1 O   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
- |* g  f) R" o1 U: F   }
0 {9 V5 [: w* F# K) M& U  p
, _% G( |, ~' _& ~: t/*------------------------------------------------
9 v7 b; u1 a% V$ K; J                  定时器0中断处理
0 t0 A+ P& c! g+ F------------------------------------------------*/8 \% p! k" A! a9 T

# @- }3 `* E3 [: A6 t9 v" Tvoid tim0_isr (void) interrupt 1 using 1! h. E! }+ ]4 H
{
9 S1 s5 H& V# @! P  irtime++;  //用于计数2个下降沿之间的时间
' f" f4 r  B# U}
: M% R6 h9 j7 ]+ B8 v
/ W0 X* K( C: J& S# o1 [/*------------------------------------------------3 H, z6 T2 \7 R+ J1 K  [4 B- r
                  外部中断0中断处理
$ i1 u" h$ ~. p, ^# X------------------------------------------------*/* j! v2 B2 w5 V0 x! t* X& s. p! G: o
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
8 P% m" @! _  e2 q8 J( M3 l1 a{
% ~; u$ O9 q7 ?  Y7 y7 a  static unsigned char  i;             //接收红外信号处理
2 k- j- B  J% ^+ M4 _/ n  static bit startflag;                //是否开始处理标志位
9 O: Q8 ?9 n& M' s% ]+ x5 Q% A
7 |8 s7 L* W1 D; D0 T6 f* ]if(startflag)
4 g( p6 ?/ K. d' W2 J   {- `  O8 u! J8 Z9 Y: ]
    if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms9 i: }+ l) y- n# z; B, h' k
                        i=0;
  a( ~! r3 t# P                    irdata=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
$ M! p3 R$ _8 b/ j% {8 f* M                    irtime=0;
$ r5 |1 x4 o; _$ X                 i++;! S3 w  N7 @3 N6 D* G
                            if(i==33)
) d" U( v) J$ i' l! k                              {
8 Z; w" @/ @% {, i5 T                                   irok=1;4 Z! ]& X  L: T. i/ }; d3 D
                                 i=0;
4 Q8 m" E$ S9 h' b- o0 }+ O                                  }: t, ~$ z& g% h* s# y8 c
          }% [  f0 B1 P$ I9 K: T2 l
           else/ u, ^/ a8 O: F$ w0 I
                {
8 e: \$ n% `9 a- V, Y* f                irtime=0;
6 A+ B( f  r( U3 B' `, N* I                startflag=1;
, M6 u  i1 E) J- e  K2 R! H1 Q  F                }1 U; X5 v( ~. O# y7 Q( U) F) P
- o9 D- x$ s/ g
}
3 ^8 _, c7 \# h# R+ V
9 H: k& D, R: h: k) [0 v1 \" v5 e
, v* p  F  \% f( B$ J9 P
void music(int z)
* K4 ^( @9 V) O) y+ n+ }' ]) N{/ W  K: S- V/ @; V4 S8 g
rest=1;; g4 ~# ^* G3 ?) ~9 O% P9 |
delay1ms();7 B, ?0 ^" h& h  {7 d# `
delay1ms();
$ G+ B. C% ^  r/ grest=0;
5 f5 i! F7 t* _5 ?delay1ms();
0 Q/ o3 N7 v, L& Z' ~; E7 kdelay1ms();
0 H0 i5 N, o' y( N- f            //前面给语音复位,详情看语音资料) A) Z# r* V& R& m) J. p- {" e' }5 Z) j
while(z>0) //给b 个脉冲让语音播放b段语音2 j7 K. I6 q* B
{  l, M9 F8 M) D
datk=1;+ ]4 S5 ~- N- X
delay1ms();
+ P2 t( e9 D9 Ydatk=0;
; I  u: O- S( S2 ]) z; Tdelay1ms();$ |8 D# W1 T4 j; s) F
z--;4 L7 [3 @0 }% r8 H2 V
}         }0 E2 R" `0 H9 D) Y: ?
//************************************************************
1 j6 X0 ]; R* a6 Q- ]void delay1ms()
4 p  ?2 a- d$ B7 p- a3 p0 T' D7 ?{
) b+ W2 D" z* [, g$ W         unsigned char iii, jjj;# `5 r" R/ k; ]& u: V
; t, Q: p6 Z& P' a# i
        _nop_();9 o1 u- q1 P3 G3 R5 A
        iii = 2;: t7 k6 J! ^; ?! T" l$ [
        jjj = 199;& C' ^$ L& S8 \9 t
        do  ~" V; {) z( i1 m3 f- C3 N& _6 A
        {
; X4 M# j5 F  q6 j% X+ y" l9 W                while (--jjj);
- f& ]) t9 u  N/ f        } while (--iii);9 J' p1 @9 T3 [7 H4 i: Z
}
8 T" z& \# @; Xvoid delay(void)   //误差 -0.000000000227us
# d' Y. `, u! T2 f{
2 L# R* ]0 o/ o9 v8 r    unsigned char a,b,c;. u  q& v& j* ]( q4 Y  p# o7 F
    for(c=13;c>0;c--)& G6 F6 A' B2 {$ r0 W" s9 O# k
        for(b=247;b>0;b--)
( w  Y/ p1 u, J4 z            for(a=142;a>0;a--);" F0 R9 @) `: F/ O' ?! e2 P; h
    _nop_;  //if Keil,require use intrins.h5 r/ |) y" |: E+ b) G7 A, ]! a4 @
}0 Z% |# v0 N9 t5 m) U9 V# f2 K4 j
. E' \% \2 y* x; N2 Q0 g1 s
& P& e, f2 i1 E* K
5 ~, B9 X2 D, T9 s; k. X
/*------------------------------------------------
7 Z" e9 R% ]7 l" Y8 W6 V                定时器0初始化
0 f! [5 h7 K& [------------------------------------------------*/* K3 n" t% [. U6 e5 {& M3 J8 [
void TIM0init(void)//定时器0初始化1 U) Y& h8 Y1 O* k! V3 P. V: X
{1 W0 c& j' [& E4 E
0 a9 y- @0 f( j, [: x
  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
6 W* u, D" V' H- Y: Z. t) k  TH0=0x00; //重载值' D. A" {# V2 }7 c9 ]
  TL0=0x00; //初始化值
8 p/ \/ g: D7 D( f  ET0=1;    //开中断
3 i/ k* ?1 x6 ^% D; K, W0 z" R1 w  TR0=1;+ k- Y5 T& K0 Q) `0 q: d
}        0 h/ M( N; T% O. ^$ X& p5 E: o: ]+ ?& z
/*------------------------------------------------
1 \4 W' F3 M! D( N. z: h                  外部中断0初始化$ N7 u4 s% p$ J* r
------------------------------------------------*/% @' N6 W& {: t& }* B" J
void EX0init(void)
" d3 }! F* d5 k# |/ |/ z0 _) A{$ K) S" e! Z& C$ i; N8 y
IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
* C* p* K# K  ~( I0 C EX0 = 1;   //使能外部中断, R& O  F/ c" v! q! o6 [6 O
EA = 1;    //开总中断
. {3 j' E7 u8 S+ b+ E8 j: }3 X2 j2 w2 P
}
. q4 T! k9 |! I; i/*------------------------------------------------) R  \* L6 \: U+ L8 Q
                  键值处理
( f) N$ P- G/ p5 x4 A------------------------------------------------*/
6 Z6 s* p5 t2 m9 hint display(int j)" L$ t) z& o1 g* C$ j% I- d) X4 J
{7 m( g8 H" _" M( `, _
        int k;7 J" U) u; g! v1 ~" W1 z6 |8 q5 u
        switch(j)//判断第三个数码值
6 C  G0 n3 W- S9 J                 {9 g2 S0 y* t: D& A3 M2 Z4 B
) q( q' t/ t  d
                         case 0x16CD_Write_Com(0x80+a);LCD_Write_Data('0');k=0; a++; break;//0   # H9 P2 S" M+ L! U* E+ v, R0 ~
                         case 0x0cCD_Write_Com(0x80+a);LCD_Write_Data('1');k=1; a++; break;//1 显示相应的按键值
3 x) i) @" v  a! Q/ k1 {; {                         case 0x18CD_Write_Com(0x80+a);LCD_Write_Data('2');k=2; a++;break;//2! c! G9 {& e+ g7 @% Y
                         case 0x5e:LCD_Write_Com(0x80+a);LCD_Write_Data('3');k=3; a++;break;//3, I! d$ I8 l- h# e
                         case 0x08:LCD_Write_Com(0x80+a);LCD_Write_Data('4');k=4; a++;break;//4         4 R: c, h- i% d7 g  `" k2 K
                         case 0x1c:LCD_Write_Com(0x80+a);LCD_Write_Data('5');k=5; a++;break;//5  
7 \8 C" R. U" v. E# j/ X                         case 0x5a:LCD_Write_Com(0x80+a);LCD_Write_Data('6');k=6; a++;break;//6 显示相应的按键值( M& P+ |) l8 N5 Z8 e
                         case 0x42:LCD_Write_Com(0x80+a);LCD_Write_Data('7');k=7; a++;break;//7
, d3 C; h& u0 n; }+ {                         case 0x52:LCD_Write_Com(0x80+a);LCD_Write_Data('8');k=8; a++;break;//8" t. g. y, v3 G5 i) }8 V( b% O' q
                         case 0x4a:LCD_Write_Com(0x80+a);LCD_Write_Data('9');k=9; a++;break;//9
" d1 K) [- j) i3 x6 A$ N) S           }! E: j/ l8 I. Q& x0 `4 a
' t- ^* G1 y0 u( w" N! s. |
        return k;
7 M/ V& X7 O: `, V0 o}
, M1 D8 m1 \6 ~/ I# |# C! _
5 y" E7 V4 d7 |! M2 K" D" evoid Ir_work(void)//红外键值散转程序
) U, X6 B' ?5 k6 U3 f7 L{
" X5 [/ n+ K' N' x0 j
; _! N( ~& N4 `0 d. X1 Y         int k=0,flag1,count1,count2,count3,count4;0 i0 b" q4 S! {) W0 K1 t
         int table1[6];) z8 y4 J4 ^* S1 I$ v9 \6 i, a0 h
         int count;1 v: K- c0 ^% h$ F; n! r8 X% ~- l
         if(IRcord[2]!=0x09&&IRcord[2]!=0x44&&IRcord[2]!=0x15&&IRcord[2]!=0x40&&IRcord[2]!=0x43&&IRcord[2]!=0x07)
! q& G  ^- L1 v; o3 _. X         {
! j# f3 \/ q* v6 v         k=display(IRcord[2]);9 |& @/ `5 \5 c6 s. a4 z4 k* E8 O4 B
         table1[p++]=k;9 V8 X" h. u: V  c
         }; d! X* ?) d% U5 P0 L2 N
        else  if(IRcord[2]==0x09||IRcord[2]==0x44||IRcord[2]==0x15||IRcord[2]==0x40)+ _4 W1 \8 t" G# p  d7 v! M
         {
: Q5 t/ Z, b3 m                 switch(IRcord[2])1 Q3 i( Y! R8 |" C5 @* Y/ K% ~
                {
# g/ p7 P$ R! w5 y9 [- g* r                          case 0x09:LCD_Write_Com(0x80+a);LCD_Write_Data('+');flag1=1;a++;break;//+  ! p7 l, A, R9 i5 X
                         case 0x15:LCD_Write_Com(0x80+a);LCD_Write_Data('-');flag1=2;a++;break;//-显示相应的按键值/ d6 h9 x4 |% l
                         case 0x44:LCD_Write_Com(0x80+a);LCD_Write_Data('*');flag1=3;a++;break;//*4 Q$ h5 ]9 [5 Q
                         case 0x40:LCD_Write_Com(0x80+a);LCD_Write_Data('/');flag1=4;a++;break;///
+ Y7 _% d  Z+ E8 A0 V& s                        //case  0x10:6 u. i$ _' Q( x( R, {3 D" @
                }' V1 @( s1 S! g8 j+ Z
         }( x! u7 R9 U7 y% m$ u- f& z# D5 v1 _
        else if(IRcord[2]==0x07)
" I" l* K3 @0 o3 v! N         {
- }- i8 R, W: j( P2 X                         LCD_Write_Com(0x80+a);. q- N) H' n1 r& Z
                        LCD_Write_Data('=');! t# y2 [0 I, ]+ D2 z. l
                         switch(flag1), G& ?, A. k* v/ z
                        {
, R/ ~1 ?$ k, V. x5 F2 I; k$ @                                case 1:        count=table1[0]*10+table1[1]+table1[2]*10+table1[3];/ k/ p) w7 d% [
                                if(count<100)$ U: Q2 w7 T, ?- H( P8 N9 R% \
                                {# ~/ f% I& O3 V/ G' Q2 m8 I
                                        count1=count/10; * b4 T: r: H4 @
                                        count2=count%10;  
' }) Z' e* D# a4 z                                        LCD_Write_Com(0x80+a+1);
! g; w' p- N2 k% W; o1 v                                        LCD_Write_Data(dat[count1]);# ~$ {4 Z: P; {

+ [: X; ?7 g: L* J                                        LCD_Write_Com(0x80+a+2);
- V1 ~" [  L1 G. B5 q8 d  B4 D                                        LCD_Write_Data(dat[count2]);' R8 H- L+ w# b- m- l4 E4 e
                                        delay();
6 {/ L/ l( ^# U8 g                                        music(count1+1);
, @1 }2 |! m1 z* P/ E9 t( G/ C                                        delay();" ?1 g- D, W" p. \  r: F) ?9 s
                                music(count2+1);
1 R: c  I# M$ r; z2 `' A                                        delay();; S& I5 p, F7 n2 }! o, }
                                }
% v' l! U0 |3 o& V% c9 N/ a8 E                                else if(count>=100)% y3 v: y8 |% c
                                {! U' V1 w% V2 e1 R+ }1 Y
                                        count1=count/100;         LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count1]); # Y0 B) z% ^1 I( f
                                        count2=count/10%10;         LCD_Write_Com(0x80+a+2);LCD_Write_Data(dat[count2]);% D- C0 q& j  z! d3 `' U3 O
                                        count3=count%10;         LCD_Write_Com(0x80+a+3);LCD_Write_Data(dat[count3]);
; J- Z' T4 u9 M9 k; \2 ^                                        delay();5 k, z6 `- Y9 H' C$ k7 b' L" i. H" u! k: [
                                        music(count1+1);" E9 m9 T1 i' w7 F+ Y/ e' X
                                        delay();
$ t4 V7 p. F# l8 m- l                                        music(count2+1);9 w/ c# N3 }! T3 |( n
                                        delay();
/ m  m) U% L* [) x; Z5 n                                        music(count3+1);2 e! y5 w3 O8 @  D' ]4 d8 q
                                        delay();" p8 ]6 d6 r0 Z/ d* h/ N1 f
                                }; B  k" j$ ]( b* [
                                                                break;
) n, s6 ~6 P& r) \: }0 T2 D                                case 2:          count=table1[0]*10+table1[1]-(table1[2]*10+table1[3]);& x( z; j; s( _+ e- O
                                                count1=count/10;           LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count1]);
6 ]  u! h$ i7 b1 `                                                count2=count%10;        LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);
0 B2 ]: P; I: x+ \2 H" X                                                music(count1+1);3 _, Q* E  K  f" H* W3 B
                                           delay();  _  }7 k7 |- y! b, a( a
                                           music(count2+1);  c% e$ ^; Z5 V* y. s
                                           delay();
: Z" x* Q/ u% z) _( N. }                                                break;
. o# c* ~1 y9 `4 S/ V6 _& A% ~8 e8 l! z6 c$ t
3 Y7 y( z8 L5 t( _6 {8 A4 M
                                case 3:count=(table1[0]*10+table1[1])*(table1[2]*10+table1[3]);; y0 H8 E' M, V1 g  V
                                        if(count<10) { LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count]);}  t+ C! A. Y+ c) i* M
                                        else if(count<100)
& x+ D8 \2 K  G6 @( W) Y! J& B2 Y                                        {
' P/ J0 W9 p6 c2 P  C                                                count1=count/10;  LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);& A% O* j3 v$ Y& {
                                                count2=count%10;   LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);; N  T! q: r7 G& z
                                            delay();
9 W1 B9 ^+ j3 F- ^1 }                                                music(count1+1);. @5 L& x. l9 R& Z: v7 I
                                            delay();( b, D8 T1 _/ Q
                                                music(count2+1);* k! x& \! o; o
                                            delay();
% ?7 g9 h/ O; H  X                                        }
+ \# E5 G) ~3 [5 y
5 @7 p* v9 R/ t' ]8 C  }                                        else if(count<1000)  s; f; h' H/ B
                                        {# Y* n/ i: F) ^# [9 c, ^7 W; B( S9 r
                                                count1=count/100;        LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);( o5 G8 C5 b& d
                                                count2=count/10%10;          LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);
. r; `& [5 P# [5 _8 Y% t% S  x                                                count3=count%10;          LCD_Write_Com(0x80+a+3);        LCD_Write_Data(dat[count3]);. a; y, B  O1 i5 d( ]* C
                                                delay();
; Y4 U7 H3 F0 g* O+ R/ d                                                music(count1+1);% O+ G) e- O( M$ N; {) p- @
                                            delay();
3 k6 g0 T' q& S& ^7 L7 v+ v% l                                                music(count2+1);
% u1 N( x4 W9 a9 W" g                                            delay();5 e0 g$ O5 v/ r
                                                music(count3+1);& Q2 p; u8 m0 x: X( L
                                            delay();
5 ^; }" Q; D, V5 J                                        }0 c$ _- [+ J: J( b* p
                                        else   if(count<10000)  ^  F* W# A* _7 q
                                         {" T& q) g0 F% n0 v5 j3 q; u. U( w
                                                  count1=count/1000;                   LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);
. a: f& A0 z; L' e: p+ g7 R  p6 D                                                count2=count/100%10;          LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);1 x6 O3 n  p& h; O
                                                count3=count/10%10;                   LCD_Write_Com(0x80+a+3);        LCD_Write_Data(dat[count3]);! s% \! Q$ ~1 g
                                                count4=count%10;                 LCD_Write_Com(0x80+a+4);        LCD_Write_Data(dat[count4]);3 v3 _1 n* `+ y5 B9 [1 x
                                            delay();4 O3 q3 i4 x* a. Z$ w% l2 d
                                                music(count1+1);
" m/ Q+ p3 i- T1 ?7 {7 d1 u7 c                                            delay();
, G3 P. f% T0 E& n% u* o                                                music(count2+1);
  K8 m) U, g/ Q                                            delay();" h5 B7 Z7 Z( g$ N" c0 _
                                                music(count3+1);
" c! [2 H; X' p( J' [: A. ~- V                                            delay();
; X- t- d; n; R, M  I( z                                            music(count4+1);
0 ?" B$ v& T9 i; ]                                            delay();. h4 E+ t  ]8 ?; X& w* K8 T
                                         }
0 e5 q5 w' y7 I0 V- ]+ _                                                        break;
% X! Y7 h: ?; \+ l                                case 4:                count=(table1[0]*10+table1[1])/(table1[2]*10+table1[3]);4 v2 }( [& O6 `/ g3 S/ A* g
# m7 R2 ^9 E, Y. |

5 h% W: X9 e/ _/ T5 C( q
9 v. d5 A  ]. j% ]0 S9 H                                 if(count<10), F# J0 p. O4 j/ M& D, P3 C
                                                {                                                              - }9 B& h% ~1 c' `
                                                  LCD_Write_Com(0x80+a+1);LCD_Write_Data('0');        //LCD_Write_Data(dat[count]);$ Y- i2 n! {" P# W9 z4 [: F
                                                  LCD_Write_Com(0x80+a+2);LCD_Write_Data(dat[count]);6 K; Q# v- j# y; r
                                                  delay();
$ Y& N" h4 E5 }( ]" q! y                                                  music(1);4 K& d8 ^2 G$ k2 _! F
                                              delay();/ W& w: D1 p* n% z  m% \
                                                  music(count+1);
& j3 t9 ?4 [. ]" W" O                                              delay();
$ i) d3 U/ ~! O3 U) ^2 y                                                }
% b9 Q7 G5 u2 O% Z0 x                                                else  : k) y: T8 |7 f
                                                {
: J& L2 ]" V* B1 I2 T                                                        count1=count/10;  LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);% U* h4 V# h# J7 S
                                                        count2=count%10;  LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);1 C6 E# p" j2 W0 Q) B0 r
                                                        delay();3 l8 F/ ], l% a8 h& J/ V% \( y1 @+ D
                                                    music(count1+1);& \. n7 \" ?& Z( q% P9 B) Y* `. {! E
                                                delay();2 `" Z6 v% T& Z: u
                                                    music(count2+1);
4 w9 j( L: _9 M2 v" e$ X1 T( p                                                delay();
. ~- Z' L4 _$ f2 Q# ]. c% @                                                }           . z4 t0 G2 ]7 A+ K; e+ m1 s
                                                break;& K8 y% \" U' Y3 r' a0 G6 J: @+ ~
                        }$ `. ^. ~* O+ |) `4 p( w
                        flag1=0;
: `, J- K( v" u4 B& c         }# m8 t! _- L  ]$ o
         else
  a: E0 O, l; ~' r         {
) h+ ]- X; K; N* ^5 H         if(IRcord[2]==0x43) 8 X* q1 E! f2 Y+ d
         {5 a( N+ }* `, s- W. Z$ s7 U% Z
                LCD_Write_Com(0x01);
( ^+ W8 R- j# x2 x# F( N         qingchu=1;$ S! Z3 K* ~4 F& P. A& b$ ?
* q2 E: A3 p2 W8 k9 L& B  H
         }. M+ r# S) W& c2 {! k- E( ]
}        0 B- F4 P% Q0 \

9 }* i6 V- o( ?$ ]# J1 Y: c6 n0 E0 m# a+ Z
}
; k- M& b# z1 m- J) s/*------------------------------------------------6 i# B* _9 Y  b; o8 @
                红外码值处理9 Q' d& {/ D3 @" s% q
------------------------------------------------*/
- a& {4 ?/ X0 M% Wvoid Ircordpro(void)//红外码值处理函数/ L7 I  p7 x! l! y0 f- {
{& h3 u1 e% e0 ^1 X
  unsigned char i, j, k;7 {  e, w: H! I: w
  unsigned char cord,value;
6 Y  g" c9 e/ W- o) a9 ^* Z' B
: a  q( l; K. M! u& S: b  k=1;
2 s6 ~* R, w1 _( H  for(i=0;i<4;i++)      //处理4个字节
1 \  S, F2 R. |5 E( Y! U     {8 y6 r* D  W4 ^8 w" w
      for(j=1;j<=8;j++) //处理1个字节8位
7 K1 P: Z- K# c% M/ O+ v         {
5 i4 X! q0 ~7 @4 H6 ^9 j          cord=irdata[k];
! R& R, E  S+ i* s( R' z          if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
9 k. D/ `% @' R/ D5 R9 n             value|=0x80;2 {6 b3 g, d2 B* x: K0 I+ S
          if(j<8)
5 a9 u. u! d* j. B                    {
+ }" b! A2 o& v- c  e+ y% u- l, U                         value>>=1;
+ |, c3 r3 D9 w) Z7 u                        }6 `" b6 ^( U" l: o+ A* Z5 M, c
           k++;" |7 [: z) N. c  k
         }
1 c' j. K7 d/ x4 }1 Z" I/ A- [     IRcord=value;
/ Y2 n: }7 Q, W7 R# q2 u5 f     value=0;- @6 Q# f/ {* Z) I" I7 }
     }
/ O2 P$ Y/ G0 z4 u         irpro_ok=1;//处理完毕标志位置11 k( {- L$ D, H5 Q5 ~( X
}" c! O( F/ N+ n9 k" T

' M% E' |% o  L# N  |2 n/*------------------------------------------------( [* ?; Q4 v7 h0 S+ [  ]
                    主函数
! W( c2 N1 c& A3 A* v& ]7 j------------------------------------------------*// T$ j; X; J( Z
void main(void)* s. d% l& W) W7 |
{' \  i7 G5 X& J5 X) Y8 H* B" P
int m;- ?) M6 U2 ]. G' P8 }. j
EX0init(); //初始化外部中断/ ]) |$ j3 m2 h4 e
TIM0init();//初始化定时器" @9 X1 {" i, p/ M+ t
LCD_Init();* P: _' U% v+ h: X3 E, o
LCD_Clear();//清??
' J; U7 h4 b' N5 i1 n+ L8 t( r% T3 d8 L$ G( S* n& f
while(1)//主循环3 e& E( m; G& V. R( R, C$ E9 p6 s
   {; U3 L* k6 G' G& B5 m; m
    while(irok==0);                        //如果接收好了进行红外处理
5 j$ V! @8 a2 N+ e1 e                 irok=0 ;& E$ T- Z  n# x1 \/ I) i! i
           Ircordpro();
& d# v4 A# |9 Q' b4 R' W' Y% z          while(irpro_ok==0);                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等: o; b% l' y% m3 {/ w! n- q
                   irpro_ok=0;
, ~& ~3 p7 _, h1 }, d           Ir_work();& R1 j" D% L# F/ s( c
           if(qingchu==1)1 E3 d1 ^/ }; N1 U( z- H
           {
  r# E6 \  m% m" Y8 o# ?                           qingchu=0;
6 Y6 s0 n% Q# _! D8 f                        a=0;
3 \. t) W( i* y3 i                 LCD_Write_Com(0x01);5 T  K3 I" |5 |1 Z5 {. ?3 l
                 LCD_Write_Com(0x80);0 v+ k7 c3 Q, x! e% _9 \
                        p=0;( _/ ^% ^# ~% v- r8 T! A$ b
                 for(m=0;m<6;m++)
, T1 H. ]* @- K  Z4 F3 s                         table1[m]=0;, u2 w- ~7 ]  T- p4 Y/ d
           }" j+ D/ h5 e, K# X
        }; u' p8 v& e; e1 X" F, I( |1 F- f
        }9 T- q; S; \* c5 g8 X& M
9 O( K. \5 N8 ]6 A; I* V& |
! Z; Z( m% r$ b$ D$ O' l
游客,如果您要查看本帖隐藏内容请回复
- m: u9 ]1 T6 o1 u

; B0 w' K5 T/ [! o$ i/ E! c
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-11 13:29 , Processed in 0.109375 second(s), 27 queries , Gzip On.

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

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

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