|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机的红外计算器程序源码
1 L/ i& ~ T- }5 k* t( J$ Glcd1602和单片机接口自己在程序中看
; Q7 y+ i2 X- g单片机源程序如下:: K! A. M! ?( W, V9 U# B1 e( }
/ r3 t) @4 U- q; |) ]
" G2 u8 n4 S' }7 {#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义; r4 K v) Y$ Y0 p
#include<intrins.h>
7 {( n" d* H1 Y: T# d1 ]sbit RS = P1^7; //定义端口
5 Q1 `5 H! L- n" @sbit RW = P1^6;
3 y3 P7 e* M# I" \" ?1 Ysbit EN = P1^5;
& Y% l' ?3 U, ]4 \3 {$ bsbit datk=P1^2;1 d& y; g4 m7 S. j r: p0 O) i S
sbit rest=P1^3;
! M. [9 N" {* L5 }+ osbit IR=P3^2;//中断0,红外接口 //红外接口标志2 S0 c. J6 v6 N9 V3 }
#define RS_CLR RS=0 //选择指令寄存器 i* r4 q# b6 o& _9 Q4 n* G
#define RS_SET RS=1 //选择数据寄存器7 X& S9 Q: k9 v% j! g6 \
#define RW_CLR RW=0 //把单片机数据写入lcd
+ `! I- Y1 R/ f" t#define RW_SET RW=1 // 把lcm的数据读出到单片机) `7 {% f3 g0 R- L) l3 ~4 o; ?
#define EN_CLR EN=0 // 允许对lcm进行读写操作0 F3 |9 r& n; ^" |
#define EN_SET EN=1 // 禁止对lcm进行读写操作+ T; @$ u& D+ P8 x) D; i N4 o
#define DataPort P2 //定义数据端口 程序中遇到DataPort 则用P2 替换) P6 l* O) Z6 z8 U, C1 }
/*------------------------------------------------& B! l4 S! h# {# I( [
全局变量声明
. [: D# ]8 ]( h8 h( C------------------------------------------------*/
* s- w5 v* h+ M/ T! l& Q unsigned int p=0,flag1,qingchu;9 s2 W% m8 P* b0 A, H% |) T
static int a; //静态变量a; x" a$ D3 L& U3 `1 y9 q/ I
unsigned char table1[4];
. z( G; H% L- k# tunsigned char irtime;//红外用全局变量
: M1 K6 ~0 _5 V# F$ T- N6 `1 S
8 c0 R' G: @5 U# b) ~ ubit irpro_ok,irok;
/ _ j9 {; x' P: {+ j' S, Wunsigned char IRcord[4]; //四组数据,- q9 S6 C/ h; U$ t
unsigned char irdata[33]; //前导码加32位数据; X$ t6 z& M* l" m
unsigned char dat[] ={'0','1','2','3','4','5','6','7','8','9'};
; z5 G' [% O2 P. l: l6 N& v$ E* E* M/*------------------------------------------------
2 D. \9 U1 m; f; d/ v( w; z 函数声明
# H4 ?( v0 I2 Z# x2 `------------------------------------------------*/
0 T3 V( W) Y3 X& C/ z) Q2 I: f) G) ^) }# g
4 S+ Q8 i7 |7 k) c( Gvoid Ir_work(void); //红外键值散转函数
6 `3 W, i: q, p& Pvoid Ircordpro(void); //红外码值处理) Z6 _% P- j+ a9 R, Y+ [* B
void Delay10ms(); //延时函数
. m, t# m( Z( D4 l/ u. \! Lvoid delay1ms(void); //延时函数
# n8 v1 ^) j' \! d5 x1 tvoid music(z); //语音函数( k; e( Y/ y2 j( Z3 I
/*------------------------------------------------
. }! l% d5 G* ^. F+ B' n uS延时函数,含有输入参数 unsigned char t,无返回值
" N( K. ~8 E2 q" j7 C* V# j unsigned char 是定义无符号字符变量,其值的范围是
% E! z( O) H) c; p- h. [* O 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
' f6 [/ T; u+ p& Q& O3 H 长度如下 T=tx2+5 uS
1 _$ x5 Z2 I' V$ p H" ^8 y------------------------------------------------*/6 [& O) i& a0 J/ _9 K( [. K
void DelayUs2x(unsigned char t)0 a* f" Z$ J; C
{: e1 Q( R2 N# {' E
while(--t);: H# W0 \% C: B8 M" d
}" U, K8 v7 I, y
/*------------------------------------------------3 |6 V3 O. h0 n1 C
mS延时函数,含有输入参数 unsigned char t,无返回值
: a" X9 `% `6 ]& t2 u5 I; w* I" n unsigned char 是定义无符号字符变量,其值的范围是& _5 p* v" }, K e
0~255 这里使用晶振12M,精确延时请使用汇编
) R3 t0 R/ _: k7 e, c- x5 C* z7 r------------------------------------------------*/+ z8 m" b1 K4 ?2 D
void DelayMs(unsigned char t)
6 o# p* I! c3 [{
, ^/ T* d+ C' Z* J( _. E! p( U
/ Y; S7 c$ {! i5 L5 r; E while(t--)
: [3 i3 j5 M. o+ K3 a( `9 y {; F8 g: u) n( i& W( u
//大致延时1mS
# F% A3 G+ _3 _: D# O5 n, x DelayUs2x(245);
! B5 U* w- F7 X0 O DelayUs2x(245);* A. T1 u$ W* d1 a, H
}. W2 ]1 M8 k$ Z
}5 J1 H$ J% m; K! f' K2 I. v
/*------------------------------------------------
9 ~4 u+ j' w6 [5 i 判忙函数7 ~& p6 y6 h4 H' G: n6 Y. Y) t
------------------------------------------------*/) t1 R" _' M) u _4 c% D
bit LCD_Check_Busy(void)
' X' H5 T( R m2 w4 n6 c {5 A' N2 l1 Y$ b9 r
DataPort= 0xFF;' H- B Q# Z6 D$ c
RS_CLR; //选择指令寄存器
5 H' W9 ?; [; p8 M% v9 J RW_SET; //把lcm的数据读出到单片机4 [. ]/ R" w; i7 T, m3 f2 S! I2 Z/ t
EN_CLR; //禁止对lcm进行读写操作 6 C% m1 A! w9 B- w3 G' x
_nop_();
" \0 D4 k. W' e2 w0 N0 [# L EN_SET;
+ P# P0 v& V! M& J& p- D return (bit)(DataPort & 0x80);
d2 o6 h( |3 N* j8 `7 X }
' A! K8 c! v0 o! F9 n4 t: n/*------------------------------------------------ w8 p' D# N2 r2 }/ ^8 T
写入命令函数
# b0 r L& n8 B1 ^" _------------------------------------------------*/
- u3 X8 w+ B- D void LCD_Write_Com(unsigned char com)5 H! S3 C% n6 I1 k
{% \' ^: }3 ?: E
while(LCD_Check_Busy()); //忙则等待' s& l% ~/ |2 N' E$ p% ?: E6 N
RS_CLR;
4 k) n, h3 _- h2 b9 {7 \( c RW_CLR;3 M7 y3 `7 }: p. h% }; S' E
EN_SET;
d7 e" k, Y4 ~1 s6 X DataPort= com; H0 {; e/ g- e: n0 m
_nop_();
8 @8 e+ z; K/ T' n. y& ? EN_CLR;
6 L: p' d$ d9 ?2 }2 i }
/ j! E6 x' o" D* k1 c/*------------------------------------------------
' e+ u$ B |3 C: R7 W 写入数据函数
8 j# S' i$ S' b/ i3 T1 L------------------------------------------------*/
3 q9 v6 I# X7 \" V) k: M& m X void LCD_Write_Data(unsigned char Data)
! U8 _* f7 B2 D+ K1 R3 t {8 j3 d; M5 I1 `- c/ x# y
while(LCD_Check_Busy()); //忙则等待# ]( j* k/ ?2 j
RS_SET;
2 D* @& w+ j; U6 t4 D& o0 |7 c RW_CLR;
6 e8 `: A$ u' b2 H$ T1 z# M EN_SET;& b+ J# j8 W6 `5 v& t: H$ U0 \3 I2 n- k
DataPort= Data;
$ Y# z1 P# ]5 I7 t' W8 a0 f, Z6 K$ l- r _nop_();& T |6 m" [+ x" K
EN_CLR;0 t1 \8 b/ |2 i. g- S
}
; o3 D" n8 q( `, Q% I# K8 `
. L1 Z# T, b" ]9 }/*------------------------------------------------6 A( [$ G/ M# P) P. u8 b+ p
清屏函数
5 f& H4 |4 X. F/ |- ^------------------------------------------------*/
/ m8 w6 k5 q. Q void LCD_Clear(void)9 N6 t. S& o" l8 h/ s& l% M, R* N
{2 b' P! v) w4 H; U3 C6 n
LCD_Write_Com(0x01);
% a' {* I2 ^. i) G: c- R4 n DelayMs(5);
- Y" {: F3 G. v8 e; D) s' R }( K$ N: ^- N8 G7 i j5 l
# ]8 }; M# c* o6 b* J7 i
/*------------------------------------------------
3 b2 J- b1 w0 I# _ 初始化函数
2 U2 c) `$ j/ Y$ i: K------------------------------------------------*/7 S4 ? V6 Z, t$ Z
void LCD_Init(void)7 v2 H% o% W+ a! N$ O L' N: B
{3 s% i' l% K5 p- d, w# h# H+ \! B) S
LCD_Write_Com(0x38); /*显示模式设置*/7 i, z/ P' T' u7 m1 P
DelayMs(5);
6 g W/ M3 }3 q8 W$ Z4 L LCD_Write_Com(0x38);; e$ p8 D6 y: S1 D
DelayMs(5);
& s$ [# t# I7 u, T* T& T' W LCD_Write_Com(0x38);
* ]5 w2 N5 t+ k, z" e |$ C/ } DelayMs(5);
& x( W% ?4 k: Z: ^ e1 I$ V, ^* Q LCD_Write_Com(0x38);/ J; Y* w9 }' E; z9 h! Y
LCD_Write_Com(0x08); /*显示关闭*/9 Y9 F- W! }; {+ f+ I
LCD_Write_Com(0x01); /*显示清屏*/6 d( E! [! W ^" x% j% ?
LCD_Write_Com(0x06); /*显示光标移动设置*/
' H) @6 e, G o% S1 k. {, E DelayMs(5);$ ^9 m! Z6 k: F3 P
LCD_Write_Com(0x0C); /*显示开及光标设置*/: o [7 v* j& H- M/ Z
} b9 @6 R, ?1 c/ K0 f5 ?8 I# l
5 H V- {: _6 y) X
/*------------------------------------------------% r3 ` [3 J" r0 R' }
定时器0中断处理
% L2 D, G$ N. L8 H# z------------------------------------------------*/
7 l5 N# L; @# B1 V P; {
* i4 D2 ^ N+ d& evoid tim0_isr (void) interrupt 1 using 1
% p) K- Y& J! Z4 J" C{
! `9 p/ f6 Z, g' h' f% { irtime++; //用于计数2个下降沿之间的时间
$ {5 |. I, L7 Q}, R) P) M& t$ p
# s' F" o' N+ k& ]/*------------------------------------------------
9 t( s" W; i7 e8 U7 L: R 外部中断0中断处理
% K; t. r/ b# h# U; M------------------------------------------------*/: x0 O1 k+ e2 T! e
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
0 _* N& }8 Q( q{
6 I$ H4 E. @ O( J# ? static unsigned char i; //接收红外信号处理' r( D3 o2 Y% h7 N6 o
static bit startflag; //是否开始处理标志位
7 @2 l8 W! }; s/ v" w! w" z
/ H' L* F; a2 _2 z5 o1 C! Z3 \if(startflag)* w: c" z1 V) D/ T0 n* v7 u; a0 Y
{+ |6 E, R1 i7 Q7 h3 \
if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms1 V0 e( I8 {4 i1 F3 }# e! K' h
i=0;. ^; C, K4 \* B, h+ u3 p2 G
irdata=irtime;//存储每个电平的持续时间,用于以后判断是0还是1) B4 o' x: B C5 Z0 d* n- i
irtime=0;
3 [/ [% Z8 v% v+ [$ T2 E4 A( W- s( V* U i++;
( Y/ }5 O# _( T if(i==33)$ P5 @, g, ~- ]2 Z! S
{
/ g( v' S2 R9 Q5 g7 t: Z irok=1;
" n3 j! l: D0 Z9 j1 p5 |; [ i=0;" C5 \9 C J* l+ U" `- @$ @
}
% W( R& N5 F! F$ `! B4 Q }
/ [+ ?4 y! O3 x3 w. a% m8 | else# u2 S/ ^2 W, J( g& M$ d- ?
{
, M, |7 ?+ c* Q4 i' Z irtime=0;
, H, F: g! D0 Q8 [7 @& c9 B startflag=1;
3 v. Z/ [( t+ | O }. K; v& D) ~2 n) D2 i
. ?; f2 x4 i* v5 z4 _9 h}
; K3 c2 x7 J7 J7 U J8 U1 B
5 W2 }1 Z! S; e! X5 F0 G1 R) l! M& x& `8 Z9 X% l N
5 p' [4 D5 k: F2 ^# L, R
void music(int z)7 k' P+ s- z0 J8 k, T5 ^4 d6 @# u
{0 w+ l# Z- D/ }: l+ y% K0 G1 D
rest=1;% Y) s0 t; V/ _
delay1ms();% `1 E- M4 p, ^# O: z7 d4 L4 k
delay1ms();
" z7 s" l# P) W# D+ S) xrest=0;" l! A. T% p1 G+ A6 c! s+ d/ b' c0 J
delay1ms();
# b' P2 K- V& }! g( }7 mdelay1ms();5 a/ R, e6 @2 x& Z
//前面给语音复位,详情看语音资料
% m" U- {* A. a# ?5 P1 d; fwhile(z>0) //给b 个脉冲让语音播放b段语音8 ^5 n; P+ O& z% s( S
{* B& z+ ?% g1 R \$ {
datk=1;6 o0 b) }# c: F2 m
delay1ms();
+ v1 w$ J$ G1 {& E' qdatk=0;
' A; [2 p8 V! s$ I Udelay1ms();
4 i4 g, b8 l; ]! Hz--;
3 |6 |/ z3 @ O( r} }( i% m+ W* |) G1 S
//************************************************************& E' c$ J3 g9 R2 i+ c, t
void delay1ms()
7 h4 K& T, Y; p2 ~6 {( X4 v1 h{
' v! r1 L( E& a: k unsigned char iii, jjj;
+ ~. O% Y6 H& j+ @( X. q. J; E4 E8 ~4 t% I( ~% T" l
_nop_();8 a* P( L2 x& s& R T) \
iii = 2;3 s4 l' Q0 z5 n0 z6 I; V6 x. [
jjj = 199;7 M6 b/ d7 U# s7 x( X
do
@, G) k/ m( \- _2 m! y6 I$ S" f {# _5 e$ l3 Q- d$ y" O7 W3 T5 K6 L
while (--jjj);
0 h' [# {/ y1 I" @' n7 F& @# { } while (--iii);4 F0 v( |) F+ ?
}
& s- t) @/ f/ Bvoid delay(void) //误差 -0.000000000227us7 T8 e* ^$ g+ b
{, h- P$ C* h0 J N6 @
unsigned char a,b,c;
- O% t% I; s) _% C. D7 F! } for(c=13;c>0;c--)0 ~) Q `6 [. S: \
for(b=247;b>0;b--)
; }( A9 Y- b) a, C for(a=142;a>0;a--);- n1 R3 e1 \8 M& F( Z* k$ ]
_nop_; //if Keil,require use intrins.h/ `, k5 D% m+ F* K. U
}
; U$ w5 U) x' O7 N& G7 C: w' m0 y4 p0 G$ [
, {, N' r8 _6 o" g/ i" p) b' U
/*------------------------------------------------" }" F* c/ W5 N, e; n: ^! C
定时器0初始化
3 x1 V2 Z5 w/ T( b) I/ T' I4 f Q------------------------------------------------*/
" ^; E; {3 }5 b; K1 [void TIM0init(void)//定时器0初始化
% x# k, I" r0 U/ p C2 f+ [{
; a& O" P8 }+ ]: [5 |3 e7 X( q6 [! |3 ^, M! J6 q* r
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值. B ^9 |1 [! g7 @& B3 s
TH0=0x00; //重载值
' ?8 B6 A a* q5 K/ v; C6 ] TL0=0x00; //初始化值
0 ? Y# L) d# J" A2 e+ U& Y, I ET0=1; //开中断
$ t" T: m0 n5 o4 \6 j9 C. s TR0=1;
/ i4 m1 |0 Y% Y. o$ g: n}
' ]( y$ W" w& E3 {" H/*------------------------------------------------
& A0 v+ P( K7 L7 n 外部中断0初始化
8 V: }; P0 U7 U6 z+ B6 h& B------------------------------------------------*/
9 P+ z ~' c! ~% x/ G3 D' Mvoid EX0init(void) C* B: w5 ~# F7 F! y7 A* J: t
{
5 d) r% }. D: @; P IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)+ g) v2 _" H5 N: u6 K8 x5 s
EX0 = 1; //使能外部中断+ ]6 p7 }7 M! h0 b) o
EA = 1; //开总中断) ? Z+ b6 E* }, e
) z! E7 O" q8 y( A}
: r7 e" r" j" l$ m) q; l/*------------------------------------------------
) {7 E4 g$ b) ` @6 S- C. P7 E 键值处理0 F6 H3 N. s0 Q8 U
------------------------------------------------*/& I# I8 g! X5 z( { X/ q
int display(int j)# Z& Q v& @1 q8 F
{
" G( ]- d% A" i/ B2 B" a int k;" f, E- d4 n- B8 b n0 A& _$ t& o
switch(j)//判断第三个数码值
4 ~0 m+ u# U# {" W: Y& } {
5 K5 E* ^3 B; b# X$ a
7 l; w1 B$ l$ ?+ s& k5 U% O2 ]* l case 0x16 CD_Write_Com(0x80+a);LCD_Write_Data('0');k=0; a++; break;//0 5 r! [- M* n, v& ~; ]
case 0x0c CD_Write_Com(0x80+a);LCD_Write_Data('1');k=1; a++; break;//1 显示相应的按键值
2 y+ \- v6 m, V6 @- G case 0x18 CD_Write_Com(0x80+a);LCD_Write_Data('2');k=2; a++;break;//2* P5 I8 U5 g# F- ?
case 0x5e:LCD_Write_Com(0x80+a);LCD_Write_Data('3');k=3; a++;break;//3% Z# F3 a$ S* q
case 0x08:LCD_Write_Com(0x80+a);LCD_Write_Data('4');k=4; a++;break;//4 ' e4 [! c) m$ E$ R: M1 Y0 B
case 0x1c:LCD_Write_Com(0x80+a);LCD_Write_Data('5');k=5; a++;break;//5 ) f4 H" R# i& L5 B
case 0x5a:LCD_Write_Com(0x80+a);LCD_Write_Data('6');k=6; a++;break;//6 显示相应的按键值
# F4 q7 z( K1 u) G; C" w case 0x42:LCD_Write_Com(0x80+a);LCD_Write_Data('7');k=7; a++;break;//7' w8 Y; o; D9 R4 f8 r; U7 X
case 0x52:LCD_Write_Com(0x80+a);LCD_Write_Data('8');k=8; a++;break;//8
, Z( B. \& T0 U; E; w5 { case 0x4a:LCD_Write_Com(0x80+a);LCD_Write_Data('9');k=9; a++;break;//9& P% O; J+ m. y/ G1 D8 R" N6 V; w
}( q! ?$ g; X: Q- h/ H
2 W# ~+ j- i8 F) L return k;
9 { y8 |! X- A/ E}
2 j, h- u0 P* ]: i8 e1 b$ l5 e3 q/ p' m
void Ir_work(void)//红外键值散转程序
/ j" z0 z- o* _. W V& j{8 G# j7 k- x, ?* E/ {
7 I5 z2 ?' e, u4 p
int k=0,flag1,count1,count2,count3,count4;8 @* m! H" X$ F0 o8 u
int table1[6];
3 _2 A, S' c9 ~# [5 G int count;
4 A2 q7 _ T8 e; Q+ r4 ?* D- Q! t if(IRcord[2]!=0x09&&IRcord[2]!=0x44&&IRcord[2]!=0x15&&IRcord[2]!=0x40&&IRcord[2]!=0x43&&IRcord[2]!=0x07)
: L' K: Q- d8 D l5 R; y {
# u% z& q# n2 w5 T% c k=display(IRcord[2]);
; B0 r$ ]+ j, v0 s table1[p++]=k;- `# J. d7 [. Q$ G- L6 Y6 p6 s9 k$ E
}
& ?- X& n, V2 g9 y# r else if(IRcord[2]==0x09||IRcord[2]==0x44||IRcord[2]==0x15||IRcord[2]==0x40)
$ L' g5 @ i& d$ p G {' n' D: h7 j2 _4 B9 t7 T- {
switch(IRcord[2])# Y$ z5 t3 l2 Y# X E2 V
{
5 B) q8 u& _( Y' A5 B( c case 0x09:LCD_Write_Com(0x80+a);LCD_Write_Data('+');flag1=1;a++;break;//+
0 g. `& t4 R, a6 ~6 P case 0x15:LCD_Write_Com(0x80+a);LCD_Write_Data('-');flag1=2;a++;break;//-显示相应的按键值) @* u+ G5 x! G( f- T
case 0x44:LCD_Write_Com(0x80+a);LCD_Write_Data('*');flag1=3;a++;break;//*3 a w3 Y/ d9 z2 T) ~6 q/ O; h& ^- d
case 0x40:LCD_Write_Com(0x80+a);LCD_Write_Data('/');flag1=4;a++;break;///
' |# C) n. p( Z; P# Z8 }8 `% x //case 0x10:) \8 _' Y3 D. D& ]- G1 \
}
/ P! Q' ]8 {; M4 B+ F }! B6 E6 [1 \$ i% W& U
else if(IRcord[2]==0x07)
: G6 \- |. P5 w/ I0 _" \! W6 L {( | L- p$ L7 x8 E, w2 P- i
LCD_Write_Com(0x80+a);
! r5 p, d% z$ ^8 H LCD_Write_Data('=');
& F' g& @8 d) l/ q switch(flag1)
* B9 d$ e, `. N3 a$ ^( x9 V {
/ w: h; H% ^% o' {& w6 [ J case 1: count=table1[0]*10+table1[1]+table1[2]*10+table1[3];
6 ^4 b+ {0 h3 o/ a; `, v if(count<100); m: b1 J( I3 }) R8 z2 X
{3 r. R" a1 ~* m" x8 S
count1=count/10;
% k) ~. |8 m, [" S( r0 y' ~ count2=count%10;
; W, S$ F( t. z; m LCD_Write_Com(0x80+a+1);
3 c% h9 S+ z! e8 T: l/ R# s6 ? LCD_Write_Data(dat[count1]);
5 Y4 ]* O* Y" d m' V2 p; ]1 O9 y* m4 X( T B6 \& P
LCD_Write_Com(0x80+a+2);* p R. z% }2 L! {* w2 k, Y
LCD_Write_Data(dat[count2]);8 ]0 n3 _0 x8 B6 k; N
delay();# f' q6 T2 G( I7 ~
music(count1+1);" G ^+ G x# P* m5 j0 K! t
delay();" ?# n4 @* H( X; q
music(count2+1);: i: q6 [3 y5 y) \4 U
delay();$ a5 c. T' ~5 z) y7 A! T+ y
}9 E! L+ \2 Q/ ^4 Z. Y
else if(count>=100)
. s1 k. o% i6 d4 f v, {8 \ {
: S6 c5 K- x# I* A' j( R. a count1=count/100; LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count1]); / h# Q, O1 b5 w& E7 }
count2=count/10%10; LCD_Write_Com(0x80+a+2);LCD_Write_Data(dat[count2]);; m& u" b& S( x+ ?0 y
count3=count%10; LCD_Write_Com(0x80+a+3);LCD_Write_Data(dat[count3]);
: s z5 e3 Y& o, C! D2 @( n delay();( x/ F3 j- I$ t! H7 S
music(count1+1);
. x" @, g5 c6 y7 n7 Q2 v delay();
E. Y( ]* T1 d+ \ music(count2+1);
) g" Y J9 q; B; s delay();
8 S# f4 W* |& @5 l) `4 B2 J8 U. k music(count3+1);( \# O& s6 y9 t3 f" [; J2 Y
delay();( V G: a7 z9 t R! A( f% [5 D& x
}% B& t6 ~) n+ p+ m2 }: \% L
break;
) n, A6 ]$ w9 f4 Q8 `: Q1 } case 2: count=table1[0]*10+table1[1]-(table1[2]*10+table1[3]);% b3 ~) z; G4 X c
count1=count/10; LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count1]);
' Y6 s' y: V3 _8 [2 j count2=count%10; LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);- W8 e0 A3 V* |6 f& V8 r
music(count1+1);
: L$ I/ ]9 k2 D. W- K* S delay();
# Y, @0 }1 l: C. c; Y# _ music(count2+1);
( V6 R; O# ^% a) x- | delay();
5 |' t; w- V4 |, F4 X8 G break;) x8 Z6 J* ]/ g- I1 Q, }5 c
$ H. ^ p* z$ X$ ~
- V! b n b- d1 M/ J2 T case 3:count=(table1[0]*10+table1[1])*(table1[2]*10+table1[3]);' e& ?. I/ y. \9 ^. Q- I
if(count<10) { LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count]);}
9 ?9 J+ H4 g% E. ` else if(count<100)
, O* D# W% J4 Q! Z. ~: u' Z {
8 T7 g+ y' Z5 t+ u% G4 N+ f count1=count/10; LCD_Write_Com(0x80+a+1); LCD_Write_Data(dat[count1]);9 }$ l8 ?, z/ g( N6 u: ~
count2=count%10; LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);
3 L7 S7 z) R; @/ d delay();# ]7 n7 a" z' L" `, X) d- s
music(count1+1);
$ w3 d) j6 m7 ]& m% @5 z delay();- n" n, e, O* ?3 G& O& X
music(count2+1);
! @2 k: j8 p4 E; U! D: o' c delay();
7 ]) c. z4 D4 a9 \7 Q8 }. t+ p }
4 e% b0 W6 h4 w- y+ }
9 a* g$ \) ^% i8 G else if(count<1000)
* f: p: X- |7 f2 X3 `: `/ P6 u {
: a$ q' a5 b6 k8 {! t! H count1=count/100; LCD_Write_Com(0x80+a+1); LCD_Write_Data(dat[count1]);; n+ Y( g X5 T- y# B7 ]: g
count2=count/10%10; LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);
/ v s; {! s) G count3=count%10; LCD_Write_Com(0x80+a+3); LCD_Write_Data(dat[count3]);* e; S3 U. o, @& V. i! T9 j1 a) s
delay();
+ O. f* ~. U; h! Q5 I) M, n' i' [ music(count1+1);
u1 n0 H- J# C6 n- K delay();
( r6 t3 ?- L+ E0 [' H music(count2+1);
# R2 p3 i; r" i0 H+ |3 k w3 b delay();! {* u0 B+ O0 }' N
music(count3+1);: c# l! b- \- M5 W$ _2 w1 ]7 V
delay();
1 n u9 n A% I+ y! B }3 A8 J: P% R/ n1 j( c# L6 d8 M
else if(count<10000)
) Z" b: s2 A; b% m {
& y: f3 b& {- y. Z+ J" n count1=count/1000; LCD_Write_Com(0x80+a+1); LCD_Write_Data(dat[count1]);* Y) b/ v+ g. Q' N0 q
count2=count/100%10; LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);0 N- G" ^% W. R. H8 d& U. y
count3=count/10%10; LCD_Write_Com(0x80+a+3); LCD_Write_Data(dat[count3]);: b5 T% ^9 n/ S1 ]
count4=count%10; LCD_Write_Com(0x80+a+4); LCD_Write_Data(dat[count4]);
h+ k& [1 L5 ]6 Y4 ]3 q( Q2 c+ J delay();
; y( @) q3 i4 P' r' K! G music(count1+1);
. ]# C$ y$ S( O) O delay();
. b' v6 S. @! H8 |. R) U music(count2+1);
) q8 i8 G9 e9 o$ _+ P/ b; h delay();7 D, c/ z. m; i, \% |1 v4 ~1 z! Z
music(count3+1);
) A0 }: I+ b+ I+ V delay();) ~/ r/ O& J0 j- v7 o5 k8 R' F* }
music(count4+1);
7 Q9 e; ~: d; [& g6 ] delay();
7 P* Y K$ L( J# x }+ C: O6 z; G1 F
break;' V% V. k0 X1 d5 ]0 }* {
case 4: count=(table1[0]*10+table1[1])/(table1[2]*10+table1[3]);9 E( W9 e# x; T' m
3 b2 ~ c) c" o# R. b
( ~, O5 ~! G L" v. F" \. q3 A7 S( N+ m/ Z' o3 Z# D, x8 B5 V
if(count<10)% N. J, K& R& e2 D0 s; E
{ 2 {. s y. o7 P; G6 g
LCD_Write_Com(0x80+a+1);LCD_Write_Data('0'); //LCD_Write_Data(dat[count]);
! U5 y8 T) s7 Y+ o LCD_Write_Com(0x80+a+2);LCD_Write_Data(dat[count]);
4 l8 g% S/ L' ^ delay();, o& S3 `5 e2 ~9 X- z a
music(1);
- w9 I( s/ {/ X8 F" M( W5 l delay();# m" J, E" x4 Q) j4 u; f: X
music(count+1);
1 r- s- l" r! O0 O delay();# a8 M- [4 `) z4 _4 c3 n2 w
}% i) |* u2 f9 t9 Q8 O) V' x# j
else
. \8 i1 A% e" ~5 ~' [! H3 w+ J {8 s- t, X7 R; \# b
count1=count/10; LCD_Write_Com(0x80+a+1); LCD_Write_Data(dat[count1]);
5 }4 Z8 h9 z" |$ ?# ` count2=count%10; LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);
, ]; U4 i, y) p+ B4 d% H! ^ delay();
7 o2 H: ]) E! g- M8 ] music(count1+1);0 o* E/ G! K! ?- O L
delay();
% {9 r9 q3 C. Q* A music(count2+1);' \6 J) p/ @4 m3 T2 ~, a
delay();
4 D( P; T& q, K: D( h- _' E } 3 \9 Y( ~4 g. h: H, a
break;
) D: Z, W& x! e7 l6 W" P }; s. T8 t, Y# \; a1 ~
flag1=0;+ i' d. c* u2 K7 Z0 g( }# \% z
}, F7 Y- ~3 g: }+ e6 R
else , `3 {) Y' r4 N# d
{
! f8 D% p4 X5 G if(IRcord[2]==0x43)
+ Y x# V/ L% M& y. X {
3 ~0 j* C ~; a: X LCD_Write_Com(0x01);
' G9 S+ |' D! O, d qingchu=1;' t7 j' x' [1 L, h& l! s
- ^4 Z) I( s4 g2 z% o }
; n: G+ j5 c4 c} E& i/ f7 q3 W* Z0 G/ L( P
! g" [5 V: J* N7 A F+ ?7 S
% J) s9 F2 o+ T- ?* G}/ }, u- _9 \. U. z$ {
/*------------------------------------------------' B7 j4 X& J0 G0 \ ]
红外码值处理6 Z4 Q" b3 U B
------------------------------------------------*/
8 ?# f& l0 q& [$ pvoid Ircordpro(void)//红外码值处理函数
; l- T& R: D4 | N6 M$ h7 f{
1 j2 H) j! @; s; k c+ p unsigned char i, j, k;7 b- t' A+ n, O1 W5 K4 I- i/ L5 {/ i
unsigned char cord,value;
6 p, U: f2 t4 E, K. W* O6 G
, D8 J& K, i3 @! Q k=1;
; Q( y! T6 @0 t. U for(i=0;i<4;i++) //处理4个字节
/ }* ?, e( H( G {- T% a0 a, I& p: Q+ q' R# b7 ?) l$ H
for(j=1;j<=8;j++) //处理1个字节8位: K8 ?. Z( q) E( j
{
) t8 m; `, C2 f+ c* B) H cord=irdata[k];
9 a, g& F) @) z: {) m. d; h7 | if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
5 d' @9 t1 F8 o3 d0 r% b. b. R! a value|=0x80;2 J$ P# e" z3 N) x7 }- F" s
if(j<8)! [& @ z2 ^) V1 l% x
{
& l" @- A2 y6 M5 t9 {: I) c1 ?8 m value>>=1;
4 M* s* w1 j9 L X }8 p5 q# x1 f' m* B
k++;
/ I7 K8 }) r" R }
3 {1 R' B3 [! l6 L IRcord=value;% S# j- d# N$ J& ?
value=0;
( z6 W" y4 S" R( A# { }$ W5 }1 K( g+ u) z7 ?& z" A
irpro_ok=1;//处理完毕标志位置1; j8 i I4 Z5 h& Z' r2 C
}
/ h) L- s% A+ @: d. z+ m5 e$ M4 i# \9 `
/*------------------------------------------------
5 P; R# ?4 t3 p* H) Y' O4 W 主函数; g. ], u- Z" \/ l: Y3 v
------------------------------------------------*/) V3 Z9 p; @. S/ B# \
void main(void)
, G& c t h. s9 ~{4 K3 h% Y# u+ s' L |
int m;4 ?: U2 w+ d# ^& C* F% c% f
EX0init(); //初始化外部中断
! A0 x; ^% [# ^2 o$ D TIM0init();//初始化定时器
4 X, x8 O! m, \+ T, ]6 D) G LCD_Init();
' w; C" C/ W6 j8 o4 O. L7 uLCD_Clear();//清??$ |5 @& E }8 G' H) t
: @7 ?% M: N. U0 U H/ P" f while(1)//主循环
& C5 j, s) D @6 I+ m; g: b" K {
/ Z. A* X) w& T( u$ |3 m while(irok==0); //如果接收好了进行红外处理
/ a! n0 M" c7 c& V7 q- D4 u irok=0 ;- S5 S, m. ]3 y. z: X. Z0 s
Ircordpro();
' N! @6 t5 O9 F, r: |3 U while(irpro_ok==0); //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
$ r* A5 @5 y1 s' R* Z/ ? irpro_ok=0;" G( J' B; T8 q Y) K# ]
Ir_work();7 h$ W: u2 M L+ E! _5 b, Q
if(qingchu==1)
4 b$ p+ p& ^4 M8 i {% k% H/ u2 R+ N
qingchu=0;* H: k) m; u, V3 r
a=0;
8 p* V* o `2 r8 t8 D; X LCD_Write_Com(0x01);
: z# h4 v8 Q: u/ h U LCD_Write_Com(0x80);$ I/ D/ S( v5 n" h3 M
p=0;( ~& ?- T# u2 J' d4 X
for(m=0;m<6;m++)
. g! R9 i' t3 C0 h' R table1[m]=0;
1 k6 d7 @! M# Z; Q ~ }
! W% u% @4 _: R; l/ y4 K7 D- u }+ e. { ]. ]0 y" e: W
}
: `' g6 F3 k; ` w# `% O2 _3 b6 y" x
9 A& N( y) T% B# @3 T5 l- Z3 C8 T+ v$ c& P" N1 b/ U; q7 U
5 k, d) b" i( F7 T4 y8 E9 k
: O6 M" o3 ?1 R: S |
|