res=Red_check();//获得此次高脉冲宽度 if(res==250) { break;//非有用信号 }
if(res>=200&&res<250) { OK=1; //获得前导位(4.5ms) }
else if(res>=70&&res<100) //如果是宽脉冲,则RODATA=1 {
aa++;
RODATA=1;// 1.69ms } else if(res>=10&&res<50) //如果是窄脉冲,则RODATA=0 {
aa++;
RODATA=0;//500us }
//前1-8位是遥控器地址码,9-16位是地址反码,17-24是键值码,25-32是是键值反码
//获取正码
if(OK&&(aa>=0)&&(aa<8)) {
RED_add<<=1;
RED_add=RED_add+(uchar)RODATA; }
if(OK&&(aa>=17)&&(aa<25)) {
RED_key<<=1;
RED_key=RED_key+(uchar)RODATA; }
if(aa==32&&RED_add==0) {
KEY_main=Red_change(RED_key);break; } } } }
//把红外数据进行转换
uchar Red_change(uchar rednum) {
switch(rednum) {
23
case 16 :return 0; case 48:return 1; case 176:return 2; case 112:return 3; case 8:return 4; case 136:return 5; case 72:return 6; case 40:return 7; case 168:return 8; case 104:return 9;
case 0:return 10;//电源开关 case 32:return 11;//EQ case 144 :return 12;//快退 case 80:return 13;//快进 case 160:return 14;//声音减 case 96:return 15;//声音加 case 128:return 16;//CH - case 64:return 17;//CH + default: return 255; } }
7.3 矩阵键盘模块
#include \
#define KEY P2
void Key(void) {
uchar i = 0; uchar j = 0; uchar k = 0; KEY= 0x0F; i = KEY; if(i != 0x0F) { uint l=0; Delay(1000); KEY= 0x0F; i = KEY; if(i != 0x0F) {
24
KEY = 0x0F; i = KEY; KEY = 0xF0; j = KEY; k = i | j; KEY_change(k); } while(KEY !=0xf0 && l<2000) { KEY = 0xf0; l++; } } }
void KEY_change(uchar i) {
switch(i) { case 0xED:{KEY_main= 1;break;} case 0xDD:{KEY_main= 2;break;} case 0xBD:{KEY_main= 3;break;} case 0xEB:{KEY_main= 4;break;} case 0xDB:{KEY_main= 5;break;} case 0xBB:{KEY_main= 6;break;} case 0xE7:{KEY_main= 7;break;} case 0xD7:{KEY_main= 8;break;} case 0xB7:{KEY_main= 9;break;} case 0xEE:{KEY_main= 10;break;} case 0xDE:{KEY_main= 0;break;} case 0xBE:{KEY_main= 11;break;} default: break; } }
void Delay(unsigned int i) {
while(-- i); }
void INIT_TIME_0() {
TMOD = 0X00; TH0 = 0X0E; TL0 = 0;
25
ET0 =1; TR0 = 1; }
void KEY_TIME_0() interrupt 1 using 0 {
TH0 = 0X0E; TL0 = 0; Key(); }
7.4 LCD12864显示
#include \
sbit CS = P0^3; sbit SID = P0^2; sbit CLK = P0^1; sbit RESET = P0^0;
#define lcdcom_w 0xf8 #define lcdcom_r 0xfc #define lcddata_w 0xfa #define lcddata_r 0xfd
//汉字地址表
uchar code addr_tab[]={ //便于根据汉字坐标求出地址 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置 };
//***************************************************** // 函 数 名:void Delay_LCD(void) // 功 能:5ms延时
//****************************************************/ void Delayms(uint t) //约延时ms {uint i;while(t--){for(i=0;i<125;i++);}}
void LCD_SendByte(uchar Dbyte) {
unsigned char i; for(i=0;i<8;i++) { CLK = 0;
26
Dbyte=Dbyte<<1; SID = CY; CLK = 1; CLK = 0; } }
/********************************************************** 接收一个字节
***********************************************************/ uchar LCD_ReceiveByte() {
unsigned char i,temp1,temp2; temp1=temp2=0; for(i=0;i<8;i++) { temp1=temp1<<1; CLK = 0; CLK = 1; CLK = 0; if(SID) temp1++; }
for(i=0;i<8;i++) { temp2=temp2<<1; CLK= 0; CLK= 1; CLK= 0; if(SID) temp2++; }
return ((0xf0&temp1)+(0x0f&temp2)); }
/**************************************************************** 检查忙状态
******************************************************************/
void LCD_Read_busy() {
do {
LCD_SendByte(lcdcom_r); //11111,RW(1),RS(0),0 }
while(0x80&LCD_ReceiveByte()); }
void LCD_Write(uchar k, uchar value) // k = 0 写命令,k = 1 写数据
27
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库课程设计 - 红外遥控电子密码锁的设计与实现(6)在线全文阅读。
相关推荐: