pic单片机,键盘控制,休眠唤醒后,五分钟内无任何 *** 作,则又进入休眠状态,程序怎么写啊

pic单片机,键盘控制,休眠唤醒后,五分钟内无任何 *** 作,则又进入休眠状态,程序怎么写啊,第1张

你可以启动一个定时器,如每隔一定时间中断,如100ms中断一次,用一个寄存器如TIME来累计中断的次数,显然5分钟需中断3000次。

每次按键中断,程序让TIME清0。因此,只有在5分钟内都没按键,TIME才有可能达到3000。只有当TIME值大于3000时才让单片机进入休眠状态,即在定时器中断时,如果TIME的值超过3000就进入休眠。

1:第一个问号:是; 第二个问号:不一定;

2:一些C30有多种类型版本,你说的30C和36可能不是指同一种类型。

3:没破解的编译器过期就不能编译程序了。想用就需要重装(貌似它会在系统内记录的,所以应该是重装 *** 作系统才行)。

4:肯定不可靠。我有过编译经历,破解的编译出来的在逻辑上就会有问题。但这不影响普通学生入门者做设计。如果你是做工业、航天领域设计的,你的领导也不会让你用破解版或者未注册版。所以现在很多单位宁愿用汇编来编译程序。

PICC有支持 PIC10/12/16/18/24/32系列单片机 的C编译器。同时也支持dsPIC30/33 系列DSC芯片的C编译器

#include<pich>//矩阵键盘与数码管:当s1按下时6个显示全0,当s2按下时6个显示全1,当s16按下时6个显示全F

#define uchar unsigned char//宏定义

#define uint unsigned int

__CONFIG(0x3b31);//设置配置位

const uchar table[]={0x3f,0x06,0x5b,0x4f,//注意code是用在51单片机中的程序储存器中,const是一个常量,pic和51的单片机也可以共用的常量,但要写在前头

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0x20};//数码管数字表从0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,无显示

uchar key_num;//先定义一个变量为RB口低4位的检测

void delay(uint x);//声明

void init();

void scan();

void didi(uchar);

void disp();//在这里用的是静态显示全部管是一样的,所以不用加动态扫描时的变量

void main()

{

init();//调用初始化

while(1)//因为要不断地循环扫描键盘检测是否按下所以要进行死循环

{

scan();//调用键盘扫描程序

disp();//在调用键盘扫描的同时调用数码管

}

}

void delay(uint x)//延迟函数x表示毫秒

{

uint a,b;

for(a=x;a>0;a--)

for(b=110;b>0;b--);//嵌套

}

void init()

{

TRISB=0x0f;//因为RB口的高4位RB4-RB7为输出状态,低4位RB0-RB3为输入状态

TRISD=0;//因为RD接的是数码管段选设置全为输出状态

TRISE0=0;//设置RE0蜂鸣器为输出状态

TRISA=0;//设置数码管的位选为全输出状态

RE0=0;//先设置蜂鸣器为关闭不响

PORTD=0;//设置数码管的输出先全部关闭

PORTA=0xff;//设置数码管全部打开

}

void scan()//键盘扫描程序

