基于51单片机的窗帘【光线,12864,步进电机】(仿真)

给大家提供一些资料详细解释,有需要的自行提取,网盘地址我放在下面

 链接:https://pan.baidu.com/s/1NigBeujDZTCFL0hdMiu7yg?pwd=syxp 
提取码:syxp 

简易窗帘控制

1、测量光照强度

2、光照强度过高,开窗帘;光照强度过低,关窗帘

3、通过12864显示窗帘状态

不能用于实物

#include <AMPIRE128X64.h>
uchar *ppp,*qqq;
 uchar code num0[16] ={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};/*"0",0*/
 uchar code num1[16] ={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};/*"1",1*/
 uchar code num2[16] ={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};/*"2",2*/
 uchar code num3[16] ={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};/*"3",3*/
 uchar code num4[16] ={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};/*"4",4*/
 uchar code num5[16] ={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};/*"5",5*/
 uchar code num6[16] ={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};/*"6",6*/
 uchar code num7[16] ={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};/*"7",7*/
 uchar code num8[16] ={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};/*"8",8*/
 uchar code num9[16] ={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};/*"9",9*/
 uchar code fuhao[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01};/*"-",0*/
 uchar code kong[16] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*" ",0*/
 uchar code dian[16] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};/*".",0*/ 
/************** 判忙函数 **************/ 
void lcd_r_busy()
{
    P2 = 0x00;
    RS = 0;
    RW = 1;
    EN = 1;
    while (P2 & 0x80);  // 最高位DB7==1,则busy
    EN = 0;
}
 
 
/************* LCD写命令函数 *************/
void lcd_w_cmd(uchar value)
{
    lcd_r_busy();    // 每次读写操作前都要忙判断
    RS = 0;
    RW = 0;
    P2 = value;
    EN = 1;       // 下降沿锁存写入的数据/命令
    _nop_();
    _nop_();
    EN = 0;
}
 
 
/************* LCD写数据  **************/
void lcd_w_data(uchar value)
{
    lcd_r_busy();
    RS = 1;
    RW = 0;
    P2 = value;
    EN = 1;        // 下降沿锁存写入的数据/命令
    _nop_();
    _nop_();
    EN = 0;
}
 
 
/***************页设置:显示在哪一页******************/
/*************共8页,一页是8行像素点*****************/
void lcd_set_page(uchar page)
{
    page = 0xb8 | page;   // 页的首地址为0xb8:page或上0xb8=选择page页
    lcd_w_cmd(page);
}
 
 
/************行设置:起始在哪一行********************/
/**********每页共8行,一般从0行开始******************/
void lcd_set_line(uchar sline)
{
    sline = 0xc0 | sline;  // 起始行地址为0xc0:sline或上0xc0=选择行
    lcd_w_cmd(sline);
}
 
 
/*************起始列设置+像素点选择********************/
/***********每半片共64列,列值不得大于63***************/
void lcd_set_column(uchar column)
{
    column = 0x3f & column;  // 与上列的最大值63:0x3f 可得所选列值<63
    column = 0x40 | column;  // 得列的首地址
    lcd_w_cmd(column);
}
 
 
/*************设置显示的开关********************/
/**********0为关闭显示;1为 开启显示************/
void lcd_on_off(uchar set)
{
    set = 0x3e | set;    // =0011 111x----0x3e为关闭显示;0x3f为开启显示
    lcd_w_cmd(set);
}
 
 
/*************选择左右半屏显示********************/
/********0-全屏显示;1-左;2-右********************/
/************cs片选端低电平有效********************/
void lcd_cs(uchar sel)
{
    switch (sel)
    {
    case 0:CS1 = 0; CS2 = 0; break;   // 全屏显示
    case 1:CS1 = 0; CS2 = 1; break;   // 左显示
    case 2:CS1 = 1; CS2 = 0; break;   // 右显示
    default:break;
    }
}
 
 
/*************清屏:选择半屏********************/
/********0-清全屏;1-清左;2-清右***************/
void lcd_clear(uchar sel)
{
    uchar i, j;
    lcd_cs(sel);
    for (i = 0; i < 8; i++)
    {
        lcd_set_page(i);
        lcd_set_column(0);
        for (j = 0; j < 64; j++)
        {
            lcd_w_data(0x00);  // 每列全部写0,列地址指针自动+1
        }
    }
}

