سلام با میکروی stm32f103rcکار می کنم
برای LCD کاراکتری از توابع آماده ای که قبلا ECA برای هدر برد lpc1768 ارائه داده بود استفاده کردم
فقط بخش lcd_define_char کار نمی کنه
وقتی این تابع رو فراخوانی می کنم فقط مکان نمای LCD جابه جا میشه و هیچ چیزی نمایش نمیده
void lcd_define_char(const char *pc,char char_code)
{
unsigned char a , i;
//a = ((char_code<<3)|0x80);// & 0xff;
a=64;
//lcd_command(0x80);
clcd_Delay();
for (i = 0; i < 8 ;i++)
{
lcd_command(a++);
clcd_Delay();
lcd_putchar(pc[i]);
clcd_Delay();
//clcd_Delay();
}
}
به نظرتون اشکال از کجاست ؟؟
کل هدر رو هم می گذارم
دلیل: ادغام دو پست برای جلوگیری از اسپم
#include "stm32f10x.h"
#include "LCD.h"
#define F_CPU 72000000
#define clcd_minDelay() cwait(F_CPU/48000)
#define clcd_Delay() cwait(F_CPU/4800)
#define clcd_maxDelay() cwait(F_CPU/72)
//================================================== ==========================
void cwait (volatile int t) {
for (;t; t--);
}
// ================================================== ==========================
void setD4567(char val)
{
GPIOB->ODR &=~0XF000;
if (val & 0x80)
GPIOB->ODR |=(1<<12);
if (val & 0x40)
GPIOB->ODR |=(1<<13);
if (val & 0x20)
GPIOB->ODR |=(1<<14);
if (val & 0x10)
GPIOB->ODR |=(1<<15);
}
// ================================================== ==========================
void lcd_putchar(char ch)
{
GPIOC->ODR |=(1<<8); //LCD_RS
setD4567(ch);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_minDelay();
setD4567(ch<<4);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
}
// ================================================== ==========================
void lcd_command(char cmd) //Sends Command to LCD
{
GPIOC->ODR &=~(1<<8); //LCD_RS
setD4567(cmd);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_minDelay();
setD4567(cmd<<4);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
}
// ================================================== ==========================
void lcd_init()
{
GPIOB->CRH &=~0XFFFF0000;
GPIOB->CRH |=0X11110000;
GPIOC->CRL &=~0XFF000000;
GPIOC->CRL |=0X11000000;
GPIOC->CRH &=~0X0000000F;
GPIOC->CRH |=0X00000001;
GPIOC->ODR &=~(1<<7); //LCD_RW
clcd_Delay();
setD4567(0);
setD4567((1<<5)|(1<<4));
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
setD4567((1<<5)|(1<<4));
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
setD4567((1<<5)|(1<<4));
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
setD4567(1<<5);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
//
setD4567(0);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
//
setD4567(1<<7);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
//
setD4567(0);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
//
setD4567(1<<4);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
//
lcd_command(0x28);
lcd_command(0x0f);
clcd_Delay();
}
//================================================== ==========================
void lcd_gotoxy(char y, char x) //Cursor to X Y position
{
char DDRAMAddr;
x=x;
switch(y)
{
case 0: DDRAMAddr = 0x00+x; break;
case 1: DDRAMAddr = 0x40+x; break;
case 2: DDRAMAddr = 0x14+x; break;
case 3: DDRAMAddr = 0x54+x; break;
default: DDRAMAddr = 0x00+x;
}
lcd_command(1<<7 | DDRAMAddr);
clcd_Delay();
}
// ================================================== ==========================
void lcd_define_char(const char *pc,char char_code)
{
unsigned char a , i;
//a = ((char_code<<3)|0x80);// & 0xff;
a=64;
//lcd_command(0x80);
clcd_Delay();
for (i = 0; i < 8 ;i++)
{
lcd_command(a++);
clcd_Delay();
lcd_putchar(pc[i]);
clcd_Delay();
//clcd_Delay();
}
}
//================================================== ===========================
void lcd_clear(void) //Clears LCD
{
lcd_command(0x01);
clcd_Delay();
lcd_command(0x02);
clcd_maxDelay();
}
//================================================== ===========================
void lcd_shift_left(char n) //Scrol n of characters Right
{
char i;
for (i = 0 ; i < n ; i++)
{
lcd_command(0x1E);
clcd_Delay();
}
}
//================================================== ===========================
void lcd_shift_right(char n) //Scrol n of characters Left
{
char q;
for (q = 0 ;q < n ; q++)
{
lcd_command(0x18);
clcd_Delay();
}
}
//================================================== ==========================
void lcd_puts(int num)
{
int i1,j1;
int p,f=0;
char ch[5];
for(i1=0;i1<5;i1++)
{
p=1;
for(j1=4-i1;j1>0;j1--)
p = p*10;
ch[i1] = (num/p);
if (num>=p && !f){
f=1;
}
num =num - ch[i1] *p ;
ch[i1] = ch[i1] +48;
if(f) lcd_putchar(ch[i1]);
}
}
// ================================================== ==========================
void lcd_putsf(char* data) //Outputs string to LCD
{
char *p;
p = data;
if (!p)
return;
for(; *p ; )
{
lcd_putchar(*p);
p++;
}
}
//================================================== ===========================
void Display_off(void)
{
lcd_command(0x08);
clcd_Delay();
}
//================================================== ===========================
void Display_on(void)
{
lcd_command(0x0C);
clcd_Delay();
}
//================================================== ===========================
void cursor_off(void)
{
lcd_command(0x0C);
clcd_Delay();
}
//================================================== ===========================
void cursor_on(void)
{
lcd_command(0x0E);
clcd_Delay();
}
//================================================== ===========================
void cursor_blink(void)
{
lcd_command(0x0F);
clcd_Delay();
}
برای LCD کاراکتری از توابع آماده ای که قبلا ECA برای هدر برد lpc1768 ارائه داده بود استفاده کردم
فقط بخش lcd_define_char کار نمی کنه
وقتی این تابع رو فراخوانی می کنم فقط مکان نمای LCD جابه جا میشه و هیچ چیزی نمایش نمیده
void lcd_define_char(const char *pc,char char_code)
{
unsigned char a , i;
//a = ((char_code<<3)|0x80);// & 0xff;
a=64;
//lcd_command(0x80);
clcd_Delay();
for (i = 0; i < 8 ;i++)
{
lcd_command(a++);
clcd_Delay();
lcd_putchar(pc[i]);
clcd_Delay();
//clcd_Delay();
}
}
به نظرتون اشکال از کجاست ؟؟
کل هدر رو هم می گذارم
دلیل: ادغام دو پست برای جلوگیری از اسپم
#include "stm32f10x.h"
#include "LCD.h"
#define F_CPU 72000000
#define clcd_minDelay() cwait(F_CPU/48000)
#define clcd_Delay() cwait(F_CPU/4800)
#define clcd_maxDelay() cwait(F_CPU/72)
//================================================== ==========================
void cwait (volatile int t) {
for (;t; t--);
}
// ================================================== ==========================
void setD4567(char val)
{
GPIOB->ODR &=~0XF000;
if (val & 0x80)
GPIOB->ODR |=(1<<12);
if (val & 0x40)
GPIOB->ODR |=(1<<13);
if (val & 0x20)
GPIOB->ODR |=(1<<14);
if (val & 0x10)
GPIOB->ODR |=(1<<15);
}
// ================================================== ==========================
void lcd_putchar(char ch)
{
GPIOC->ODR |=(1<<8); //LCD_RS
setD4567(ch);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_minDelay();
setD4567(ch<<4);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
}
// ================================================== ==========================
void lcd_command(char cmd) //Sends Command to LCD
{
GPIOC->ODR &=~(1<<8); //LCD_RS
setD4567(cmd);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_minDelay();
setD4567(cmd<<4);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
}
// ================================================== ==========================
void lcd_init()
{
GPIOB->CRH &=~0XFFFF0000;
GPIOB->CRH |=0X11110000;
GPIOC->CRL &=~0XFF000000;
GPIOC->CRL |=0X11000000;
GPIOC->CRH &=~0X0000000F;
GPIOC->CRH |=0X00000001;
GPIOC->ODR &=~(1<<7); //LCD_RW
clcd_Delay();
setD4567(0);
setD4567((1<<5)|(1<<4));
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
setD4567((1<<5)|(1<<4));
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
setD4567((1<<5)|(1<<4));
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
setD4567(1<<5);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
//
setD4567(0);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
//
setD4567(1<<7);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
//
setD4567(0);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
//
setD4567(1<<4);
GPIOC->ODR |=(1<<6); //LCD_EN
clcd_minDelay();
GPIOC->ODR &=~(1<<6); //LCD_EN
clcd_Delay();
//
lcd_command(0x28);
lcd_command(0x0f);
clcd_Delay();
}
//================================================== ==========================
void lcd_gotoxy(char y, char x) //Cursor to X Y position
{
char DDRAMAddr;
x=x;
switch(y)
{
case 0: DDRAMAddr = 0x00+x; break;
case 1: DDRAMAddr = 0x40+x; break;
case 2: DDRAMAddr = 0x14+x; break;
case 3: DDRAMAddr = 0x54+x; break;
default: DDRAMAddr = 0x00+x;
}
lcd_command(1<<7 | DDRAMAddr);
clcd_Delay();
}
// ================================================== ==========================
void lcd_define_char(const char *pc,char char_code)
{
unsigned char a , i;
//a = ((char_code<<3)|0x80);// & 0xff;
a=64;
//lcd_command(0x80);
clcd_Delay();
for (i = 0; i < 8 ;i++)
{
lcd_command(a++);
clcd_Delay();
lcd_putchar(pc[i]);
clcd_Delay();
//clcd_Delay();
}
}
//================================================== ===========================
void lcd_clear(void) //Clears LCD
{
lcd_command(0x01);
clcd_Delay();
lcd_command(0x02);
clcd_maxDelay();
}
//================================================== ===========================
void lcd_shift_left(char n) //Scrol n of characters Right
{
char i;
for (i = 0 ; i < n ; i++)
{
lcd_command(0x1E);
clcd_Delay();
}
}
//================================================== ===========================
void lcd_shift_right(char n) //Scrol n of characters Left
{
char q;
for (q = 0 ;q < n ; q++)
{
lcd_command(0x18);
clcd_Delay();
}
}
//================================================== ==========================
void lcd_puts(int num)
{
int i1,j1;
int p,f=0;
char ch[5];
for(i1=0;i1<5;i1++)
{
p=1;
for(j1=4-i1;j1>0;j1--)
p = p*10;
ch[i1] = (num/p);
if (num>=p && !f){
f=1;
}
num =num - ch[i1] *p ;
ch[i1] = ch[i1] +48;
if(f) lcd_putchar(ch[i1]);
}
}
// ================================================== ==========================
void lcd_putsf(char* data) //Outputs string to LCD
{
char *p;
p = data;
if (!p)
return;
for(; *p ; )
{
lcd_putchar(*p);
p++;
}
}
//================================================== ===========================
void Display_off(void)
{
lcd_command(0x08);
clcd_Delay();
}
//================================================== ===========================
void Display_on(void)
{
lcd_command(0x0C);
clcd_Delay();
}
//================================================== ===========================
void cursor_off(void)
{
lcd_command(0x0C);
clcd_Delay();
}
//================================================== ===========================
void cursor_on(void)
{
lcd_command(0x0E);
clcd_Delay();
}
//================================================== ===========================
void cursor_blink(void)
{
lcd_command(0x0F);
clcd_Delay();
}
دیدگاه