|
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 0x16 CD_Write_Com(0x80+a);LCD_Write_Data('0');k=0; a++; break;//0 # H9 P2 S" M+ L! U* E+ v, R0 ~
case 0x0c CD_Write_Com(0x80+a);LCD_Write_Data('1');k=1; a++; break;//1 显示相应的按键值
3 x) i) @" v a! Q/ k1 {; { case 0x18 CD_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 |
|