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