typedef unsigned char uchar; typedef unsigned int uint; typedef bit BOOL ; sbit oe=P1^0; sbit s0=P1^1; sbit s1=P1^2; sbit s2=P1^3; sbit s3=P1^4; sbit led=P1^5; sbit key=P1^6; sbit pwm=P3^6; sbit rw = P2^6; sbit rs= P2^5; sbit ep = P2^7;
uchar code play[]={\"about r/min\uchar dis[8]={2,2,4,4,6,6,8,8}; uchar num,irtime,fi,bi, te; uchar r=0,g=0,b=0;
/***********************延时函数**************************/ void delay(uint ms) { // 延时子程序 uchar i; while(ms--) { for(i = 0; i< 250; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } }
/********************LCD初始化*************************/ BOOL lcd_bz() { // 测试LCD忙碌状态 BOOL result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_();
_nop_(); _nop_(); result = (BOOL)(P0 & 0x80); ep = 0; return result; }
lcd_wcmd(uchar cmd) { while(lcd_bz()); rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }
lcd_pos(uchar pos) { lcd_wcmd(pos | 0x80); }
lcd_wdat(uchar dat) { while(lcd_bz()); rs = 1; rw = 0; ep = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_();
// 写入指令数据到LCD //设定显示位置 //写入字符显示数据到LCD ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }
lcd_init() { //LCD初始化设定 lcd_wcmd(0x38); // delay(1); lcd_wcmd(0x0c); // delay(1); lcd_wcmd(0x06); // delay(1); lcd_wcmd(0x01); //清除LCD的显示内容 delay(1); }
/******************定时器初始化*************************/ void init() {
TMOD=0X01; TH0=0XD8; TL0=0XF0; EA=1; ET0=1; ET1=1; }
void init1() {
TMOD=0X61; TH1=255; TL1=255; }
void init_1() {
TMOD=0X20; TH1=0X9C; TL1=0X9C; TR1=1; }
/*****************求脉冲波*****************************/
uchar pulse(uchar bu,uchar bi) {
uchar i;
s2=bu,s3=bi; irtime=0; TR0=1; TR1=1; oe=0;
while(TR0); oe=1; TR1=0; i=irtime; irtime=0;
return i; }
/******************白平衡********************************/ void white() {
r=255/pulse(0,0); b=255/pulse(0,1); g=255/pulse(1,1); }
/*******************测色***********************************/ void color() {
uchar j,k,l; j=r*pulse(0,0); k=b*pulse(0,1); l=g*pulse(1,1);
if(100>=k) num=num|0x04; if(100>=l) num=num|0x02; if(100>=j) num=num|0x01; fi=1; }
/***********************等待白平衡结束********/ void whiteover() {
uchar i;
while(!te)
{ if(key==0) { delay(15); if(key==0) { i=1; delay(50); } } if(i==1) { white(); if(r==0) te=0; else {te=1;led=!led;} } } }
/*******************************************************************/ void display() {
uchar i;
lcd_pos(0x42);
while(play[ i ] != '\\0')
{ //显示字符\"WLCOME TO\" lcd_wdat(play[ i ]); i++; }
switch(dis[num]) { case 2: lcd_pos(0x48);lcd_wdat(0x31);lcd_wdat(0x35);break; case 4: lcd_pos(0x48);lcd_wdat(0x34);lcd_wdat(0x32);break; case 6: lcd_pos(0x48);lcd_wdat(0x37);lcd_wdat(0x30);break; case 8: lcd_pos(0x48);lcd_wdat(0x39);lcd_wdat(0x38);break; } }
/************************主程序*************************/ void main() {
key=1,led=0;pwm=0; s0=1;s1=1;oe=1; IP=0X02; init(); lcd_init();
while(1) { init1(); whiteover(); color(); display(); if(fi==1) { init_1(); delay(500); TR1=0; num=0; pwm=0; fi=0; } } }
/*************************中断程序****************************/ void time0() interrupt 1 {
TH0=0XD8; TL0=0XF0; TR0=0; }
void time1() interrupt 3 {
irtime++; if(1==fi) {
if(dis[num]>irtime) pwm=1; else { if(irtime<=8) { pwm=0; if(irtime==8) irtime=0; } } } }