标题:
求pic16f887芯片的应用实例
[打印本页]
作者:
fzuxxx
时间:
2018-8-9 16:10
标题:
求pic16f887芯片的应用实例
如题,需要用pic16f887为芯片来做混合式交流接触器,实现交流接触器的无弧分断,主要是软件程序部分,哪位大佬有这个案例或者类似的例子还请不吝分享,必有重谢
作者:
angmall
时间:
2018-8-11 10:50
#include <pic.h> //调用头文件,可以去PICC软件下去查找PIC16F88X单片机的头文件
__CONFIG(XT&WDTDIS&LVPDIS&BORDIS); //定义配置字,晶振类型:XT,关闭开门狗,禁止低电压编程,禁止欠压复位
#define RSPIN RB5 //Data or Instrument Select
#define RWPIN RB4 //Write or Read
#define EPIN RB3 //6800 mode Enable single
unsigned int a;
unsigned int b;
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
{
for(j=0;j<10;j++);
}
}
void lcd_wait_busy(void)
{
TRISD7=1; //为读状态做准备,把RD7设为输入
RSPIN=0; //选择指令寄存器
RWPIN=1; //选择读
EPIN=1; //使能线电平变化
while(RD7==1); //读忙状态,不忙时退出
EPIN=0; //恢复使能线电平
TRISD7=0; //把RD7设置为输出
}
void lcd_write_com(unsigned char combuf)
{
RSPIN=0; //选择指令寄存器
RWPIN=0; //选择写
PORTD=combuf; //把命令字送入RD
EPIN=1; //使能线电平变化,命令送入1602的8位数据口
asm("NOP"); //来一个空操作,以延时片刻
EPIN=0; //恢复使能线电平
}
void lcd_write_com_busy(unsigned char combuf)
{
lcd_wait_busy(); //调用忙检测函数
lcd_write_com(combuf); //调用写命令函数
}
void lcd_write_data(unsigned char databuf)
{
lcd_wait_busy(); //调用忙检测函数
RSPIN=1; //选择数据寄存器
RWPIN=0; //选择写
PORTD=databuf; //把数据字送入RD口
EPIN=1; //使能线电平变化,命令送入1602的8位数据口
asm("NOP");
EPIN=0; //恢复使能线电平
}
void lcd_write_address(unsigned char x,unsigned char y)
{
x&=0x0f; //列地址限制在0-15
y&=0x01; //行地址限制在0-1
if(y==0x00)
lcd_write_com_busy(x|0x80); //第一行的列地址写入
else
lcd_write_com_busy((x+0x40)|0x80); //第二行的列地址写入
}
void lcdreset(void)
{
delay(150);
lcd_write_com(0x38);
delay(50);
lcd_write_com(0x38);
delay(50);
lcd_write_com(0x38);
lcd_write_com_busy(0x38); //8位数据,双列,5*7字形
lcd_write_com_busy(0x08); //显示功能关,无光标
lcd_write_com_busy(0x01); //清屏指令
lcd_write_com_busy(0x06); //写入新的数据后,光标右移,显示屏不移动
lcd_write_com_busy(0x0c); //显示功能开,无光标,
}
void lcd_write_char(unsigned char x,unsigned char y,unsigned char buf)
{
lcd_write_address(x,y); //写入地址
lcd_write_data(buf); //写入显示数据
}
void timer0init(void)
{
T0CS=0; //TMR0工作于定时器方式
PSA=1; //TMR0不分频
T0IF=0; //清除TMR0中断标志
T0IE=1; //TMR0中断允许
TMR0=0x13; //赋初值,以便TMR0每250US中断一次
GIE=1;
}
void interrupt ISR(void)
{
if(T0IF==1) //250us
{
TMR0=0x13;
T0IF=0;
if(++a>399) //计数400次后,为0.1秒
{
a=0;
if(++b>9999) a=0; //将显示数字限定在0-9999中
}
}
}
void main(void)
{
ANSEL=0X00; //所有IO为数字IO
ANSELH=0X00; //所有IO为数字IO
OSCCON=0X08; //系统时钟由CONFIG决定
TRISB=0B11000111; //RB3-5设置为输出
TRISD=0B00000000; //RD设置为输出
lcdreset(); //复位1602
timer0init();
while(1)
{
lcd_write_char(0,0,0x30+b/1000); //显示数据百位
lcd_write_char(1,0,0x30+(b%1000)/100); //显示数据十位
lcd_write_char(2,0,0x30+(b%100)/10); //显示数据个位
lcd_write_char(3,0,'.'); //显示"."
lcd_write_char(4,0,0x30+b%10); //显示数据小数
lcd_write_char(5,0,'S'); //显示"S"
}
}
复制代码
作者:
fzuxxx
时间:
2018-8-11 18:27
多谢大神 !
作者:
nokiagx
时间:
2020-4-12 20:22
我也用来测试一下 这程序没显示任何字符
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1