|
lcd1602和單片機(jī)接口自己在程序中看
單片機(jī)源程序如下:
- #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
- #include<intrins.h>
- sbit RS = P1^7; //定義端口
- sbit RW = P1^6;
- sbit EN = P1^5;
- sbit datk=P1^2;
- sbit rest=P1^3;
- sbit IR=P3^2;//中斷0,紅外接口 //紅外接口標(biāo)志
- #define RS_CLR RS=0 //選擇指令寄存器
- #define RS_SET RS=1 //選擇數(shù)據(jù)寄存器
- #define RW_CLR RW=0 //把單片機(jī)數(shù)據(jù)寫入lcd
- #define RW_SET RW=1 // 把lcm的數(shù)據(jù)讀出到單片機(jī)
- #define EN_CLR EN=0 // 允許對(duì)lcm進(jìn)行讀寫操作
- #define EN_SET EN=1 // 禁止對(duì)lcm進(jìn)行讀寫操作
- #define DataPort P2 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P2 替換
- /*------------------------------------------------
- 全局變量聲明
- ------------------------------------------------*/
- unsigned int p=0,flag1,qingchu;
- static int a; //靜態(tài)變量a
- unsigned char table1[4];
- unsigned char irtime;//紅外用全局變量
- bit irpro_ok,irok;
- unsigned char IRcord[4]; //四組數(shù)據(jù),
- unsigned char irdata[33]; //前導(dǎo)碼加32位數(shù)據(jù)
- unsigned char dat[] ={'0','1','2','3','4','5','6','7','8','9'};
- /*------------------------------------------------
- 函數(shù)聲明
- ------------------------------------------------*/
- void Ir_work(void); //紅外鍵值散轉(zhuǎn)函數(shù)
- void Ircordpro(void); //紅外碼值處理
- void Delay10ms(); //延時(shí)函數(shù)
- void delay1ms(void); //延時(shí)函數(shù)
- void music(z); //語音函數(shù)
- /*------------------------------------------------
- uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號(hào)字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編,大致延時(shí)
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號(hào)字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- //大致延時(shí)1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*------------------------------------------------
- 判忙函數(shù)
- ------------------------------------------------*/
- bit LCD_Check_Busy(void)
- {
- DataPort= 0xFF;
- RS_CLR; //選擇指令寄存器
- RW_SET; //把lcm的數(shù)據(jù)讀出到單片機(jī)
- EN_CLR; //禁止對(duì)lcm進(jìn)行讀寫操作
- _nop_();
- EN_SET;
- return (bit)(DataPort & 0x80);
- }
- /*------------------------------------------------
- 寫入命令函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS_CLR;
- RW_CLR;
- EN_SET;
- DataPort= com;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 寫入數(shù)據(jù)函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS_SET;
- RW_CLR;
- EN_SET;
- DataPort= Data;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 清屏函數(shù)
- ------------------------------------------------*/
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- DelayMs(5);
- }
- /*------------------------------------------------
- 初始化函數(shù)
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38); /*顯示模式設(shè)置*/
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- DelayMs(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關(guān)閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標(biāo)移動(dòng)設(shè)置*/
- DelayMs(5);
- LCD_Write_Com(0x0C); /*顯示開及光標(biāo)設(shè)置*/
- }
- /*------------------------------------------------
- 定時(shí)器0中斷處理
- ------------------------------------------------*/
- void tim0_isr (void) interrupt 1 using 1
- {
- irtime++; //用于計(jì)數(shù)2個(gè)下降沿之間的時(shí)間
- }
- /*------------------------------------------------
- 外部中斷0中斷處理
- ------------------------------------------------*/
- void EX0_ISR (void) interrupt 0 //外部中斷0服務(wù)函數(shù)
- {
- static unsigned char i; //接收紅外信號(hào)處理
- static bit startflag; //是否開始處理標(biāo)志位
- if(startflag)
- {
- if(irtime<63&&irtime>=33)//引導(dǎo)碼 TC9012的頭碼,9ms+4.5ms
- i=0;
- irdata[i]=irtime;//存儲(chǔ)每個(gè)電平的持續(xù)時(shí)間,用于以后判斷是0還是1
- irtime=0;
- i++;
- if(i==33)
- {
- irok=1;
- i=0;
- }
- }
- else
- {
- irtime=0;
- startflag=1;
- }
- }
- void music(int z)
- {
- rest=1;
- delay1ms();
- delay1ms();
- rest=0;
- delay1ms();
- delay1ms();
- //前面給語音復(fù)位,詳情看語音資料
- while(z>0) //給b 個(gè)脈沖讓語音播放b段語音
- {
- datk=1;
- delay1ms();
- datk=0;
- delay1ms();
- z--;
- } }
- //************************************************************
- void delay1ms()
- {
- unsigned char iii, jjj;
- _nop_();
- iii = 2;
- jjj = 199;
- do
- {
- while (--jjj);
- } while (--iii);
- }
- void delay(void) //誤差 -0.000000000227us
- {
- unsigned char a,b,c;
- for(c=13;c>0;c--)
- for(b=247;b>0;b--)
- for(a=142;a>0;a--);
- _nop_; //if Keil,require use intrins.h
- }
- /*------------------------------------------------
- 定時(shí)器0初始化
- ------------------------------------------------*/
- void TIM0init(void)//定時(shí)器0初始化
- {
- TMOD=0x02;//定時(shí)器0工作方式2,TH0是重裝值,TL0是初值
- TH0=0x00; //重載值
- TL0=0x00; //初始化值
- ET0=1; //開中斷
- TR0=1;
- }
- /*------------------------------------------------
- 外部中斷0初始化
- ------------------------------------------------*/
- void EX0init(void)
- {
- IT0 = 1; //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
- EX0 = 1; //使能外部中斷
- EA = 1; //開總中斷
-
- }
- /*------------------------------------------------
- 鍵值處理
- ------------------------------------------------*/
- int display(int j)
- {
- int k;
- switch(j)//判斷第三個(gè)數(shù)碼值
- {
-
- case 0x16:LCD_Write_Com(0x80+a);LCD_Write_Data('0');k=0; a++; break;//0
- case 0x0c:LCD_Write_Com(0x80+a);LCD_Write_Data('1');k=1; a++; break;//1 顯示相應(yīng)的按鍵值
- case 0x18:LCD_Write_Com(0x80+a);LCD_Write_Data('2');k=2; a++;break;//2
- case 0x5e:LCD_Write_Com(0x80+a);LCD_Write_Data('3');k=3; a++;break;//3
- case 0x08:LCD_Write_Com(0x80+a);LCD_Write_Data('4');k=4; a++;break;//4
- case 0x1c:LCD_Write_Com(0x80+a);LCD_Write_Data('5');k=5; a++;break;//5
- case 0x5a:LCD_Write_Com(0x80+a);LCD_Write_Data('6');k=6; a++;break;//6 顯示相應(yīng)的按鍵值
- case 0x42:LCD_Write_Com(0x80+a);LCD_Write_Data('7');k=7; a++;break;//7
- case 0x52:LCD_Write_Com(0x80+a);LCD_Write_Data('8');k=8; a++;break;//8
- case 0x4a:LCD_Write_Com(0x80+a);LCD_Write_Data('9');k=9; a++;break;//9
- }
- return k;
- }
- void Ir_work(void)//紅外鍵值散轉(zhuǎn)程序
- {
-
- int k=0,flag1,count1,count2,count3,count4;
- int table1[6];
- int count;
- if(IRcord[2]!=0x09&&IRcord[2]!=0x44&&IRcord[2]!=0x15&&IRcord[2]!=0x40&&IRcord[2]!=0x43&&IRcord[2]!=0x07)
- {
- k=display(IRcord[2]);
- table1[p++]=k;
- }
- else if(IRcord[2]==0x09||IRcord[2]==0x44||IRcord[2]==0x15||IRcord[2]==0x40)
- {
- switch(IRcord[2])
- {
- case 0x09:LCD_Write_Com(0x80+a);LCD_Write_Data('+');flag1=1;a++;break;//+
- case 0x15:LCD_Write_Com(0x80+a);LCD_Write_Data('-');flag1=2;a++;break;//-顯示相應(yīng)的按鍵值
- case 0x44:LCD_Write_Com(0x80+a);LCD_Write_Data('*');flag1=3;a++;break;//*
- case 0x40:LCD_Write_Com(0x80+a);LCD_Write_Data('/');flag1=4;a++;break;///
- //case 0x10:
- }
- }
- else if(IRcord[2]==0x07)
- {
- LCD_Write_Com(0x80+a);
- LCD_Write_Data('=');
- switch(flag1)
- {
- case 1: count=table1[0]*10+table1[1]+table1[2]*10+table1[3];
- if(count<100)
- {
- count1=count/10;
- count2=count%10;
- LCD_Write_Com(0x80+a+1);
- LCD_Write_Data(dat[count1]);
- LCD_Write_Com(0x80+a+2);
- LCD_Write_Data(dat[count2]);
- delay();
- music(count1+1);
- delay();
- music(count2+1);
- delay();
- }
- else if(count>=100)
- {
- count1=count/100; LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count1]);
- count2=count/10%10; LCD_Write_Com(0x80+a+2);LCD_Write_Data(dat[count2]);
- count3=count%10; LCD_Write_Com(0x80+a+3);LCD_Write_Data(dat[count3]);
- delay();
- music(count1+1);
- delay();
- music(count2+1);
- delay();
- music(count3+1);
- delay();
- }
- break;
- case 2: count=table1[0]*10+table1[1]-(table1[2]*10+table1[3]);
- count1=count/10; LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count1]);
- count2=count%10; LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);
- music(count1+1);
- delay();
- music(count2+1);
- delay();
- break;
-
-
- case 3:count=(table1[0]*10+table1[1])*(table1[2]*10+table1[3]);
- if(count<10) { LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count]);}
- else if(count<100)
- {
- count1=count/10; LCD_Write_Com(0x80+a+1); LCD_Write_Data(dat[count1]);
- count2=count%10; LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);
- delay();
- music(count1+1);
- delay();
- music(count2+1);
- delay();
- }
-
- else if(count<1000)
- {
- count1=count/100; LCD_Write_Com(0x80+a+1); LCD_Write_Data(dat[count1]);
- count2=count/10%10; LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);
- count3=count%10; LCD_Write_Com(0x80+a+3); LCD_Write_Data(dat[count3]);
- delay();
- music(count1+1);
- delay();
- music(count2+1);
- delay();
- music(count3+1);
- delay();
- }
- else if(count<10000)
- {
- count1=count/1000; LCD_Write_Com(0x80+a+1); LCD_Write_Data(dat[count1]);
- count2=count/100%10; LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);
- count3=count/10%10; LCD_Write_Com(0x80+a+3); LCD_Write_Data(dat[count3]);
- count4=count%10; LCD_Write_Com(0x80+a+4); LCD_Write_Data(dat[count4]);
- delay();
- music(count1+1);
- delay();
- music(count2+1);
- delay();
- music(count3+1);
- delay();
- music(count4+1);
- delay();
- }
- break;
- case 4: count=(table1[0]*10+table1[1])/(table1[2]*10+table1[3]);
-
-
-
- if(count<10)
- {
- LCD_Write_Com(0x80+a+1);LCD_Write_Data('0'); //LCD_Write_Data(dat[count]);
- LCD_Write_Com(0x80+a+2);LCD_Write_Data(dat[count]);
- delay();
- music(1);
- delay();
- music(count+1);
- delay();
- }
- else
- {
- count1=count/10; LCD_Write_Com(0x80+a+1); LCD_Write_Data(dat[count1]);
- count2=count%10; LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);
- delay();
- music(count1+1);
- delay();
- music(count2+1);
- delay();
- }
- break;
- }
- flag1=0;
- }
- else
- {
- if(IRcord[2]==0x43)
- {
- LCD_Write_Com(0x01);
- qingchu=1;
-
- }
- }
-
-
- }
- /*------------------------------------------------
- 紅外碼值處理
- ------------------------------------------------*/
- void Ircordpro(void)//紅外碼值處理函數(shù)
- {
- unsigned char i, j, k;
- unsigned char cord,value;
- k=1;
- for(i=0;i<4;i++) //處理4個(gè)字節(jié)
- {
- for(j=1;j<=8;j++) //處理1個(gè)字節(jié)8位
- {
- cord=irdata[k];
- if(cord>7)//大于某值為1,這個(gè)和晶振有絕對(duì)關(guān)系,這里使用12M計(jì)算,此值可以有一定誤差
- value|=0x80;
- if(j<8)
- {
- value>>=1;
- }
- k++;
- }
- IRcord[i]=value;
- value=0;
- }
- irpro_ok=1;//處理完畢標(biāo)志位置1
- }
- /*------------------------------------------------
- 主函數(shù)
- ------------------------------------------------*/
- void main(void)
- {
- int m;
- EX0init(); //初始化外部中斷
- TIM0init();//初始化定時(shí)器
- LCD_Init();
- LCD_Clear();//清??
-
- while(1)//主循環(huán)
- {
- while(irok==0); //如果接收好了進(jìn)行紅外處理
- irok=0 ;
- Ircordpro();
- while(irpro_ok==0); //如果處理好后進(jìn)行工作處理,如按對(duì)應(yīng)的按鍵后顯示對(duì)應(yīng)的數(shù)字等
- irpro_ok=0;
- Ir_work();
- if(qingchu==1)
- {
- qingchu=0;
- a=0;
- LCD_Write_Com(0x01);
- LCD_Write_Com(0x80);
- p=0;
- for(m=0;m<6;m++)
- table1[m]=0;
- }
- }
- }
-
復(fù)制代碼
所有資料51hei提供下載:
程序.zip
(48.59 KB, 下載次數(shù): 20)
2018-8-3 11:26 上傳
點(diǎn)擊文件名下載附件
紅外計(jì)算器 下載積分: 黑幣 -5
|
|