/****************LCD的初始化********************/
void lcd_init()
{
    lcd_r_busy();
    lcd_cs(0);
    lcd_on_off(0);     // 关显示
    lcd_cs(0);
    lcd_on_off(1);     // 开显示
    lcd_cs(0);
    lcd_clear(0);      // 清全屏
    lcd_set_line(0);  // 起始行设为0
}
 
 
/****************16*16像素的汉字显示程序********************/
//CS左右半屏1,2
//page 页	  lie0-7 	 hang0-3
void display(uchar hang, uchar lie, uchar* p)
{
    uchar i;
    lcd_cs((lie>3)+1);
    lcd_set_page(hang*2);       // 要在本页写上半个汉字8*16
    lcd_set_column(lie*16);     // 选择起始列
    for (i = 0; i < 16; i++)
    {
        lcd_w_data(p[i]);      // 按列输入上半个汉字的编码8*16
    }
    lcd_set_page(hang*2 + 1);     // 要在下一页写下半个汉字8*16
    lcd_set_column(lie*16);     // 选择起始列
    for (i = 0; i < 16; i++)
    {
        lcd_w_data(p[i + 16]);   // 按列输入下半个汉字的编码8*16 
    }
}
/****************2数字显示程序********************/
//CS左右半屏1,2
//page 页
void display_num(uchar hang, uchar lie, uchar* p,uchar* q)
{
    uchar i;
    lcd_cs((lie>3)+1);
    lcd_set_page(hang*2);       // 要在本页写上半个汉字8*16
    lcd_set_column(lie*16);     // 选择起始列
    for (i = 0; i < 8; i++)
    {
        lcd_w_data(p[i]);      // 按列输入上半个汉字的编码8*16
    }
	for (i = 0; i < 8; i++)
    {
        lcd_w_data(q[i]);      // 按列输入上半个汉字的编码8*16
    }
    lcd_set_page(hang*2 + 1);     // 要在下一页写下半个汉字8*16
    lcd_set_column(lie*16);     // 选择起始列
    for (i = 8; i < 16; i++)
    {
        lcd_w_data(p[i]);   // 按列输入下半个汉字的编码8*16 
    }
	for (i = 8; i < 16; i++)
    {
        lcd_w_data(q[i]);   // 按列输入下半个汉字的编码8*16 
    }
}
/****************1数字显示程序********************/
//CS左右半屏1,2
//page 页	lie0-15
void display_one(uchar hang, uchar lie, uchar* p)
{
    uchar i;
    lcd_cs((lie>7)+1);
    lcd_set_page(hang*2);       // 要在本页写上半个汉字8*16
    lcd_set_column(lie*8);     // 选择起始列
    for (i = 0; i < 8; i++)
    {
        lcd_w_data(p[i]);      // 按列输入上半个汉字的编码8*16
    }
    lcd_set_page(hang*2 + 1);     // 要在下一页写下半个汉字8*16
    lcd_set_column(lie*8);     // 选择起始列
    for (i = 8; i < 16; i++)
    {
        lcd_w_data(p[i]);   // 按列输入下半个汉字的编码8*16 
    }
}

void find(uchar i)//查找指针
{
	switch(i)
	{
		case 0:ppp=num0;break;
		case 1:ppp=num1;break;
		case 2:ppp=num2;break;
		case 3:ppp=num3;break;
		case 4:ppp=num4;break;
		case 5:ppp=num5;break;
		case 6:ppp=num6;break;
		case 7:ppp=num7;break;
		case 8:ppp=num8;break;
		case 9:ppp=num9;
	}
}
//hang=0246显示位置	 lie0-15,hang0-3	mm符号16x16
void disp_num1(uchar hang,uchar lie,float b,uchar *mm)//显示数字,小数点1位
{	
	unsigned long i=0;
	uchar j;
	uchar k=0;
	uchar ampire[]={0,0,0,0,0};
	if(b<0)//显示符号
	{
		i=-b*10;
		display_one(hang,lie,fuhao);
		k++;
	}
	else
		i=b*10;
	ampire[0]=i/10000;
	ampire[1]=i%10000/1000;
	ampire[2]=i%1000/100;
	ampire[3]=i%100/10;
	ampire[4]=i%10;
	for(j=0;j<4;j++)
	{
		if(ampire[j]>0)
			break;
	}
	find(ampire[j]);
	display_one(hang,lie+k,ppp);k++;j++;
	for(;j<5;j++)
	{	
		find(ampire[j]);
		display_one(hang,lie+k,ppp);k++;
		if(j==3)
		{
			display_one(hang,lie+k,dian);k++;
		}			
	}
	display(hang,lie+(k-2)/2,mm);
}
//hang=0246显示位置	 lie0-15,hang0-3	mm符号16x16
void disp_num2(uchar hang,uchar lie,float b,uchar *mm)//显示数字,小数点2位
{	
	unsigned long i=0;
	uchar j;
	uchar k=0;
	uchar ampire[]={0,0,0,0,0,0};
	if(b<0)//显示符号
	{
		i=-b*100;
		display_one(hang,lie,fuhao);
		k++;
	}
	else
		i=b*100;
	ampire[0]=i/100000;
	ampire[1]=i%100000/10000;
	ampire[2]=i%10000/1000;
	ampire[3]=i%1000/100;
	ampire[4]=i%100/10;
	ampire[5]=i%10;
	for(j=0;j<5;j++)
	{
		if(ampire[j]>0)
			break;
	}
	find(ampire[j]);
	display_one(hang,lie+k,ppp);k++;j++;
	for(;j<6;j++)
	{	
		find(ampire[j]);
		if(j==4)
		{
			display_one(hang,lie+k,dian);k++;
		}	
		display_one(hang,lie+k,ppp);k++;
	}
	display(hang,lie+(k-2)/2,mm);
}

资料借鉴于此纷传

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值