1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標題:
求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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1