- 积分
- 1493
- 在线时间
- 2240 小时
- 最后登录
- 2024-3-6
- 阅读权限
- 70
- 精华
- 2
- UID
- 20253
- 帖子
- 1325
- 精华
- 2
- 经验
- 1493 点
- 金钱
- 1278 ¥
- 注册时间
- 2007-3-16
|
楼主 |
发表于 2010-1-6 09:19
|
显示全部楼层
源程序
显示代码:
/***************************************************************
*程序说明:此LCD驱动程序可用于LM3037 LCD模块
*
***************************************************************/
#include <at89x051.h>
#include <stdio.h>
#include <intrins.h>
#include "OS_CPU.h"
#include "lcd.h"
#include "delaytime.h"
#define INPUT 1
#define OUTPUT 2
#define VOL 3
#define MUTE 4
#define CD 1
#define DVD 2
#define PC 3
#define TUNER 4
#define TV 5
#define INSIDE 1
#define OUTER 2
#define MUTECLR 1
#define MUTEDIS 2
/***********************************************************
*定义单片机与LCD的接口
***********************************************************/
INT8U code db_value[24]={'-',60,57,54,51,49,46,42,40,38,35,32,30,27,24,21,19,16,13,10,8,5,3,0};
#define Lcd_Bus P1
sbit RS = P3^4;
sbit RW = P3^5;
sbit E = P3^7;
//sbit PSB= P3^4;
bit RECEIVE_FLG=0;
INT8U rcmd=0,rdata=0;
/***************************************
* 功能:延时程序,延长时间为a(ms).
****************************************/
void DelayTime(INT16U a)
{
INT8U i;
while(a--)
for(i=0;i<125;i++);
}
//写命令到LCD
void Write_Com(INT8U cmdcode)
{
RS=0;
RW=0;
E=1;
Lcd_Bus=cmdcode;
E=0;
DelayTime(2);
}
//写数据到LDC
void Write_Data(INT8U disdata)
{
RS=1;
RW=0;
E=1;
Lcd_Bus=disdata;
E=0;
DelayTime(2);
}
/***********************************************
*功能:初始化LCE屏,可以根据LCD显示的要求作修改
************************************************/
void Lcd_Init(void)
{
DelayTime(4);
Write_Com(0x38); //选择8bit数据流
DelayTime(4);
Write_Com(0x0c); //开显示,游标OFF,游标位置反白OFF。
DelayTime(4);
Write_Com(0x01); //清除显示
DelayTime(4);
Write_Com(0x06);
DelayTime(2);
}
/**************************************************
* 功能:在LCD上显示字符串,并指明起始位置
***************************************************/
void Lcd_Str(INT8U startaddr,INT8U *str)
{
Write_Com(startaddr);
while(*str>0)
{Write_Data(*str);
str++;
DelayTime(2);
}
}
/*****************************************************
*功能:在LCD上显示数字
********************************************************/
void Lcd_Num(INT8U startaddr, INT8U disnum)
{
INT8U num[3]={0,0,'\0'};
num[0]=disnum/10%10+0x30;
num[1]=disnum%10+0x30;
Lcd_Str(startaddr,num);
}
void Uart_int(void)
{
SCON=0x50;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ES=1;
EA=1;
}
void Uart_interrupt(void) interrupt 4 using 1
{
rcmd=SBUF;
RI=0;
while(!RI);
rdata=SBUF;
RI=0;
RECEIVE_FLG=1;
}
void ReceiveDeal(void)
{
RECEIVE_FLG=0;
switch(rcmd)
{
case INPUT:
switch(rdata)
{
case CD:
Lcd_Str(0x83,"CD ") ;
break;
case DVD:
Lcd_Str(0x83,"DVD") ;
break;
case PC:
Lcd_Str(0x83,"PC ");
break;
case TUNER:
Lcd_Str(0x83,"TUN");
break;
case TV:
Lcd_Str(0x83,"TV ");
break;
default:break;
}
break;
case OUTPUT:
if(rdata==INSIDE)Lcd_Str(0x88,"内");
else if(rdata==OUTER)Lcd_Str(0x88,"外");
break;
case VOL:
Lcd_Str(0x90,"音量:[ ]- DB");
Delay_ms(1);
Lcd_Num(0x93,rdata);
Delay_ms(1);
Lcd_Num(0x95,db_value[rdata]);
Lcd_Str(0x97," ");
break;
case MUTE:
if(rdata==MUTEDIS) Lcd_Str(0x97,"静音");
else if(rdata==MUTECLR)Lcd_Str(0x97," ");
break;
default:break;
}
}
void main(void)
{
Uart_int();
Lcd_Init();
Lcd_Str(0x82,"HIFIDIY");
Delay_ms(4);
Lcd_Str(0x90,"2009参赛作品");
Delay_ms(2600);
Lcd_Init();
Lcd_Str(0x80,"输入:");
Delay_ms(2);
Lcd_Str(0x90,"音量: - DB");
Delay_ms(2);
Lcd_Str(0x85,"输出:");
while(1)
{
if(RECEIVE_FLG)ReceiveDeal();
}
}
控制代码
#include<W78e65.h>
#include"OS_CPU.H"
#include"delaytime.h"
#define INPUT 1
#define OUTPUT 2
#define VOL 3
#define MUTE 4
#define CD 1
#define DVD 2
#define PC 3
#define TUNER 4
#define TV 5
#define INSIDE 1
#define OUTER 2
#define MUTECLR 1
#define MUTEDIS 2
#define KEY_VOL_INC (P2&0xc0)==0x40
#define KEY_VOL_DEC (P2&0xc0)==0x80
#define KEY_MUTE (P2&0x20)==0
#define KEY_INPUT_SEL (P2&0x10)==0
#define KEY_OUTPUT_SEL (P2&0x08)==0
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;
sbit key9=P0^7;
sbit key10=P0^6;
sbit key11=P0^5;
sbit key12=P0^4;
sbit key13=P0^3;
sbit BEE=P0^0;
sbit LED2=P0^2;
sbit sc1=P2^0;
sbit sc2=P2^1;
sbit sc3=P2^2;
sbit sc4=P3^3;
sbit sc5=P3^4;
sbit sc6=P3^5;
sbit sc7=P3^6;
sbit sc8=P3^7;
sbit red_pin=P3^2;
bit RECEIVE_FLG=0;
INT8U reddata[4];
typedef enum {VOL_INC_KEY=1,VOL_DEC_KEY,MUTE_KEY,INPUT_SEL_KEY,OUTPUT_SEL_KEY}KEY_VALUE;
INT8U VOL_OFFSET=10;
INT8U INPUT_OFFSET=3;
INT8U OUTPUT_OFFSET=0;
INT8U pre_vol_value=0;
bit MUTE_FLG=0;
INT8U Key_scan(void)
{
INT8U key_value=0;
if(KEY_VOL_INC)key_value=VOL_INC_KEY;
else if(KEY_VOL_DEC)key_value=VOL_DEC_KEY;
else if(KEY_MUTE)
{
Delay_ms(8);
if(KEY_MUTE)key_value=MUTE_KEY;
}
else if(KEY_INPUT_SEL)
{
Delay_ms(8);
if(KEY_INPUT_SEL)key_value=INPUT_SEL_KEY;
}
else if(KEY_OUTPUT_SEL)
{
Delay_ms(8);
if(KEY_OUTPUT_SEL)key_value=OUTPUT_SEL_KEY;
}
while((P2&0xf8)!=0xf8) ;
return key_value;
}
void Dis_str(INT8U cmd,INT8U sdata)
{
SBUF=cmd;
while(!TI);
TI=0;
Delay_ms(3);
SBUF=sdata;
while(!TI);
TI=0;
}
void Drive_relay(INT8U vol_value)
{
if(MUTE_FLG!=1)
{
Dis_str(VOL,vol_value);
}
switch(vol_value)
{
case 0:
key1=0;Delay_ms(100);
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=1;
break;
case 1:
key2=0; Delay_ms(100);
key1=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=1;
break;
case 2:
key3=0; Delay_ms(100);
key1=1;
key2=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=1;
break;
case 3:
key4=0; Delay_ms(100);
key1=1;
key2=1;
key3=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=1;
break;
case 4:
key5=0; Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=1;
break;
case 5:
key6=0;Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=1;
break;
case 6:
key7=0;Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=1;
break;
case 7:
key8=0;Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=1;
break;
case 8:
key9=0;Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key10=1;
key11=1;
key12=1;
sc6=1;
break;
case 9:
key10=0;Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key11=1;
key12=1;
sc6=1;
break;
case 10:
key11=0; Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key12=1;
sc6=1;
break;
case 11:
key12=0;Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
sc6=1;
break;
case 12:
key12=0; Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
sc6=0;
break;
case 13:
key11=0; Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key12=1;
sc6=0;
break;
case 14:
key10=0; Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key11=1;
key12=1;
sc6=0;
break;
case 15:
key9=0; Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key10=1;
key11=1;
key12=1;
sc6=0;
break;
case 16:
key8=0; Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=0;
break;
case 17:
key7=0; Delay_ms(2);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=0;
break;
case 18:
key6=0; Delay_ms(100);
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=0;
break;
case 19:
key5=0;Delay_ms(2);
key1=1;
key2=1;
key3=1;
key4=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=0;
break;
case 20:
key4=0; Delay_ms(100);
key1=1;
key2=1;
key3=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=0;
break;
case 21:
key3=0;Delay_ms(2);
key1=1;
key2=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=0;
break;
case 22:
key2=0;Delay_ms(100);
key1=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=0;
break;
case 23:
key1=0;Delay_ms(100);
key2=1;
key3=1;
key4=1;
key5=1;
key6=1;
key7=1;
key8=1;
key9=1;
key10=1;
key11=1;
key12=1;
sc6=0;
break;
default:break;
}
//}
}
void Uart_Init(void)
{
PCON=0x0;
SCON=0x50; //串口工作方式三
T2MOD=0;
RCAP2L=0xdc;
RCAP2H=0xff;
T2CON=0x30; //波特率设定rate=9600
TR2=1;
}
void Key_deal(INT8U key_value)
{
if(key_value==VOL_INC_KEY)
{
if(VOL_OFFSET<23)
{
MUTE_FLG=0;
VOL_OFFSET++;
Drive_relay(VOL_OFFSET);
pre_vol_value=VOL_OFFSET;
}
}
else if(key_value==VOL_DEC_KEY)
{
if(VOL_OFFSET>0)
{
MUTE_FLG=0;
VOL_OFFSET--;
Drive_relay(VOL_OFFSET);
pre_vol_value=VOL_OFFSET;
}
}
else if(key_value==MUTE_KEY)
{
if(MUTE_FLG==1)
{
Dis_str(MUTE,MUTECLR);
Delay_ms(20);
MUTE_FLG=0;
Drive_relay(VOL_OFFSET);
pre_vol_value=VOL_OFFSET;
}
else
{
Dis_str(MUTE,MUTEDIS);
Delay_ms(20);
MUTE_FLG=1;
Drive_relay(0);
pre_vol_value=0;
}
}
else if(key_value==INPUT_SEL_KEY)
{
if(INPUT_OFFSET<4)INPUT_OFFSET++;
else INPUT_OFFSET=0;
switch(INPUT_OFFSET)
{
case 0:
Dis_str(INPUT,CD);
sc1=0;
sc2=0;
sc3=0;
sc4=0;
sc5=1;
break;
case 1:
Dis_str(INPUT,DVD);
sc1=0;
sc2=0;
sc3=0;
sc4=1;
sc5=0;
break;
case 2:
Dis_str(INPUT,PC);
sc1=0;
sc2=0;
sc3=1;
sc4=0;
sc5=0;
break;
case 3:
Dis_str(INPUT,TUNER);
sc1=0;
sc2=1;
sc3=0;
sc4=0;
sc5=0;
break;
case 4:
Dis_str(INPUT,TV);
sc1=1;
sc2=0;
sc3=0;
sc4=0;
sc5=0;
break;
default:break;
}
}
else if(key_value==OUTPUT_SEL_KEY)
{
if(OUTPUT_OFFSET==1)
{
Dis_str(OUTPUT,INSIDE);
OUTPUT_OFFSET=0;
sc7=1;
key13=1;
LED2=0;
}
else
{
Dis_str(OUTPUT,OUTER);
OUTPUT_OFFSET=1;
sc7=0;
key13=0;
LED2=1;
}
}
}
/**************************************************************************/
//红外遥控接收程序
void Ds0_83ms(void)
{
INT8U i;
for(i=0;i<255;i++);
}
void Ds2_5ms(void)
{
INT8U i,j;
for(i=0;i<5;i++)
for(j=0;j<153;j++);
}
void Red_read(void) interrupt 0 using 1//外部中断1的函数
{
INT8U i,j;
INT8U dm=0;
BOOL RED_FLG=1;
for(i=0;i<10;i++)
{
Ds0_83ms();
if(red_pin==1)
{
RED_FLG=0;
break;
}
}
if(RED_FLG)
{
while(!red_pin);
Ds2_5ms();
if(red_pin)
{
while(red_pin);
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
dm>>=1;
while(!red_pin);
Ds0_83ms();
if(red_pin)
{
dm=dm|0x80;
while(red_pin);
}
}
reddata=dm;
dm=0;
}
if((reddata[2]==(~reddata[3])))
{
if((reddata[0]==0x08)) RECEIVE_FLG=1;
}
}
}
}
void ReadKeyDeal(void)
{
INT8U key_value=0;
RECEIVE_FLG=0;
switch(reddata[2])
{
case 0x1d: //input
key_value=INPUT_SEL_KEY;
break;
case 0x1e://mute
key_value=MUTE_KEY;
break;
case 0x1f://output
key_value=OUTPUT_SEL_KEY;
break;
case 0x15://vol dec
key_value=VOL_DEC_KEY;
break;
case 0x17://vlo inc
key_value=VOL_INC_KEY;
break;
default:break;
}
Key_deal(key_value);
Delay_ms(50);
BEE=0;
}
/********************************************************************/
void main(void)
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
IT0=1;//外部中断0,下降延触发
IE0=0; //清除外部中断0标记位
EX0=1;
Uart_Init();
EA=0;
//*************************************************
////音量初始化
key10=0;
sc6=1;
sc1=0;
sc2=0;
sc3=0;
sc4=0;
sc5=1;
OUTPUT_OFFSET=0;
sc7=1;
key13=1;
LED2=0;
// BEE=0;
Delay_ms(3000);
Dis_str(INPUT,CD);
Delay_ms(40);
Dis_str(OUTPUT,INSIDE);
Delay_ms(50);
// Dis_str(VOL,VOL_OFFSET);
Dis_str(VOL,0);
Delay_ms(50);
BEE=0;
EA=1;
//***********************************************
while(1)
{
Key_deal(Key_scan());
if(RECEIVE_FLG==1)
{
BEE=1;
ReadKeyDeal();
}
}
} |
|