用遥控器控制LCD显示按键数值
2017-02-15 22:55
387 查看
#include<reg52.h> #include<stdio.h> #include <intrins.h> #include"./uart/uart.h" #include"./delay/delay.h" #include"1602.h" sbit IR_IN = P3^2; sbit LED0 = P1^0; sbit LED1 = P1^1; sbit LED2 = P1^2; sbit LED3 = P1^3; sbit LED4 = P1^4; sbit LED5 = P1^5; sbit LED6 = P1^6; sbit LED7 = P1^7; unsigned int irtime; bit irok = 0; bit chang_ok = 0; bit startflag = 0; unsigned char irdata[33]; unsigned char sbuf[5]; unsigned char bitnum = 0; unsigned char str[35]; unsigned char buf[4]; unsigned char handle_ok = 0; void int0_init() { IT0 = 1; //设置外部中断的触发方式 EA = 1; EX0 = 1; } void timer0_init() { EA = 1; TMOD |= 0x02; TH0 = 0; ET0 = 1; TR0 = 1; } void timer0_isr() interrupt 1 { irtime++;//0.256ms 引导码 13.5/0.256 = 52 1.12/0.256 = 4 0.56+1.685/0.256 = 8 } /*void chang_num() { unsigned char i; str[0] = irdata[0] / 10 + '0'; str[1] = irdata[0] % 10 + '0'; for(i = 0; i < 32; i++) { str[i + 2] = irdata[i + 1] + '0'; if(str[i + 2] <= (6 +'0')) { str[i + 2] = 0 + '0'; } else { str[i + 2] = 1 + '0'; } } str[34] = '\0'; chang_ok = 1; } */ void num_handle() { unsigned char i,j,k = 1; unsigned char temp = 0; if(irok == 1) { for(i = 0; i < 4; i++) { for(j = 0; j < 8; j++) { temp >>= 1; if(irdata[k] > 6) { temp += 0x80; } k++; } buf[i] = temp; } irok = 0; } if((buf[0] + buf[1] == 0xff) && (buf[2] + buf[3] == 0xff)) { handle_ok = 1; } } void main() { timer0_init(); int0_init(); uart_init(); LCD_Init(); LCD_Clear(); while(1) { if(irok == 1) { // chang_num(); num_handle(); switch(buf[2]) { /* case 0x45: LED0 = ~ LED0;break; case 0x46: LED1 = ~ LED1;break; case 0x47: LED2 = ~ LED2;break; case 0x44: LED3 = ~ LED3;break; case 0x40: LED4 = ~ LED4;break; case 0x43: LED5 = ~ LED5;break; case 0x07: LED6 = ~ LED6;break; case 0x15: LED7 = ~ LED7;break; default:break;*/ case 0x45: sprintf(sbuf,"%c",1 + 0X30); LCD_Write_String(0,0,sbuf); break; case 0x46: sprintf(sbuf,"%c",2 + 0X30); LCD_Write_String(0,0,sbuf); break; case 0x47: sprintf(sbuf,"%c",3 + 0X30); LCD_Write_String(0,0,sbuf); break; case 0x44: sprintf(sbuf,"%c",4 + 0X30); LCD_Write_String(0,0,sbuf); break; case 0x40: sprintf(sbuf,"%c",5 + 0X30); LCD_Write_String(0,0,sbuf); break; case 0x43: sprintf(sbuf,"%c",6 + 0X30); LCD_Write_String(0,0,sbuf); break; case 0x07: sprintf(sbuf,"%c",7 + 0X30); LCD_Write_String(0,0,sbuf); break; case 0x15: sprintf(sbuf,"%c",8 + 0X30); LCD_Write_String(0,0,sbuf); break; default:break; } if(handle_ok == 1) { str[0] = (buf[0] / 16) > 9 ? (buf[0] / 16) + 0x37 : (buf[0] / 16) + 0x30; str[1] = (buf[0] % 16) > 9 ? (buf[0] % 16) + 0x37 : (buf[0] % 16) + 0x30; str[2] = (buf[1] / 16) > 9 ? (buf[1] / 16) + 0x37 : (buf[1] / 16) + 0x30; str[3] = (buf[1] % 16) > 9 ? (buf[1] % 16) + 0x37 : (buf[1] % 16) + 0x30; str[4] = (buf[2] / 16) > 9 ? (buf[2] / 16) + 0x37 : (buf[2] / 16) + 0x30; str[5] = (buf[2] % 16) > 9 ? (buf[2] % 16) + 0x37 : (buf[2] % 16) + 0x30; str[6] = (buf[3] / 16) > 9 ? (buf[3] / 16) + 0x37 : (buf[3] / 16) + 0x30; str[7] = (buf[3] % 16) > 9 ? (buf[3] % 16) + 0x37 : (buf[3] % 16) + 0x30; str[8] = '\r'; str[9] = '\n'; handle_ok = 0; } uart_send_string(str); irok = 0; } /* if(chang_ok == 1) { uart_send_string(str); uart_send_byte('\n'); chang_ok = 0; } */ } } void int0_isr() interrupt 0 { if(startflag) { if((irtime > 40)&&(irtime < 60)) { bitnum = 0; } irdata[bitnum] = irtime; bitnum++; irtime = 0; if(bitnum == 33) { irok = 1; // irdata[33] = '\0'; bitnum = 0; startflag = 0; } } else { irtime = 0; startflag = 1; } }
#include<reg52.h> #include"./uart/uart.h" void uart_init() { SCON = 0x50; //设置串口工作模式,打开接受允许 //SM0 = 0 ; SM1 = 1 ; REN = 0 ; //TMOD &= 0x0f; TMOD |= 0x20; //设置定时器1为工作方式2 TH1 = 0xfd; //波特率9600 //ET1 = 0; TR1 = 1; //EA = 1; //ES = 1; } void uart_send_byte(unsigned char byte) { SBUF = byte; //TI位自动置1,手动清0 while(!TI);// while(TI != 1); TI = 0; } void uart_send_string(unsigned char *string) { while(*string) { uart_send_byte(*string); string++; } }
#include "1602.h" #include "./delay/delay.h" #define CHECK_BUSY//是否使用判断忙语句条件,后面使用条件编译 sbit RS = P2^4; //定义端口 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 /*------------------------------------------------ 判忙函数 ------------------------------------------------*/ bit LCD_Check_Busy(void) { #ifdef CHECK_BUSY DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); #else return 0; #endif } /*------------------------------------------------ 写入命令函数 ------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { while(LCD_Check_Busy()); //忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } /*------------------------------------------------ 写入数据函数 ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { while(LCD_Check_Busy()); //忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } /*------------------------------------------------ 清屏函数 ------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); delay_ms(5); } /*------------------------------------------------ 写入字符串函数 ------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { while (*s) { LCD_Write_Char(x,y,*s); s ++; x++; } } /*------------------------------------------------ 写入字符函数 ------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); } /*------------------------------------------------ 初始化函数 ------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*显示模式设置*/ delay_ms(5); LCD_Write_Com(0x38); delay_ms(5); LCD_Write_Com(0x38); delay_ms(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ delay_ms(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ }
相关文章推荐
- 用遥控器控制led灯亮以及LCD上显示相应的按键数
- DAC按键控制加减LCD显示
- 按键控制数码管显示
- 按键控制数码管显示
- 按键控制计数,用两个数码管显示0到99。十位数为0的时候,显示为空白
- 4*4矩阵按键控制数码管显示0-F
- 按键控制显示LED亮度
- 按键控制单个数码管显示
- 用定时器1控制四位数码管从6432减到6393保持住这个数值,同时用定时器0控制流水灯从上至下以500ms移动同时停止!!!然后流水灯全部闪烁2.4秒后熄灭!继而数码管上显示6666
- TFT LCD控制显示总结(硬件概念、初始化相关配置)(转)
- 外中断(按键)控制数码管显示
- AVRmeg16单片机实现按键控制LCD1602的数据显示
- TQ2440的学习——TFT LCD控制显示总结(硬件概念、初始化相关配置)
- easyUI数据统计列表中根据单元格数值控制显示效果
- 按键控制电机显示速度
- 【转】TQ2440的学习——TFT LCD控制显示总结(硬件概念、初始化相关配置)
- 7.mini2440开发板LCD(x35 TFT 240*320)显示控制(裸机)
- 并行口实现数字0~9、A~F、L、U、P、n总共19个键盘,将按键的结果用7段数码管(例如:7SEG-MPX-CA-BLUE)显示(可选——按键控制移位)出来
- 按键控制移位显示
- 遥控器输入,用LCD显示灯的号码