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