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