实例说明:
假设时钟周期为4MHZ,每隔50MS点亮LED,每隔50MS灭掉LED。这样的程序要如何做到呢。
这50ms如何做到
1,得到指令周期
4MHz/4=1MHz
1/1MHz=00000001s=1us
2,得到预分频
定时器定时的最大时间要超过这50mS,所以预分频器要选择256
预分频X256=最大的定时时间。256X256=65536us=65536ms 大于50ms
3, 计算定时器初始值
(定时器最大值+1)- (定时时间/预分频)=定时器的初始值。
255+1=256
50000/256=1953125
256-1953125=606875 四舍五入 定时器初始值为61
设置相关的寄存器。
OPTION_REG寄存器中我们一般需要设置三处。
PS<2:0>设置用来设置预分频预分频范围从2 ~256
PSA设置成0 讲预分频器分配给Timer0模块
TMR0CS设置成0 内部指令周期时钟。
实例程序:
/开发环境 MPLAB X IDE 型号PIC16LF1823/
#include<pich>
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF
&BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);
__CONFIG(PLLEN_OFF&LVP_OFF) ;
#define LED LATA5/也可用 #define LED RA5,只是PIC16LF1823 输出电平的时候,直接控制LATA5执行速度更快,因为传给RA5的数据最终也是传给LATA5才执行的/
void init_fosc(void)
{
OSCCON= 0x68;//时钟设置为4MHz
}
void init_gpio(void)
{
PORTA = 0;
LATA = 0;
ANSELA = 0;
TRISAbitsTRISA5=0; //RA5口设置成输出 用来控制LED
}
void init_timer0(void)
{
OPTION_REG=0x87; //预分频为256
}
int main(int argc, char argv)
{
init_fosc();
init_gpio();
init_timer0();
TMR0IF=0;//清除TMR0中断标志位
TMR0=61;//设置中断初始值61
while(1)
{
if(TMR0IF==1)//定时时间到了吗??
{
LED = ~LED;//改变LED的状态
TMR0IF=0;//清除TMR0中断标志位
TMR0=61;//设置中断初始值61为下次50ms定时做准备
}
}
}
楼上的朋友的方法可以实现效果,但是个人认为将其中的PictureBox隐藏并不是很好的解决方案。我的方式是通过点击Pic2的时候,刷新Pic1,致使引发Pic1的Paint事件。然后通过一个Bool变量来判断是否需要进行绘制来达到效果。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
PictureBox picDraw1 = new PictureBox();
PictureBox picDraw2 = new PictureBox();
private void Form1_Load(object sender, EventArgs e)
{
picDraw1Size=new SystemDrawingSize(100,100);
picDraw1BackColor=ColorYellow;
picDraw1Paint += new PaintEventHandler(picDraw1_Paint);
picDraw2Size=new SystemDrawingSize(100,100);
picDraw2BackColor=ColorGray;
picDraw2Location = new Point(100, 0);
picDraw2Click += new EventHandler(picDraw2_Click);
thisControlsAdd(picDraw1);
thisControlsAdd(picDraw2);
}
bool isPic2Send = false;
void picDraw1_Paint(object sender, PaintEventArgs e)
{
if (isPic2Send)
{
eGraphicsDrawEllipse(new Pen(ColorGreen, 2), 10, 10, 30, 30);
}
}
void picDraw2_Click(object sender, EventArgs e)
{
isPic2Send = true;
picDraw1Refresh();
}
}
'先下载按键精灵第六版,主要是要引用按键精灵QMDispatchdll 里的函数
'解压缩后把目录下所有的dll档 复制到 C:\WINNT\system32下面
'开始 执行 输入regsvr32 C:\WINNT\system32\QMDispatchdll
'然后到vb里面 专案>设定引用项目
'打以下程式码,把要找的图 放在d:\ 档名用iconbmp
'找到会秀出座标,完成
'我在vb6 sp6下执行成功 没问题
Option Explicit
Private Declare Function FindPic Lib "QMDispatch" () As Long
Private Sub Command1_Click()
Dim pos As Long
Dim QMDispatchObj As Object
Set QMDispatchObj = CreateObject("QMDispatchQMFunction")
'参数 左, 上, 右, 下, 寻找的路径, 相似度
pos = QMDispatchObjFindPic(0, 0, 1280, 1024, "d:\iconbmp", 09)
MsgBox Int(pos / 8192) 'X左边
MsgBox pos Mod 8192 'Y左边
End Sub
以前做过类似 应该有效 你可以到按键论坛找新的DLL
没时间尝试了
从原理上来说,导入的应当是继承BitmapData类的,
也就是说Pic是BitmapData的一个子类
构造函数参数要跟BitmapData一样参数
BitmapData允许有4个参数, 但后两个可以省略不写
前两个参数代表的宽和高
也就是说你新建的pic的宽和高应该都是1
想看看结果是不是这样的话加上这些代码:
var _pic :Bitmap = new Bitmap(pic);
addChild(_pic);
然后测试,舞台左上角应该会显示一些东西的
以上就是关于pic单片机timer0怎么用啊全部的内容,包括:pic单片机timer0怎么用啊、C#中两个picturebox控件,完全重合,上面的透明,怎么能实现单击上面某处的可以在下面的相应位置画圆啊、vb里如何调用VBS findpic的例子 高手请教啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)