2024年6月15日土曜日

後閑メモ、timer1 gate toggle, aqm0802 (adruino,12f1822)

 サポートページ:改訂新版 8ピンPICマイコンの使い方がよくわかる本:|技術評論社 (gihyo.jp)

cf https://akizukidenshi.com/catalog/g/g113837/ timer1 gate toggle mode 

https://maicommon.ciao.jp/ss/Arduino_g/LCD_I2C/index.htm でうごいた

contrastは0802用に0x20とすべし vddは3.3vですべし

http://jh7ubc.web.fc2.com/pic/PIC12F1822/PIC12F1822_AQM0802A.htmlを参考に

以下のように改変

#include <stdio.h>

#include <stdlib.h>

#include <xc.h>

#include <pic12f1822.h>

// CONFIG1

#pragma config FOSC = INTOSC

#pragma config WDTE = OFF

#pragma config PWRTE = ON

#pragma config MCLRE = OFF

#pragma config CP = OFF

#pragma config CPD = OFF

#pragma config BOREN = ON

#pragma config CLKOUTEN = OFF

#pragma config IESO = OFF

#pragma config FCMEN = OFF

// CONFIG2

#pragma config WRT = OFF

#pragma config PLLEN = ON

#pragma config STVREN = ON

#pragma config BORV = HI

#pragma config LVP = ON // mplab-snap用に必須

#define _XTAL_FREQ 32000000

#define LCD_addr 0x7C  //3E+0

/* I2C 初期化*/

void I2C_init(){

SSP1CON1 = 0x28; //SSPEN = 1,I2C Master Mode

SSP1STATbits.SMP = 1; //標準速度モード(100KHz)

SSP1ADD = 0x4F; //Fosc/(4*Clock)-1 Clock=100kHz,Fosc=32MHz

}


/* スタートコンディション */

void I2C_start(){

SEN = 1;

while(SEN);

}


/* ストップコンディション */

void I2C_stop(){

SSP1IF = 0;

PEN = 1;

while(PEN);

SSP1IF = 0;

}


/* I2Cに1byte送信 */

void I2C_write(unsigned char dat){

SSP1IF = 0;

SSP1BUF = dat;

while(!SSP1IF);

}


/* write command */

void LCD_cmd(unsigned char cmd){

I2C_start(); //start condition

I2C_write(LCD_addr); //send slave address

I2C_write(0x00); //send control byte

I2C_write(cmd); //send command

I2C_stop(); //stop condition

}


/* write charactor */

void LCD_char(unsigned char dat){

//unsigned char ackn; なくても動いたジャンクコード

I2C_start(); //start condition

I2C_write(LCD_addr); //send slave address

I2C_write(0x40); //send control byte

I2C_write(dat); //send data

I2C_stop(); //stop condition

}


/* LCD 初期化 */

void LCD_init(){

__delay_ms(40); //40ms wait

LCD_cmd(0x38); //8bit,2line

LCD_cmd(0x39); //IS=1 : extention mode set

LCD_cmd(0x14); //Internal OSC Frequency

LCD_cmd(0x70); //Contrast set

LCD_cmd(0x56); //Power/ICON/Contrast Control

LCD_cmd(0x6C); //Follower control

__delay_ms(200);//200ms wait

LCD_cmd(0x38); //IS=0 : extention mode cancel

LCD_cmd(0x0C); //Display ON

LCD_cmd(0x01); //Clear Display

__delay_ms(2); //wait more than 1.08ms

}


/* Clear Display */

void LCD_clear(){

LCD_cmd(0x01);

__delay_ms(1);

__delay_us(80);

}


/* Return Home `*/

void LCD_home(){

LCD_cmd(0x02);

__delay_ms(1);

__delay_us(80);

}


/* Cursor 2line top */

void LCD_2line(){

LCD_cmd(0xC0);

}


/* write 1 charactor to LCD */

void putC(unsigned char ch){

LCD_char(ch);

} // 実際には使われないジャンクコードっぽい部分


/* write string */

void putstr(const unsigned char *s){

while(*s){

LCD_char(*s++);

}

}


void main() {

OSCCON = 0b01110000 ; // 内部クロック8MHz

ANSELA = 0b00000000 ; // アナログは使用しない

TRISA = 0b00001110 ; // RA1,RA2,RA3は入力、他は出力

PORTA = 0b00000000 ; // 出力ピンの初期化


I2C_init();

LCD_init();

putstr("JH7UBC");

unsigned char count = 0;

char STR[10]; // 10もいらんかもしれんが。。。

while(1){

LCD_2line();

sprintf(STR, "%3d",count);  // これでcountからputstrに渡す文字列をつくる!

putstr(STR);

count++;

__delay_ms(500);

}

}


0 件のコメント:

コメントを投稿