{

/检测最后一行RB7是否有键按下/

uchar key_tem;//定义一个松手后才有变化的变量,可不加,但按下时数码管就会变化

PORTB=0x7f;//01111111先从最高位RB7开始,又因为低4位是输入状态,所以写什么都不影响,因为是不能输出的

key_num=PORTB;//将RB端口读回来

key_num=key_num&0x0f;//与00001111比较判断如果RB7这行的s13-s16是否有键按下,如果按下则RB低4位其中一个为0,再附给回key_num,这是判断哪一列

if(key_num!=0x0f)//判定运算与之后如果不等0x0f,则有按键按下

{

delay(10);//去抖,再判断多一次

key_num=PORTB;//将RB端口读回来附给key_num

key_num=key_num&0x0f;//与00001111比较判断如果RB7这行的s13-s16是否有键按下,如果按下则RB低4位其中一个为0,再附给回key_num,这是判断哪一列

if(key_num!=0x0f)//确定不等于0x0f,有键按下但未知是哪一列

{ //////////////////////////////////////////////////////松手后才有变化,可不加

key_tem=key_num;//将key_num也同时附给tem,这样就不影响松手后才能读到key_num的附回的值了,为作松手后才有变化

didi(1);//调用蜂鸣器

while(key_tem!=0x0f)//这个是松手检测,如果不加则按下的同时数码管就会有变化

{

key_tem=PORTB;//将RB端口读回来附给key_tem

key_tem=key_tem&0x0f;//与00001111比较

}//////////////////////////////////////////////////////松手后才有变化,可不加

key_num=key_num|0x70;//和01110000运算或比较,到这里0x7f先是和0x0f与运算但未知是哪一列,再和0x70或运算判断哪一列得出了具体的按键,再附给回key_num

}

}

/检测第三行RB6是否有键按下/

else

{

PORTB=0xbf;//10111111检测第三行RB6因为低4位是输入状态,所以写什么都不影响,因为是不能输出的

key_num=PORTB;//将RB端口读回来

key_num=key_num&0x0f;//与00001111比较判断如果RB6这行的s9-s12是否有键按下,如果按下则RB低4位其中一个为0,再附给回key_num,这是判断哪一列

if(key_num!=0x0f)//判定运算与之后如果不等0x0f,则有按键按下

{

delay(10);//去抖,再判断多一次

key_num=PORTB;//将RB端口读回来附给key_num

key_num=key_num&0x0f;//与00001111比较判断如果RB6这行的s9-s12是否有键按下,如果按下则RB低4位其中一个为0,再附给回key_num,这是判断哪一列

if(key_num!=0x0f)//确定不等于0x0f,有键按下但未知是哪一列

{ //////////////////////////////////////////////////////松手后才有变化,可不加

key_tem=key_num;//将key_num也同时附给tem,这样就不影响松手后才能读到key_num的附回的值了,为作松手后才有变化

didi(1);//调用蜂鸣器

while(key_tem!=0x0f)//这个是松手检测,如果不加则按下的同时数码管就会有变化

{

key_tem=PORTB;//将RB端口读回来附给key_tem

key_tem=key_tem&0x0f;//与00001111比较

}//////////////////////////////////////////////////////松手后才有变化,可不加

key_num=key_num|0xb0;//和10110000运算或比较,到这里0xbf先是和0x0f与运算但未知是哪一列,再和0xb0或运算判断哪一列得出了具体的按键,再附给回key_num

}

}

/在第一个else里继续第二个else检测第二行RB5是否有键按下/

else

{

PORTB=0xdf;//11011111检测第二行RB5因为低4位是输入状态,所以写什么都不影响,因为是不能输出的

key_num=PORTB;//将RB端口读回来

key_num=key_num&0x0f;//与00001111比较判断如果RB5这行的s5-s8是否有键按下,如果按下则RB低4位其中一个为0,再附给回key_num,这是判断哪一列

if(key_num!=0x0f)//判定运算与之后如果不等0x0f,则有按键按下

{

delay(10);//去抖,再判断多一次

key_num=PORTB;//将RB端口读回来附给key_num

key_num=key_num&0x0f;//与00001111比较判断如果RB5这行的s5-s8是否有键按下,如果按下则RB低4位其中一个为0,再附给回key_num,这是判断哪一列

if(key_num!=0x0f)//确定不等于0x0f,有键按下但未知是哪一列

{ //////////////////////////////////////////////////////松手后才有变化,可不加

key_tem=key_num;//将key_num也同时附给tem,这样就不影响松手后才能读到key_num的附回的值了,为作松手后才有变化

didi(1);//调用蜂鸣器

while(key_tem!=0x0f)//这个是松手检测,如果不加则按下的同时数码管就会有变化

{

key_tem=PORTB;//将RB端口读回来附给key_tem

key_tem=key_tem&0x0f;//与00001111比较

}//////////////////////////////////////////////////////松手后才有变化,可不加

key_num=key_num|0xd0;//和11010000运算或比较,到这里0xdf先是和0x0f与运算但未知是哪一列,再和0xd0或运算判断哪一列得出了具体的按键,再附给回key_num

}

}

/在第二个else里继续第三个else检测第一行RB4是否有键按下/

else

{

PORTB=0xef;//11101111检测第一行RB4因为低4位是输入状态,所以写什么都不影响,因为是不能输出的

key_num=PORTB;//将RB端口读回来

key_num=key_num&0x0f;//与00001111比较判断如果RB4这行的s1-s4是否有键按下,如果按下则RB低4位其中一个为0,再附给回key_num,这是判断哪一列

if(key_num!=0x0f)//判定运算与之后如果不等0x0f,则有按键按下

{

delay(10);//去抖,再判断多一次

key_num=PORTB;//将RB端口读回来附给key_num

key_num=key_num&0x0f;//与00001111比较判断如果RB4这行的s1-s4是否有键按下,如果按下则RB低4位其中一个为0,再附给回key_num,这是判断哪一列

if(key_num!=0x0f)//确定不等于0x0f,有键按下但未知是哪一列

{ //////////////////////////////////////////////////////松手后才有变化,可不加

key_tem=key_num;//将key_num也同时附给tem,这样就不影响松手后才能读到key_num的附回的值了,为作松手后才有变化

didi(1);//调用蜂鸣器

while(key_tem!=0x0f)//这个是松手检测,如果不加则按下的同时数码管就会有变化

{

key_tem=PORTB;//将RB端口读回来附给key_tem

key_tem=key_tem&0x0f;//与00001111比较

}//////////////////////////////////////////////////////松手后才有变化,可不加

key_num=key_num|0xe0;//和11100000运算或比较,到这里0xef先是和0x0f与运算但未知是哪一列,再和0xe0或运算判断哪一列得出了具体的按键,再附给回key_num

}

}

}

}

}

}

void didi(uchar num)//蜂鸣器程序,num表示响多少声

{

uchar di_num;

for(di_num=num;di_num>0;di_num--)

{

RE0=1;//蜂鸣器响

delay(100);//响100ms

RE0=0;//蜂鸣器关闭

delay(50);//关闭50ms

}

}

void disp()//数码管

{

switch(key_num)//多选择语句,这前提要知道它的值再相应输出相对应的数

{

case 0xee:PORTD=table[0];break;//0xee(01110111)表示第一个键按下时,段选显示0字,位选在初始化中已打开

case 0xed:PORTD=table[1];break;

case 0xeb:PORTD=table[2];break;

case 0xe7:PORTD=table[3];break;

case 0xde:PORTD=table[4];break;

case 0xdd:PORTD=table[5];break;

case 0xd7:PORTD=table[6];break;

case 0xbe:PORTD=table[7];break;

case 0xbd:PORTD=table[8];break;

case 0xbb:PORTD=table[10];break;

case 0xb7:PORTD=table[11];break;

case 0x7e:PORTD=table[12];break;

case 0x7d:PORTD=table[13];break;

case 0x7b:PORTD=table[14];break;

case 0x77:PORTD=table[15];break;

}

}

#include<reg51h>

unsigned char a,flag;

unsigned int i;

void init_serial();

void init_serial() //初始化串口

{

TMOD=0x20;//设置定时器1为工作方式2

TH1=0xfd;

TL1=0xfd;

TR1=1;

REN=1;

SM0=0;

SM1=1;

EA=1;

ES=1;

}

void serial() interrupt 4

{

RI=0;

a=SBUF;

flag=1;

}

void main()

{

init_serial();

i=100;

flag=0;

while(1)

{

if(flag==1) //接受串口信息

{

ES=0;

P0=0x00;

while(i--);

P0=0xff;

SBUF=a;

flag=0;

while(!TI);

TI=0;

i=100;

ES=1;

}

}

}

这个是我自己写的,单片机与计算机串口通信。计算机向单片机发送一个数据 然后单片机接受到后又把那个数据返回计算机。 欢迎提问……

在PIC系列单片机中,只有PIC18系列和PIC16F87X系列的单片机才有IAP功能,才能够使用BootLoader功能。下面只介绍PIC18的BootLoader,PIC16F87X的BootLoader与它类似。

1 BootLoader程序的工作原理

BootLoader是一段引导程序,在单片机上电/复位后在用户程序之前先运行。运行后判断当前是否需要进入升级状态。如果不需要升级,就直接运行 Flash中原有的程序;如果需要升级,首先擦除旧的程序,然后从串口接收用户程序,同时写入Flash中。接收数据时,需要进行校验,保证接收到的数据是正确的,避免将错误的程序写入到芯片中。

PIC18单片机只有一块Flash,可以在Flash的任何位置擦写(甚至可以将BootLoader自身擦除);而51单片机一般都是两块Flash,只能够从一块Flash上擦写另一块Flash,而不能擦写自身。

BootLoader程序原则上是可以放在整个程序空间中的任何位置的,但是为了简单方便、具有通用性和尽量减少对用户程序的影响,使用了从0x00开始的一段程序空间。

BootLoader程序可以多种方式获取数据,包括串口、并口、I2C、SPI、USB等;但是从实际使用来看,使用串口无疑是最方便的。

为了使得用户程序可以获得最大的程序空间,就需要BootLoader程序尽可能的简短。在这里,Microchip和HI-TECH都将 BootLoader程序设计为小于200H个字节(100H个字)。使用0x00~0x1FF这个区域还有一个重要原因是,这个地址的空间有特殊的写保护特性。

PIC18单片机虽然有多个中断源,但只支持两级中断,有两个中断向量,分别位于0x08和0x18;而 BootLoader程序占用了0x00~0x1FF的空间,这意味着需要重新定位中断向量,使新的中断向量指向用户的中断程序,这样才能保证正常运行用户程序的中断程序。

C语言编程

__语言中,输出名字最简单的方法就是通过标准输出函数printf进行输出。

_ü_rintf函数进行输出就是将汉字字符当做普通字符来进行处理的。

在indexhtml中插入pic,正确的写法如下:

物理路径:假如你的在D盘的images文件下,文件名称为tupianjpeg的话用下面的格式。

相对路径:如果是网站的话,则为下面的:

这个为html文件和images同一目录的写法:

这个为和html文件同一目录的写法:

这种为html所在文件夹和images文件夹处同一目录也是网站的主目录下的写法。

扩展资料:

超文本标记语言,一种标准通用标记语言的应用。“超文本”意味着一个页面可以包含图像、链接,甚至非文本元素,如音乐和程序。

HTML的结构包括一个“标题”部分(英文:标题),它提供了网页的信息,以及一个“正文”部分(英文:正文),它提供了网页的具体内容。

语言概述:

>

以上就是关于pic单片机,键盘控制,休眠唤醒后,五分钟内无任何 *** 作,则又进入休眠状态,程序怎么写啊全部的内容,包括:pic单片机,键盘控制,休眠唤醒后,五分钟内无任何 *** 作,则又进入休眠状态,程序怎么写啊、关于PIC单片机C语言编程、有pic写的矩阵键盘与数码管和单片机C语言的程序吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10082721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存